1. 前言
SQL 注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在输入字段插入恶意 SQL 语句,操控数据库执行不当的操作。这种漏洞通常出现在未对用户输入进行适当验证和处理的 Web 应用程序中。
2. 漏洞产生原因
SQL 注入漏洞的产生原因主要包括:
- 缺乏输入验证:应用程序未对用户输入进行充分的验证和清理,允许恶意代码执行。
- 动态 SQL 构建不当:直接将用户输入拼接到 SQL 查询中,导致 SQL 语句被篡改。
- 错误的权限控制:数据库用户权限设置不当,攻击者可以利用注入获取敏感数据。
3. 漏洞的危害
SQL 注入漏洞可能导致的危害包括:
- 数据泄露:攻击者可以访问数据库中的敏感信息,如用户凭证、财务数据等。
- 数据篡改:攻击者可以修改或删除数据库中的数据,导致数据不一致。
- 账户接管:通过获取用户凭证,攻击者可以实现账户接管。
- 远程代码执行:某些情况下,攻击者可能利用 SQL 注入执行任意代码,从而完全控制服务器。
4. 针对 SQL 注入漏洞的测试技巧
4.1 输入字段测试
- 针对所有用户输入字段进行测试,包括登录表单、搜索框、注册页面等,尝试输入特殊字符(如单引号、分号等)。
4.2 使用常见的注入字符串
- 使用常见的 SQL 注入字符串(如
' OR '1'='1'; --)进行测试,观察系统的反应。
4.3 错误消息分析
- 在注入尝试中,观察返回的错误消息,可能暴露数据库结构或查询信息。
5. 漏洞利用前准备
5.1 信息收集
- 确定目标网站的数据库类型(如 MySQL、PostgreSQL、SQL Server),记录所有相关的请求和响应。
5.2 初步测试
- 尝试在输入字段中插入简单的 SQL 注入字符串,观察是否能导致错误或不当行为。
5.3 模拟攻击
- 如果直接测试失败,使用自动化工具(如 SQLMap)进行深入的 SQL 注入测试。
-
实战案例
- 案例1:


在下图所示的位置点击1111,查询抓包


然后把这个报文丢到sqlmap里跑


dbname存在注入
获取库名


发现存在数百个数据库,存在大量敏感信息泄露
案例2:
这次的注入在一个"日志查询"的功能,在进行查询的时候,出现了注入。并且我可以告诉大家,在这种功能点很容易出现注入。
在AUD_RESOURCE这个参数后面,添加一个单引号,直接返回的是一个空白页面,什么数据也没有,但是在后面添加 ' and ''=' 后就成功闭合,将数据进行完整的返回,因此证明存在注入。


证明存在注入之后,还需要SQLMAP进行验证一下,否则edusrc不收取,或者使用sleep函数进行延迟也可以。
python .\sqlmap.py -r post.txt --batch --dbms 数据库类型 --tamper "space2comment.py" -p AUD_RESOURCE
可以看到这是一个时间盲注。

原本提交这个漏洞后,再摸索一遍,什么也没有然后就走了。但是过了一星期又重新摸回这个站点,于是就有了下面的SQL注入连杀。
这次的注入点在"账号管理",点击账号管理的时候进行抓包。

正常情况下,ZHCZLXID参数为空,但是能够成功返回出数据。

然后还是习惯性的添加一个单引号,发现只返回了一个{},情况有变!

然后继续尝试进行闭合,使用and ''='进行闭合。
发现返回值直接没有了,但是返回值没有,可不代表不存在注入!

python .\sqlmap.py -r post1.txt -p ZHCZLXID --tamper=space2comment --random-agent --dbms 数据库类型
可以看到成功跑出来注入漏洞,是个时间盲注。
