前言

挖掘SQL注入漏洞的第一步,就是发现SQL注入漏洞,只有发现了注入点才能够继续深入利用。
可以通过多种方式来检测是否存在注入,最简单的就是直接在参数后加上'或者"等特殊字符让web应用程序抛出异常;但这种情况已经很少见了,比较好的方法是通过盲注来进行判断;

注入点位置

之前也提到过,所有和数据库有交互的地方均可能存在SQL注入,因此我们在分析数据包的时候,可以关注一下哪些数据可能会和数据库交互,从而进行测试是否存在SQL注入漏洞。
举例

  1. POST /?id=homePage HTTP/1.1
  2. Host: www.netspi.com
  3. Connection: close
  4. Cache-Control: max-age=0
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
  6. Upgrade-Insecure-Requests: 1
  7. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  8. Accept-Encoding: gzip, deflate
  9. Accept-Language: en-US,en;q=0.9
  10. X-Server-Name: PROD
  11. Cookie: user=harold;
  12. Content-Type: application/x-www-form-urlencoded
  13. username=harold&email=harold@netspi.com

分析上面这个数据包,红框中的内容都可能会和数据库交互,因此都可能存在SQL注入,其他数据包分析类似
image-20211217143658914

如果传输的是json格式的数据,在使用双引号闭合时,记得使用\来防止破坏json数据结构,如下,其他特殊格式数据类似

``` {“username”:”test\””}

```

注入检测

检测是否存在注入一般通过两种方式来判断:

  1. 输入特殊字符是否抛出相关的异常
  2. 输入一些语句运行后是否达到我们预期的结果(返回内容、响应时间等)

此处只是举例,抛砖引玉,多尝试构造

| 类型 | 语句和结果 | | —- | —- |

| 特殊字符 | id=')") ==> 抛出异常 |

| 逻辑算数测试 | id=' and 2*3 = 6 -- ==> True
id=' and 2*3 = 5 -- ==> False
id=2*3 ==> 是否返回id=6相关的内容
id=1/1 ==> True
id=1/0 ==> False或者异常 |

| 返回延时 | id=' and sleep(5) ==> 延时5秒甚至更久,需要根据特定的数据库函数来判断 |