安全测试中sql注入测试思路

版权声明: https://blog.csdn.net/Breeze_CAT/article/details/84833522

在找好需要测试的功能点之后,针对每种功能点(参数),sql注入测试一般遵循下面步骤:
1. 测试注入类型,数字型or字符型

  • 如果参数中直接包含字母,那么直接可以判断是字符型参数,如id=4a。

  • 若参数是数字通常可以考虑输入表达式来判断,如id=6,可尝试输入id=7-1或id=3*2

    • 如果返回结果和id=6相同,可以确认为数字,进行2. 逻辑判断
    • 若返回空,可进一步测试是否为字符型或是否有过滤。在参数后加单引号,如id=6’
      • 若出现了数据库报错,那么极大可能存在字符型sql注入,直接进行2.逻辑测试。
      • 如果返回空或正常,则进行4. 过滤判断

2. 测试逻辑语句

  • 以逻辑真和逻辑假共同测试,形如:
id=6' and 1=1 -- 
id=6' and '1'='1
id=6' and 1=2 --
id=6' and '1'='2
//如果是数字型注入,那么id=6'后的单引号省略
  • 根据实际情况来判断是否需要拼接语句,拼接方法也因地制宜
    • 若逻辑真返回结果和id=6结果相同,逻辑假返回空,则可以判断存在sql注入
    • 若逻辑真和逻辑加返回结果都和id=6结果相同或都为空,则进行4. 过滤判断
      • 若过滤判断成功绕过过滤,但也没有返回符合逻辑真假的结果,则不存在sql注入或进行3. 延时判断

3. 测试延时语句

  • 在一些情况下,可根据个人判断,假如一个页面的返回结果可能和参数无关,也就是说,参数的查询结果或语句报错都不会影响页面的返回的情况下,可以尝试延时注入,如id=6 and sleep(5) –
    • 若成功延时返回,则说明存在sql注入
    • 若没成功延时,则进行4. 过滤判断
      • 过滤测试若成功绕过,也没有触发延时,则不存在sql注入

4. 测试有无过滤策略

  • 下面测试仅针对“过滤”,如被“拦截”比较明显,无需测试。首先进行fuzz测试,输入如id=6asidji
    • 若结果和id=6相同,则后台存在数据类型转换或非直接饮用参数,不存在sql注入
    • 若返回结果空则进行特殊单词过滤检测,如id=6and,id=6sleep(5),id=6’等
      • 若返回结果和id=6相同,说明目标单词被过滤,尝试替换绕过后继续测试,若找不到绕过方式,怀疑为白名单或无法绕过,可认为不存在sql注入
      • 若返回结果为空,则说明没有被过滤,尝试单词组合,如id=6 and(这句话测试空格和and的组合,还有其他组合,具体组合方式因地制宜,无需构造完整的sql语句)
        • 若返回结果和id=6相同,则被过滤,尝试替换绕过后继续测试,若找不到绕过方式,怀疑为白名单或无法绕过,可认为不存在sql注入
        • 若返回结果为空,则说明不存在过滤,进行更多的组合测试,若没发现过滤,那么结合之前的1. 2. 3.三步测试结果(一定是前三步没有收获才会进行这一步)可得出结论不存在sql注入
        • 根据实际情况进行http协议层面的绕过,如测试中目标开启了waf,怀疑被waf过滤,那么可尝试http协议绕过。

猜你喜欢

转载自blog.csdn.net/Breeze_CAT/article/details/84833522
今日推荐