绕过一些正则来触发xss (翻译文)

  1. 前言
  2. 正文

前言

今天翻译一篇文章,在有限制的地方挖出潜在xss
Referer:https://brutelogic.com.br/blog/xss-limited-input-formats/
收获还是可以的

正文

上面的文章给出的练习地址是:https://brutelogic.com.br/tests/input-formats.php?email=user@domain.com
可以从页面上看到,这个xss练习平台有4题

第一题
引用email参数输出,尝试以常规的方式插入xss payload

发现并没有成功,查看文章后注意文章提到的

查看php官网查看该函数

filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它

使用过滤器里的email来过滤,由于此函数里面的email过滤是通过RFC822协议来验证是否为邮箱的
只要你payload满足这个协议即可成功触发xss
RFC822:http://sphinx.mythic-beasts.com/~pdw/cgi-bin/emailvalidate

尝试将payload插入

"<script>alert(1)</script>"@x.y

由于filter_input()函数会过滤掉空格,所以payload的时候要避免空格

通过这个题可以得到一个检测方法:

如果是用filter_input()函数来判断是否为email的话,输入 "<"@x.y filter_input()函数会认为这是个邮箱
使用preg_match()进行正则匹配的话,输入"<"@x.y 认为不是个邮箱
一般实际中遇见邮箱填写的地方可以试试

第二题
这题会根据你输入的url来生成url (a标签),猜测使用filter_input()或正则来匹配 (因为匹配url的正则能被绕过)
正则是

[a-zA-z]+://[^\s]*

测试javascript://alert(1) 可以看到正则成功匹配出了

插入payload尝试,发现不行

根据文章说到

不明白为什么要将%0AURL编码两次?

通过查询可以知道js里面的%0A是换行符,将%0A URL编码两次,浏览器默认解码一次,那么%0A就会存在
最后payload会变成这样

javascript://
alert(1)

第三题
这题根据测试,发现判断条件有些改变

使用上一题的payload发现并不行= =,后面继续阅读文章和自己实现
发现判断的url是这样的

https://google.com/search?q=Brute%252BXSS 正则认为这才是url = =

那么根据分析得到的payload是

javascript://https://google.com/search?q=Brute%252BXSS%250Aalert(1)

第四题
通过测试发现正则是判断长度的,长度如果不达到32将不显出

最后得出payload是

12345678901<svg onload=alert(1)>


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:绕过一些正则来触发xss (翻译文)

本文作者:九世

发布时间:2019-04-13, 22:56:30

最后更新:2019-04-19, 20:36:16

原始链接:http://jiushill.github.io/posts/1c9464a2.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录