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等函数绕过

posted @ 2023-04-16 03:18  挖洞404  阅读(220)  评论(0编辑  收藏  举报