DVWA-XSS (Reflected)-反射型XSS

文章详细介绍了XSS攻击的概念,包括反射型XSS的运作方式,以及如何通过输入和输出点寻找和测试XSS漏洞。文中还展示了不同级别的XSS攻击示例,从低级到高级,强调了简单的字符替换无法有效防止攻击,并提倡使用像htmlspecialchars这样的函数进行输入净化和输出编码。最后,提到了内容安全策略(CSP)等更全面的防护措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

XSS攻击,是指攻击者在Web页面中输入恶意的JavaScript脚本,而Web应用程序没有对用户的输入进行过滤或处理就直接执行,将结果输出在网页中。如果恶意JavaScript脚本被存储到后端服务器中,用户打开该Web页面时,恶意脚本则可能在浏览器中自动执行。XSS攻击依赖于JavaScript脚本的执行。一般,攻击者插入恶意脚本后,需要将脚本执行结果显示出来,因此,XSS攻击常见于网站中有用户输入且能够显示的地方,如文章发表、评论回复、留言板等。


目的

以一种或另一种方式,窃取登录用户的cookie。

反射型XSS

反射型XSS,是指攻击者在页面中插入恶意JavaScript脚本,当合法用户正常请求页面时,该恶意脚本会随着Web页面请求一并提交给服务器,服务器处理后进行响应,响应由浏览器解析后将JavaScript脚本的执行结果显示在页面中。整个过程就像是一次“客户端—服务器—客户端”的反射过程,恶意脚本没有经过服务器的过滤或处理,就被反射回客户端直接执行并显示相应的结果。反射型XSS需要攻击者将带有恶意脚本的链接发送给其他用户,并诱惑用户点击该链接后才会发生。反射型XSS只有在用户点击时才会触发,且只执行一次,恶意代码不会在服务器中存储,因此也被称为“非持久型XSS”。


XSS漏洞分析

利用XSS漏洞时,首先寻找输入点。输入点一般是页面与用户交互之处,用户在输入点输入的数据会被提交到服务器,如URL、表单等。

其次,寻找输出点,确定Web应用程序是否将用户输入的数据显示在网页中。有的业务场景是用户输入数据后,在页面中立刻就能找到输出点,如留言板、评论等。但是,也有不在前端页面中显示的,如私信、意见反馈等,需要人工处理的,则会给XSS攻击增加难度。

最后,进行恶意代码测试。一旦知道了输入点、输出点,就可以构造含有恶意JavaScript脚本的输入,测试页面的输出。

XSS漏洞经常被用来窃取用户的Cookie,用于实施进一步的攻击,如篡改数据、盗取用户、修改用户设置等;也被用于网络钓鱼,使用短信、邮件群发恶意链接,诱导用户点击以获取用户输入敏感信息;甚至可以结合其他漏洞,对服务器发起攻击、植入木马等。在满足具体的业务场景需求时,对XSS攻击的防护较为困难,XSS漏洞范围广、引起的社会影响大,现已受到越来越多的关注。

低水平

查找输入输出点,输入内容会直接显示在页面和URL中

构造恶意脚本

Spoiler: ?name=<script>alert("XSS");</script>.

在输入框输入<script>alert("XSS");</script> 点击submit,显示了alert

 

 弹窗显示cookie <script>alert(document.cookie)</script>,发现已获取cookie。

在将请求的输入包含在输出文本中之前,低级别没有对输入进行检查。

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>
 

中级

中级反射型XSS渗透测试环境增加了一个“Get input”部分实现对输入参数的过滤

“$name=str_replace(′<script>′,′′,$_GET[′name′]);”语句将name参数值中的所有“<script>”字符串替换为空字符串,过滤该JavaScript标签。

<?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
    echo "<pre>Hello {$name}</pre>";
}

?>

使用 `str_replace()` 函数来清除 `<script>` 标记是不足以解决XSS漏洞的。应该使用适当的净化方法和输出编码方法,如 `htmlspecialchars()` 函数或使用模板引擎来生成JavaScript。

因此,建议对用户的输入数据进行彻底的验证和净化,包括过滤特殊字符、将HTML标签转义为它们的HTML实体等。此外,推荐使用先进的Web应用程序防火墙(WAF)和安全性别扫描程序来保护您的Web应用程序免受此类攻击。

由中级的脚本可见,该程序只把<script>替换成了空字符串。 

 输入低水平攻击,显示了alert("XSS")

但是可以使用大小写绕过,大小写绕过,就是将“<script>”字符串中的部分字符改成大写,使改写后的字符串不与原字符串完全一致,如“<sCrIpT>”,从而绕过防护。在DVWA平台的中级反射型XSS渗透测试页面的文本框中输入“<sCrIpT>alert(document.cookie)</script>”

双写绕过,就是利用“<script>”替换成空字符串的机制,使用“<script>”将“<script>”字符串分隔,如“<scr<script>ipt>”,该字符串中的“<script>”字符串被替换成空字符串后,剩余的字符又组成了“<script>”字符串,从而绕过防护。

在DVWA平台的中级反射型XSS渗透测试页面的文本框中输入“<scr<script>ipt>alert(document.cookie)</script>”,将页面Cookie显示在弹窗中 

高水平

<?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
    echo "<pre>Hello {$name}</pre>";
}

?>

高级反射型XSS渗透测试源代码不再是简单地将“<script>”字符串进行替换,而是使用“$name=preg_replace(′/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i′,′′,$_GET[′name′]);”语句中的preg_replace()函数,基于正则表达式进行替换,且添加“i”修饰符,不区分大小写,以防止发生大小写绕过和双写绕过的XSS攻击。

 

输入低水平脚本,只显示了一个Hello > 

过滤了script标签,可以标签绕过,就是将使用<script>以外的其他HTML标签插入JavaScript脚本,从而绕过防护。

“<img src=#οnerrοr=alert(document.cookie)>”,使用<img>标签绕过,成功将页面Cookie显示在弹窗中

用其他标签绕过,比如常用的<body>标签,输入“<body οnlοad=alert(document.cookie)>”

不可能的水平

使用内置的PHP函数(如“htmlspecialchars()”), 可以转义任何会改变输入行为的值。


    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

htmlspecialchars() 是一个PHP函数,它的主要作用是将特殊字符转换为HTML实体。这样做的目的是为了防止这些特殊字符被浏览器误解释为HTML代码的一部分,从而避免了潜在的安全问题。

例如,如果你的用户输入包含 <>"' 和 & 等字符,并且你需要在网页上显示这些输入,但不希望浏览器将这些字符解释为HTML标记或实体,那么你可以使用 htmlspecialchars() 函数来转义这些字符。

$input = "<html>Hello, world!</html>";
$output = htmlspecialchars($input);
echo $output;

输出将是:&lt;html&gt;Hello, world!&lt;/html&gt;

这样,浏览器会正确地显示文本,而不是尝试将其解释为HTML代码。这样可以防止潜在的跨站脚本攻击(XSS)。

请注意,尽管 htmlspecialchars() 有助于防止XSS攻击,但它并不提供完全的保护。为了实现更高级的安全性,应该使用其他方法,如内容安全策略(CSP)或输出编码函数(例如 htmlspecialchars())与输入验证和清理的组合。

<think>好的,我现在要解决用户在DVWA中进行XSS攻击时无法弹窗的问题。首先,我需要回忆一下DVWA的基本设置。DVWA(Damn Vulnerable Web Application)是一个用于安全测试的环境,用户通常会在不同的安全级别下进行练习,比如Low、Medium、High。XSS攻击弹窗不出现,可能有多种原因。 首先,用户可能是在较高的安全级别下进行测试。比如,在Medium或High级别下,DVWA会有一些防护措施,比如过滤<script>标签或对输入进行转义。这时候,我需要检查当前的安全级别,并建议用户将其调至Low级别进行测试。 其次,输入的payload可能被过滤或处理了。例如,在Medium级别中,可能会使用str_replace函数替换<script>标签。这时候,用户需要尝试其他标签,比如<img src=x onerror=alert(1)>,或者使用大小写混淆绕过过滤,比如<ScRiPt>alert(1)</ScRiPt>。 另外,浏览器的安全机制也可能阻止弹窗。比如,现代浏览器对反射型XSS可能会有内置的保护措施,特别是如果URL中包含alert()这类常见函数。这时候,可以尝试换用其他函数,比如prompt()或confirm(),或者使用编码绕过,比如将alert(1)转换成String.fromCharCode(97,108,101,114,116,40,49,41)然后通过eval执行。 还需要检查是否有输入长度限制。某些情况下,DVWA的输入字段可能有长度限制,导致payload被截断。这时候,可以尝试缩短payload,或者通过浏览器开发者工具移除输入框的maxlength属性。 此外,确保用户是在正确的模块下测试。DVWA中有反射型XSSReflected)和存储型XSS(Stored),如果用户在错误的模块输入payload,也可能无法触发弹窗。需要确认用户是否在正确的页面提交payload。 最后,可能需要查看服务器端的代码,了解具体的过滤机制。例如,在High级别的DVWA中,可能会使用正则表达式彻底过滤脚本标签,这时候需要更高级的绕过技巧,比如事件处理程序或使用其他HTML元素。 总结下来,可能的解决步骤包括:检查安全级别、尝试不同payload、绕过浏览器保护、处理输入限制、确认测试模块,以及分析服务器端过滤逻辑。接下来需要将这些步骤整理成用户友好的解答,并提供具体的示例和引用相关知识点。</think>### DVWAXSS攻击无法弹窗的解决方法 在DVWA中遇到XSS攻击无法弹窗的问题,通常与安全级别设置、输入过滤或浏览器防护机制有关。以下是逐步排查和解决的方法: --- #### **1. 确认DVWA安全级别** DVWA的安全级别(Low/Medium/High)直接影响XSS漏洞的利用难度: - **Low级别**:无防护,直接使用`<script>alert(1)</script>`即可弹窗。 - **Medium/High级别**:可能过滤`<script>`标签或转义特殊字符[^1]。 **操作步骤**: 1. 登录DVWA,点击左侧`DVWA Security`。 2. 将安全级别调整为**Low**后重试。 --- #### **2. 尝试绕过过滤的Payload** 若安全级别为Medium或High,需使用绕过技巧: - **Medium级别**:过滤`<script>`标签,但未处理大小写或事件属性。 ```html <!-- 使用大小写混淆 --> <ScRiPt>alert(1)</ScRiPt> <!-- 使用HTML事件属性 --> <img src=x onerror=alert(1)> ``` - **High级别**:可能彻底过滤脚本标签,需利用其他方式: ```html <!-- 使用伪协议或编码绕过 --> <a href="javascript:alert(1)">Click</a> <svg onload=alert(1)> ``` --- #### **3. 检查浏览器防护机制** 现代浏览器(如Chrome)可能拦截反射型XSS弹窗: - **解决方法**: 1. 改用`prompt()`或`confirm()`代替`alert()`: ```html <script>prompt(1)</script> ``` 2. 使用编码绕过检测: ```html <script>eval(String.fromCharCode(97,108,101,114,116,40,49,41))</script> ``` 3. 更换浏览器(如Firefox)测试。 --- #### **4. 处理输入长度限制** 某些DVWA输入字段(如存储型XSS)有长度限制: - **操作步骤**: 1. 打开浏览器开发者工具(F12)。 2. 找到输入框,删除`maxlength`属性后提交长payload。 --- #### **5. 确认测试的XSS类型** DVWA包含两种XSS模块: - **反射型XSSReflected)**:Payload直接显示在URL中,需通过输入框提交。 - **存储型XSS(Stored)**:Payload需提交到数据库(如留言板),刷新页面后触发。 **示例**(存储型XSS): ```html <textarea><svg onload=alert(1)></textarea> ``` --- #### **6. 查看服务器端过滤逻辑** 分析DVWA源码(以反射型XSS为例): - **Low级别**:无过滤: ```php <?php echo $_GET['name']; // 直接输出输入内容 ?> ``` - **Medium级别**:部分过滤: ```php <?php $name = str_replace('<script>', '', $_GET['name']); // 替换<script>标签 echo $name; ?> ``` - **High级别**:严格过滤: ```php <?php $name = preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET['name']); // 正则过滤 echo $name; ?> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值