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

本文详细介绍了一套系统的SQL注入测试步骤,包括确定注入类型、测试逻辑语句、延时语句及过滤策略,帮助读者理解如何有效检测并利用SQL注入漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在找好需要测试的功能点之后,针对每种功能点(参数),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协议绕过。
### SQL 注入测试方法与策略 #### 输入验证绕过检测 为了有效识别潜在的 SQL 注入漏洞,可以尝试向应用程序输入特殊字符组合来观察响应行为。如果应用未能正确处理这些字符,则可能存在风险[^1]。 ```sql ' OR '1'='1 ``` 此字符串旨在利用逻辑运算符 `OR` 来构造始终为真的条件表达式,从而可能暴露数据库结构或返回意外数据集。 #### 错误消息分析 当 Web 应用程序配置不当并显示详细的错误信息时,攻击者可以通过触发特定类型的查询异常获取有关底层架构的信息。例如: ```sql ' AND 1=CONVERT(int,'a') -- ``` 上述语句会故意引发转换失败错误,帮助确认是否存在可被利用的注入点。 #### 时间延迟盲注法 对于那些不会直接回显任何反馈的应用场景,时间基盲注技术提供了一种间接判断机制。通过嵌入延迟能力的子查询,可以根据页面加载所需的时间推断出布尔命题的结果真假情况。 ```sql '; WAITFOR DELAY '0:0:5'-- ``` 这段代码会使服务器端执行等待操作五秒钟后再继续后续流程;若实际耗时显著增加则表明存在隐患可能性较大。 #### 联合查询探测 联合选择(UNION SELECT)是一种常见的SQL注入手法,它允许将额外的数据集附加到原始请求之后一并展示出来。这有助于收集更多关于目标环境的知识以及进一步探索其他表单字段属性等敏感资料的存在与否。 ```sql ' UNION ALL SELECT NULL, version(), database()-- ``` 该命令试图追加一条新记录至结果集中,其中包含了当前使用的 MySQL 版本号及默认库名作为示例说明。 #### 防御措施建议 为了避免遭受此类威胁的影响,在开发过程中应当遵循安全编码最佳实践指南,比如采用预编译参数化接口代替动态拼接方式构建最终要发送给DBMS解释器运行的指令文本串,并严格过滤掉一切非法成分以确保其合法性合规性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值