swfupload.swf xss漏洞说明
【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是txt格式!】
朋友今天丢来一个网址,然后问我能不能弹窗, 地址是: www.xxxx.com/swf/swfupload.swf?movieName="])}catch(e){if(!window.x){window.x=1;alert(document.cookie)}}//
一看这个文件,很是熟悉啊,记得,好像有哪个CMS用过这个文件,然后习惯性chrome访问回车,然后,诶???居然是下载这个文件。。。然后听朋友说,最新的火狐不会弹窗?,,,不过还好我的是老版本的,我实验了一下,确实可以弹窗,这个文件以前看过,但是没有细看,今天细细看一下吧。就当是复习功课了。
首先这个文件在第108行定义movieName变量为字符串型,代码如下:
private var movieName:String;
然后继续看,在284行开始获取变量值
this.movieName = root.loaderInfo.parameters.movieName;
this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
this.fileDialogStart_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileDialogStart";
this.fileQueued_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueued";
this.fileQueueError_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].fileQueueError";
…………//后面就省略了。
这里可以看到使用了“root.loaderInfo.parameters”获取名称对应的值。然后直接使用。然后导致问题的出现。
在网上找到一个检测这个漏洞的PY脚本。这个脚本是通过MD5值做对比然后进行检测。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #! /usr/bin/env python # -*- coding: utf-8 -*- import md5 from thirdparty import requests from modules.exploit import TSExploit class TangScan(TSExploit): def __init__(self): super(self.__class__, self).__init__() self.info = { "name": "phpcms V9 /swfupload.swf XSS", "product": "phpcmsv9", "product_version": "", "desc": """ phpcms V9 /swfupload.swf XSS """, "license": self.license.TS, "author": ["侦探911"], "ref": [ {self.ref.wooyun: "http://www.wooyun.org/bugs/wooyun-2014-069833"}, ], "type": self.type.xss, "severity": self.severity.low, "privileged": False, "disclosure_date": "", "create_date": "" } self.register_option({ "url": { "default": "", "required": True, "choices": [], "convert": self.convert.url_field, "desc": "" } }) self.register_result({ "status": False, "data": { }, "description": "", "error": "" }) def md5(self, content): return md5.new(content).hexdigest() def verify(self): flash_md5 = "3a1c6cc728dddc258091a601f28a9c12" exp_url = "{domain}/statics/js/swfupload/swfupload.swf".format(domain=self.option.url.rstrip('/')) try: response = requests.get(exp_url, verify=False, timeout=15) except Exception, e: self.result.error = str(e) return if self.md5(response.content) == flash_md5: self.result.status = True self.result.description = "目标 {url} 存在反射XSS, 验证url: {verify_url}".format( url=self.option.url, verify_url=exp_url + "?movieName=%22]%29}catch%28e%29{if%28!window.x%29{window.x=1;alert%28document.cookie%29}}//" ) def exploit(self): self.verify() if __name__ == '__main__': from modules.main import main main(TangScan()) //这个脚本是TangScan用的。 |
这里也要说一下这个文件的修复方法,网上官方给出的修复方法是,在第284行下面加入如下代码。
this.movieName = root.loaderInfo.parameters.movieName;
this.movieName = this.movieName.replace(/[^a-zA-Z0-9\_\.\-]/g, ""); //注意多了一行这个代码这里做了一个正则替换
这里再说一个小常识:
如:demo.swf?u1=good&u2=bad
要用到flash.display.loaderInfo类的parameters属性,返回的是一个参数对象
使用方法:
例如在文档类中定义var param:Object = root.loaderInfo.parameters;
如果取u1的值,可以用param["u1"],同样u2的值:param["u2"]
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏