Notes of Laurel | 大雨将至

Summary of Web

Word count: 1.4kReading time: 6 min
2019/08/11 Share

你是人间烟火不自知,我在俗世仰望应如是。


Fuzzing

“百度杯”CTF比赛 十月场

题目内容是:there is nothing

用Burpsuite抓包一下,能看到一个hint - -

1566477766113

它要求要大的内部网络,专用IP地址段为:
10.0.0.0–10.255.255.255
172.16.0.0–172.31.255.255
192.168.0.0–192.168.255.255

所以修改请求头,加上X-Forward-For,一个个试一下。

当修改为X-Forwarded-For:10.10.10时,会得到一个新的提示Location。

1566477893134

访问这个php地址,内容是:show me your key.

那大概是要向服务器提交一个key的值吧,GET提交没反应,那就POST方式。

1566479859703

告诉了密文,并且key在md5加密之前是icunqiu***,所以我们需要写一个脚本去找一下key:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hashlib

MD5 = "1b4167610ba3f2ac426a68488dbd89be"
chars = "abcdefghijklmnopqrstuvwxyz0123456789"
for i in chars:
for j in chars:
for k in chars:
key = "ichunqiu" + i + j + k
hash = hashlib.md5(key.encode()).hexdigest()
if hash == MD5:
print(key)
print(hash)

跑出来得到key为ichunqiu105 - -

1566478472878

下一步,是一个新的php文件 - -

1566479915189

1566479970797

来看一下sourcecode:

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
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key ? $key : UC_KEY);
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya . md5($keya . $keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for ($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for ($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if ($operation == 'DECODE') {
if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc . str_replace('=', '', base64_encode($result));
}
}

这是一个加密的方法,我们通过调用这个定义的方法去得到flag:

1
echo authcode("d116+lpzwYGeuOp97fQ8DbwUogjZvXwKdAMW1skwPQ6mU2kjOKC3b4bhsN7N9hq03qAfaAXEavDq5YxLilcpnCnuM5ClG8g",$operation = 'DECODE', $key = 'ichunqiu105', $expiry = 0);

运行一下得到flag:

flag{c1733e42-2c1c-481c-b49a-5b179dde9421}


Wanna to see your hat?

2017年全国大学生信息安全竞赛

首先是一个登录页面 - -

1566531195568

随便创建一个账号然后登进去,然后有一大堆的 绿帽子 …😶

1566531295743

这个页面上,没看到啥有用的东西,返回到登录页面,抓个包看看 - -

1566531470440

哇有个sql语句欸,尝试修改一下name值,发现它过滤了空格,并且把单引号(‘)转义成了反斜杠(\) - -

1566531626452

但是没关系,空格可以被’/**/‘代替,并且如果把单引号放在payload的最后,那跟在后面的单引号就会被’/‘转义。

1566531964225

发送后,可以看到多了一个’good job’,那应该是成功了,用这个payload去登录吧 - -

1566532188680


Hello World

是一个Hello World界面 - -

1567066965022

先看一下源码 - -

1567067003511

访问一下flag.xmas.js,但是404了,尝试访问flag.js,有内容 - -

1567067074289

有点东西,我甚至把js代码格式化分析了一下,但是太长了,我还是不会做…

然鹅,题目的思路是.git泄露,.git/logs/HEAD文件的利用。如果用githack的话,会漏掉部分object - -

1567067185020

改用gitextract,能提取出两个flag文件 - -

1567067300922

这两个flag是不太一样的,用diff命令看一下不一样的地方 - -

1
diff flag.js flag.js.04bb09

可以看到前面不一样的地方拼起来是flag{ - -

1567067476771

flag{82efc37f1cd5d4636ea7cadcd5a814a2}


Upload

今天开始做web题目,发现前面的都好难,中间的都做过了,就随便挑了一道,发现竟然是去年做过的题目,只是因为flag提交了不对所以没交flag…一年过去了,没有学过python的我还是这么菜,有点难过…我为什么这么菜呢,可能因为我不专心吧…

题目内容是 - -1567173495060

可以看到响应头这里有个flag - -1567173561188

base64解码一下 - -

1567173627456

并且每一次刷新页面,flag_is_here:后面的值都会变。需要写脚本读取页面的flag参数的值然后再把后面的值传过去,注意这个base64可以解两次。

去年省赛的一道题目和这个很像,都是需要解码两次base64,小白的我只解一次脚本半天跑不出来,难过死了,,今年比赛估计一如既往地难过…说白了就是窝太菜了。

这道题传的脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import base64,requests
def main():
a = requests.session()
b = a.get("http://1d244bd2e1664e07b80cc2b714ddc1c4a12576508f544c34.changame.ichunqiu.com/")
key1 = b.headers["flag"]
c = base64.b64decode(key1)
d = str(c).split(':')
key = base64.b64decode(d[1])
body = {"ichunqiu":key}
f = a.post("http://1d244bd2e1664e07b80cc2b714ddc1c4a12576508f544c34.changame.ichunqiu.com/",data=body)
print (f.text)
if __name__ == '__main__':
main()

跑完脚本会给个路径:

1
3712901a08bb58557943ca31f3487b7d

进去看看 - -

1567173950524

是一个login页面,并且需要验证码,但是登录的username和password并不知道…用dirbuster扫一下

1
python3 dirsearch.py -u "http://56608d919c104308800865599180e0c3392214c297e54e30.changame.ichunqiu.com/3712901a08bb58557943ca31f3487b7d/" -e *

发现有svn源码泄露 - -

1567950991319

但是师傅们都是怎么找到wc.db文件的…萌新的我一脸懵逼…菜鸡不配写脚本,只能自欺欺人地假装跑一下23333 - -

1567952614236

username就有了 - -

1567174085010

password随便。验证地方的意思验证码md5加密后前六位是ecd7c7,需要写脚本:

1
2
3
4
5
6
7
8
9
10
11
#coding:utf-8
import hashlib
def md5(s):
return hashlib.md5(str(s).encode('utf-8')).hexdigest()
def main(s):
for i in range(1,99999999):
if md5(i)[0:6] == str(s):
print(i)
exit(0)
if __name__ == '__main__':
main("813e72")

跑一会儿就能出来,给出了下一个路径 - -

1567174334789

是一个文件上传,直接上传.pht文件就可以了 - -

1567175089728


CATALOG
  1. 1. Fuzzing
  2. 2. Wanna to see your hat?
  3. 3. Hello World
  4. 4. Upload