babysqli 注入题,打开一个简易的登录框,觉得出题人好像不是个完美主义者,登录框做的很烂,但是我是个弟弟,还是要说出题人牛逼
好了,废话不多说,我们填写账号密码,先用
username:admin
password:admin
告诉我,wrong pass!
然后我们再试试万能密码,
username:admin' or '1'='1'#
password:随意填
然后告诉我do not hack me!
我索性看了下源码,里面有一段数据被注释了,看似base32,等我们base32解码出来,再来个base64解码
select * from user where username = '$name'
得到了这个sql语句,意思是我们需要传入个name变量,然后我们构造payload,因为我们需要post传参,于是我们采用bp抓包
我们如果给name的值不是admin,然后提示错误,wrong user!
传admin,提示wrong pass!
我们把admin 放到第二个位置 不报错
这样我们就得到第二个字段就是我们的username字段
紧接着下一步,我也不太会于是就看了大佬博客说有md5提示,我也没发现,
于是盲从后台登录逻辑
<?php$row; $pass=$_POST['pw']; if($row['username']==’admin’){ if($row['password']==md5($pass)){ echo $flag; }else{ echo “wrong pass!”; }} else{ echo “wrong user!”;}
在执行password框中的内容等于md5(框中的内容),如果相等则密码正确,于是我们构造吧
password:adc
md5(adc):225e8a3fe20e95f6cd9b9e10bfe5eb69
于是构造payload:name=1' union select 1,2,'225e8a3fe20e95f6cd9b9e10bfe5eb69'#&pw=adc
因为有md5我想到了md5不能处理数组,如果是数组则会返回NULL
构造payload:name=ad' union select 1,'admin',NULL#&pw[]=123
也可返回flag。 抓包改包就完事。
得到flag