浅谈XXE攻击

二.XML基础

xml是一种用于标记电子文件使其具有结构性的标记语言,用于标记数据,和定义数据类型,可以为两种不同系统进行信息交换,
XML文档结构包括xml声明,DTD文档类型定义(可选),文档元素
在这里插入图片描述

二.DTD文档定义,可以内部声明,也可以外部引用

    <!DOCTYPE address [<!ELEMENT address (#PCDATA)>
                                            <!ENTITY name "Tanmay patil">
                                            <!ENTITY company "TutorialsPoint">
                                             <!ENTITY phone_no "(011) 123-4567">
                                              ]>
  1.       <!DOCTYPE 根元素 SYSTEM "DTD文件的URL">
                <!DOCTYPE address SYSTEM "address.dtd">
             <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
    

3.实体声明,相等于定义了一个变量

<!ELEMENT>这块略过,对xxe影响不大,自行去菜鸟教程了解 <!ENTITY>(重点):

直接声明

<!ENTITY 实体名称 实体的值 引用外部 <!ENTITY 实体名称 SYSTEM "URI">

或者

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

三,如何判断xxe漏洞
这里用一题南邮的web1题来作为案例

在这里插入图片描述
bp抓包看下,

在这里插入图片描述
发现Content-type:application/xml,或者直接从请求报文就能看出是xml了,说明可以去利用xml解析器来帮我们做一些事
而且从题目提示中,得知flag就在/flag这个文件中。只要能弄到源码,就美滋滋了,所以想到xxe,那么直接看下我是怎么写的
在这里插入图片描述
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=/flag>这句的意思就是SYSTEM这个系统命名将这个url的文件内容读进了xxe这个实体。
所以答案就出来了。
在这里插入图片描述
解码下就ok了。以下,是发现几篇好文,可以更深入的了解。
知乎某老哥的资料分享
添加链接描述
添加链接描述

### PHP XXE 攻击原理 PHP应用程序处理XML输入时,如果允许解析外部实体,则可能存在XXE(XML External Entity Injection)漏洞。当恶意用户能够控制部分或全部的XML输入并引入特定的DTD声明时,可以触发服务器端执行任意命令或者泄露敏感数据。 具体来说,在构建XML文档的过程中,通过`<!ENTITY>`定义内部或外部实体来引用其他资源。对于外部实体而言,它可以指向本地文件系统上的任何位置甚至是远程URL。一旦这些被嵌入到最终生成的有效载荷中,并由易受攻击的应用程序解释,就可能造成严重的后果[^1]。 例如下面这段代码展示了如何创建一个带有外部实体引用的简单XML字符串: ```xml <?xml version="1.0"?> <!DOCTYPE root [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <root>&xxe;</root> ``` 此示例尝试读取Linux系统的密码文件 `/etc/passwd` 并将其作为响应的一部分返回给客户端。 ### 防护措施 为了防止上述类型的攻击发生,在开发基于PHP的应用时应该采取以下几种策略之一来进行保护: #### 禁用外部实体加载器 最直接有效的方法是在初始化libxml库之前调用 `libxml_disable_entity_loader(true)` 函数关闭对外部实体的支持。这会阻止所有形式的外部实体扩展,从而消除大部分潜在风险: ```php // 关闭外部实体支持 libxml_disable_entity_loader(true); $xml = simplexml_load_string($user_input_xml); ``` #### 使用安全模式解析XML 另一种方法是采用更严格的验证机制,比如只接受来自可信源的数据;确保所有的输入都被充分清理过;以及尽可能早地拒绝可疑请求而不去试图进一步分析它们的内容。此外还可以考虑启用某些框架自带的安全特性如 Symfony 的 XmlEncoder 或者 Laravel 提供的相关组件等。 #### 输入过滤与输出编码 始终遵循最小权限原则,即仅授予必要的访问权限。对不可信来源传来的参数做严格校验,去除非法字符序列后再交给后续逻辑层处理。同时注意转义特殊符号以避免意外情况的发生。 #### 更新依赖项和补丁管理 定期审查项目所使用的第三方库及其版本号,及时安装官方发布的修复更新包。许多已知的安全隐患往往会在较新的发行版里得到妥善解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值