sql注入-测试和其他
1、测试步骤
首先要确定业务的sql语句类型,一般是对select语句进行测试,安全。
1.1 数值测试
如果参数是数值类型,那么有可能是数值型参数,可以比较id=1与id=2-1类似的测试,比较两者的响应体部是否相同。
如果相同,那么猜测存在sql注入,且为数值型。
1.2 空格测试
对参数添加多个空格,如果响应与未带空格时测试不变,则说明两者的参数对于sql语句是意义一致的,比如均查询不存在,或者是数值型参数。
1.3 利用单双引号测试
对参数添加单引号、双引号进行测试。
如果参数是数值型,那么添加引号会异常;如果参数是字符型,那么添加包围相同的引号会异常。
- 综合来说,如果响应检查到sql异常被输出,那么判定存在sql注入
- 如果参数必然是字符型,那么单双引号的测试相同则不存在sql注入
1.3 利用注释测试
- 注释掉参数的引号后,如果响应检查到sql异常被输出,那么判定存在sql注入
- 注释掉引号的同时补足引号,则不出现sql异常,进一步说明存在sql注入
- 如果在注释后的部分添加,不影响响应输出,说明判定存在sql注入
1.3 利用order by测试
- 根据oder by 1,2,3的不同,如果只有一个正常查询,而其他发送sql异常,或者说响应相同,那么判定存在sql注入
1.4 limit测试
limit从0开始递增测试,如果响应体部长度也递增,说明有效,存在sql注入
1.6 布尔测试
测试and 0 和and 1,如果前者的响应长度小于后者,说明有可能存在sql注入
1.7 时间测试
where条件中,基于时间测试,程序可以更准确的进行判断
1.8 where错误测试
2、利用补充
文件读写
命令执行
3、绕过技巧
(1)内联注释充当空格作为间隔符,以及基于内联注释包含关键字绕过防火墙
(2)大小写混杂和双写绕过
(3)两个注入点各使用一个引号
(4)编码
(5)灵活使用圆括号
select(version());
(6)/**/注释或者内联注释
select/**/version();
select/*!version()*/;
- 一方面可能防火墙将/*和*/之间的作为注释不检查,另一方面将多个关键字以及关键字与()分隔
(7)使用逻辑字符与逻辑关键字替换
select ... where ...&&version();
(8)逻辑关键字绕过
如果对某一逻辑关键字过滤,可以使用字符或者其他关键字绕过,也可以使用if等函数绕过