前言
记录一下学习过程,实际的情况可能有较多的变化 安装步骤跳过,源码可去github上下载
构造payload 的时候,就看你值是传入了哪一个参数中 value 的参数是用的双引号将值括起来的,所以payload 才需要的双引号构造闭合条件
xss-labs下载
PHP: htmlspecialchars - Manual
一、题目
访问http://127.0.0.1/xss-labs-master/level2.php?keyword=test
二、源码审计
源码如下
<!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"];
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>";
?>
</body>
</html>
htmlspecialchars 函数会按下面表格的方式来转换字符
三、绕过
[1]. 测试
因为直接弹窗成功的时候会跳到下一关,所以可以先将对应的代码注释
直接输入<script>alert(233)</script> 的时候,发现javascript 代码直接被打印出来了没有执行
输入& " ' < > 后,查看html源码 第一处中发现仅单引号没有被转换 而第二处中虽然没有被转换,但是直接被引号引起来了,被当成了字符输出
[2]. 第一处调用点
先看第一处调用$str 变量的地方,因为外部都是使用的双引号 而只有单引号不会被htmlspecialchars 函数转换,所以没法闭合双引号
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
[3]. 第二处调用点
再看一下第二处,用了双引号、单引号和点将变量括起来
<input name=keyword value="'.$str.'">
第一个单引号是和<center> 之前的单引号形成的闭合,被echo 出来的代码如下
<center>
<form action=level2.php method=GET>
<input name=keyword value="
第二个单引号是和</center> 后面的单引号进行闭合,被echo 出来的代码如下
">
<input type=submit name=submit value="搜索"/>
</form>
</center>
[4]. 构造payload
因为$str 是需要被echo 出来的,所以需要使用单引号或者是双引号将javascript 脚本括起来
payload:
"<script>alert(233)</script>"
或
'<script>alert(233)</script>'
而value 的值是使用双引号 括起来的,所以需要在$str 使用双引号让value="值" 中的两个双引号闭合掉 这样里面的javascript 脚本才会生效
payload:
"<script>alert(233)</script>"
此时如果直接传入上面的payload ,<input> 标签的代码就会变成如下的样子 input 标签就没掉了> ,代码末尾的""> 就相当于一个字符串
所需需要补上> ,此时就可以直接弹窗了
payload:
"><script>alert(233)</script>"
如果想要后面的""> 也生效的话,可以再修改一下payload 让其闭合成另外的标签,比如<input> 标签
payload:
"><script>alert(233)</script><br><input value="小狐狸
|