XSS漏洞靶场---(复现)

XSS漏洞靶场—(复现)

反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL,服务器接收到请求后将恶意脚本反射回响应页面,浏览器执行该脚本从而造成攻击,恶意脚本不会在服务器端存储。

Level 1(反射型XSS)

image-20250317193251342

image-20250317193110501

此漏洞主要源于代码对用户输入未进行充分的过滤和转义处理。在 PHP 代码里,通过 $_GET["name"] 接收用户从 URL 传递过来的 name 参数,接着直接将该参数输出到 HTML 页面中。若攻击者在 name 参数里注入恶意的 JavaScript 代码,当页面加载时,这些恶意代码就会被浏览器执行,进而达成 XSS 攻击。

通过分析源码,可在name参数上尝试用简单的JS代码进行XSS攻击,看到下面代码执行成功

image-20250317192313770

攻击示例:

http://127.0.0.1/xss-labs-master/level1.php?name=<script> alert("攻击成功")</script>

修复建议:

为了防止 XSS 攻击,需要对用户输入进行过滤和转义处理。在 PHP 中,可以使用 htmlspecialchars 函数将特殊字符转换为 HTML 实体,从而避免恶意代码被执行

解释

  • htmlspecialchars($str, ENT_QUOTES, 'UTF-8'):该函数把字符串中的特殊字符(如 <>"' 等)转换为 HTML 实体(如 <>"' 等),如此一来,即使攻击者注入了恶意的 JavaScript 代码,这些代码也会以文本形式显示,而不会被浏览器执行。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
    confirm("完成的不错!");
    window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
// 对用户输入进行转义处理
$escapedStr = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
echo "<h2 align=center>欢迎用户".$escapedStr."</h2>";
?>
<center><img src=level1.png></center>
<?php 
// 对用于计算长度的字符串也可以考虑进行必要的验证
$lengthStr = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
echo "<h3 align=center>payload的长度:".strlen($lengthStr)."</h3>";
?>
</body>
</html>

Level 2(反射型XSS)

image-20250317193401601

image-20250317193759284

虽然代码在部分输出时使用了 htmlspecialchars 函数对用户输入进行了处理,但在表单输入框的 value 属性赋值时,没有对用户输入进行足够的转义处理。攻击者可以通过构造特殊的输入,绕过这种部分防护,使得恶意的 JavaScript 代码在页面中被执行,从而实现 XSS 攻击。

在上述代码里,$str 是从 $_GET["keyword"] 获取的用户输入,在 <input> 标签的 value 属性中直接使用了 $str,而没有进行合适的转义。

在h2标签之中的恶意代码被htmlspecialchars编码了。其中<、>都被编码成了html字符实体,恶意代码被编码了,只能从属性值中的恶意代码处进行突破了,,只需要将属性的引号和标签先闭合就可以了。

攻击示例:

http://127.0.0.1/xss-labs-master/level2.php?keyword="><script>alert('XSS 攻击成功!')</script><"

image-20250317193900303

修复建议

为了防止这种 XSS 攻击,需要对表单输入框 value 属性中的用户输入也进行转义处理。可以继续使用 htmlspecialchars 函数。

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
    confirm("完成的不错!");
    window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
// 对输出到 h2 标签中的内容进行转义
$escapedStrH2 = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// 对输出到 input 标签 value 属性中的内容进行转义
$escapedStrInput = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
echo "<h2 align=center>没有找到和".$escapedStrH2."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$escapedStrInput.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
// 对用于计算长度的字符串也进行必要的验证
$lengthStr = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
echo "<h3 align=center>payload的长度:".strlen($lengthStr)."</h3>";
?>
</body>
</html>

Level 3(反射型XSS)

image-20250317194935969

尝试Level 2 的攻击方法后未能成功

image-20250317195153096

image-20250317195340074

代码中对 $str 进行了 htmlspecialchars 处理,在大部分情况下能防止常见的 XSS 攻击。不过,当攻击者利用 HTML 事件属性时,仍可能构造出能执行恶意脚本的情况。在 HTML 标签的属性中,如果输入包含事件处理函数(如 onclickonload 等),即使使用了 htmlspecialchars 转义了引号,攻击者依然可以通过构造合适的输入绕过部分防护。

image-20250317195534631

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>	
<input type=submit name=submit value=搜索 />
</form>
</center>";

虽然对 value 属性的值进行了转义,但如果攻击者输入的是包含事件处理函数的内容,可能会引发 XSS 攻击

攻击示例:

http://127.0.0.1/xss-labs-master/level3.php?writing='onmouseover='alert("XSS")

'οnmοuseοver='alert(“XSS”)

onmouseover

当用户将鼠标悬停在输入框上时,onmouseover 事件触发,恶意脚本 alert("XSS") 就会被执行

image-20250317201539168

修复建议:

为了更安全地处理用户输入,除了使用 htmlspecialchars 对普通字符进行转义,还需要对可能的 HTML 事件属性进行过滤和验证,或者采用更严格的白名单机制来允许的字符和属性。另外,在现代 Web 开发中,可以考虑使用 htmlentities 函数来进行更全面的转义。

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
    confirm("完成的不错!");
    window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
// 更全面的转义处理
$escapedStr = htmlentities($str, ENT_QUOTES, 'UTF-8');
echo "<h2 align=center>没有找到和".$escapedStr."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".$escapedStr."'>	
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php 
// 对用于计算长度的字符串也进行转义
$lengthStr = htmlentities($str, ENT_QUOTES, 'UTF-8');
echo "<h3 align=center>payload的长度:".strlen($lengthStr)."</h3>";
?>
</body>
</html>

Level 4 (反射型XSS)

image-20250317202516270

image-20250317202234224

漏洞分析

  1. 过滤不彻底

代码尝试通过 str_replace 函数去除输入中的 <> 字符,以防止用户注入 HTML 标签。然而,攻击者可以利用 HTML 实体编码绕过这种过滤。HTML 实体编码允许将特殊字符用特定的编码表示,例如 < 可以用 < 表示,> 可以用 > 表示。当页面输出时,浏览器会将这些实体编码解析为对应的字符。

  1. 部分输出转义问题

虽然在 <h2> 标签中使用了 htmlspecialchars 对输出进行转义,但在 <input> 标签的 value 属性中,使用的是经过 str_replace 处理后的 $str3,没有再次进行全面的转义,这就给攻击者留下了可乘之机。

攻击示例:

http://127.0.0.1/xss - labs - master/level4.php?keyword="onfocus=javascript:alert('xss') "

当用户点击该 URL 时,浏览器会向服务器发送请求,服务器端代码通过 $_GET["keyword"] 获取到 keyword 参数的值为 "onfocus=javascript:alert('xss') "

原代码中处理逻辑:

$str = $_GET["keyword"];
$str2 = str_replace(">", "", $str);
$str3 = str_replace("<", "", $str2);

这里代码只是简单地去除了 <> 字符,而攻击者输入的内容中并没有直接使用 <> 来包裹脚本,所以这种过滤方式对该恶意输入无效,$str3 仍然是 "onfocus=javascript:alert('xss') "

修复建议:

为了防止此类 XSS 攻击,需要对用户输入进行更严格的过滤和转义处理。可以使用 htmlspecialcharshtmlentities 函数对输出进行全面转义,确保特殊字符被正确处理

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
    confirm("完成的不错!");
    window.location.href="level5.php?keyword=find a way out!"; 
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
// 对输入进行全面的 HTML 实体编码转义
$escapedStr = htmlentities($str, ENT_QUOTES, 'UTF-8');
echo "<h2 align=center>没有找到和".$escapedStr."相关的结果.</h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword  value="'.$escapedStr.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level4.png></center>
<?php 
// 对用于计算长度的字符串也进行转义
$lengthStr = htmlentities($str, ENT_QUOTES, 'UTF-8');
echo "<h3 align=center>payload的长度:".strlen($lengthStr)."</h3>";
?>
</body>
</html>

Level 5(反射型XSS)

image-20250317210244626

image-20250317210338381

在这段代码中,$str 变量接收用户输入的 keyword 参数,经过一系列处理后存储在 $str3 中,而 $str3 被直接嵌入到 HTML 表单的 input 标签的 value 属性中,没有进行足够的 HTML 实体转义,这就为 XSS 攻击提供了可能。

攻击原理:

攻击者通过构造恶意的 keyword 参数,将包含 JavaScript 代码的字符串注入到页面中。当页面加载时,浏览器会执行注入的 JavaScript 代码,从而实现攻击目的。例如,使用如下 URL:

http://127.0.0.1/xss-labs-master/level5.php?keyword="><a href=javascript:alert("攻击成功")>"点这"</a>

在这个 URL 中,keyword 参数的值为 "><a href=javascript:alert("攻击成功")>"点这"</a>。当页面加载时,这个恶意代码会被嵌入到 input 标签的 value 属性中,导致浏览器执行 alert("攻击成功") 代码,显示一个提示框,表明攻击成功。

image-20250317211641196

代码中存在问题的部分:

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';

在上述代码中,$str3 直接被嵌入到 input 标签的 value 属性中,没有进行足够的 HTML 实体转义,使得攻击者可以通过构造恶意的 keyword 参数注入 JavaScript 代码。

修复建议:

为了防止 XSS 攻击,需要对用户输入的数据进行充分的 HTML 实体转义。可以使用 htmlspecialchars 函数对 $str3 进行转义,修改后的代码如下:

echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str3, ENT_QUOTES, 'UTF-8').'">
<input type=submit name=submit value=搜索 />
</form>
</center>';

在这个修改后的代码中,htmlspecialchars 函数将 $str3 中的特殊字符(如 <>" 等)转换为 HTML 实体,从而避免了 JavaScript 代码的注入。ENT_QUOTES 参数表示同时转换单引号和双引号,'UTF-8' 表示使用 UTF-8 编码。

Level 6(反射型)

image-20250317212042882

image-20250317212103797

代码尝试对一些常见的用于 XSS 攻击的关键词进行替换,例如将 <script 替换为 <scr_ipt,将 on 替换为 o_n 等。但这种过滤方式存在严重缺陷:

  • 大小写绕过:过滤操作是基于小写关键词进行的,攻击者可以使用大小写混合的方式绕过过滤。例如,在攻击 payload "><a hRef=javascript:alert(1)>test</a> 中,使用 hRef 而不是 href,就绕过了对 href 的替换。
  • 不完整过滤:只对部分关键词进行了替换,攻击者可以利用其他未被过滤的 HTML 属性和事件来注入恶意脚本。
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';

这是漏洞的关键所在。虽然对 $str 进行了 htmlspecialchars 处理,但在将 $str6 嵌入到 input 标签的 value 属性时,没有对其进行充分的 HTML 实体转义。这意味着攻击者构造的恶意代码会被直接插入到 HTML 页面中。

攻击示例:

http://127.0.0.1/xss-labs-master/level6.php?keyword="><a hRef=javascript:alert(1)>test</a>

当用户访问包含恶意 keyword 参数的 URL 时,浏览器会解析并执行嵌入在页面中的恶意脚本。例如,对于 "><a hRef=javascript:alert(1)>test</a> 这个 payload,当页面加载后,input 标签的 value 属性会被提前闭合,后面插入的 <a> 标签会正常显示。当用户点击这个链接时,浏览器会执行 javascript:alert(1) 代码,弹出一个警告框,表明攻击成功。

image-20250317212810046

Level 7(反射型)

image-20250317213103716

image-20250317213134017

$str2 = str_replace("script", "", $str);
$str3 = str_replace("on", "", $str2);
$str4 = str_replace("src", "", $str3);
$str5 = str_replace("data", "", $str4);
$str6 = str_replace("href", "", $str5);

代码尝试对一些常见的用于 XSS 攻击的关键词进行过滤,将它们替换为空字符串。但这种过滤方式存在明显缺陷:

  • 过滤不全面:只对部分关键词进行了过滤,攻击者可以使用其他未被过滤的 HTML 属性和事件来注入恶意脚本。
  • 可绕过过滤:攻击者可以通过一些技巧绕过这些过滤,例如使用大小写混合、重复关键字等方式。比如构造 javascscriptript 绕过对 script 的过滤,当过滤操作移除 script 后,仍能形成有效的 javascript
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';

这是漏洞的关键所在。在将处理后的 $str6 嵌入到 input 标签的 value 属性时,没有对其进行充分的 HTML 实体转义。这意味着攻击者构造的恶意代码会被直接插入到 HTML 页面中,当浏览器解析该页面时,就会执行恶意脚本。

攻击示例:

http://127.0.0.1/xss-labs-master/level7.php?keyword="><a hrhrefef=javascscriptript:alert(1)>test</a>

image-20250317213920685

攻击者构造的 keyword 参数为 "><a hrhrefef=javascscriptript:alert(1)>test</a>。通过重复关键字符(如 hrhrefefjavascscriptript),使得过滤函数在移除 hrefscript 后,依然能保留有效的可执行代码。经过过滤后,hrhrefef 变成 hrefjavascscriptript 变成 javascript,最终在页面中形成有效的 <a href="javascript:alert(1)">test</a> 代码,当用户点击链接时,就会触发 alert(1) 弹出警告框。

修复建议:
为了防止 XSS 攻击,需要对最终输出到页面的内容进行充分的 HTML 实体转义。可以使用 htmlspecialchars 函数对 $str6 进行处理,修改后的代码如下:

$str = strtolower($_GET["keyword"]);
$str2 = str_replace("script", "", $str);
$str3 = str_replace("on", "", $str2);
$str4 = str_replace("src", "", $str3);
$str5 = str_replace("data", "", $str4);
$str6 = str_replace("href", "", $str5);
$escaped_str6 = htmlspecialchars($str6, ENT_QUOTES, 'UTF-8');
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$escaped_str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';

通过 htmlspecialchars 函数将特殊字符(如 <>"' 等)转换为 HTML 实体,这样即使攻击者构造了恶意的 keyword 参数,也无法在页面中执行恶意脚本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值