“百度杯”CTF比赛 十月场 fuzzing

前言

这题并没有什么特别难的地方,考察的点也不算很深,自己主要还是知识面太窄和思考问题太死板上面。

WP

首先进入环境,提示there is nothing。f12查看源码,用dirsearch扫,试试备份文件也找不到什么,只能Burp抓包看看,发现了相应头里有提示:

hint: ip,Large internal network

这和ip有关,自己一开始也以为是x-forwarded-for,试了127.0.0.1然后没什么用,然后就卡住了。其实这样还是自己知识面的问题,自己对于内网的了解实在太少了。这里其实考察了常见的内网ip。以下IP段为内网IP段:
192.168.0.0 - 192.168.255.255
172.16.0.0 - 172.31.255.255
10.0.0.0 - 10.255.255.255
可以把192.168.0.0,192.168.255.255,172.16.0.0 ,172.31.255.255,10.0.0.0,10.255.255.255都试一试,还是不行就要去区间内扫了。当尝试为10.0.0.0的时候,发现成功了,被重定向到了新的页面,这个页面提示show me your key。

其实这样的一般都是只要你给了key,就会有回显来提示你key应该是什么样的。我们get传key没回显,可能需要触发一些关键字,经过尝试后还是不行,果断换post请求,果然出现回显:

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

因此这里用脚本来爆破,脚本如下:

import hashlib
a='ichunqiu'
for v1 in 'abcdefghijklmnopqrstuvwxyz0123456789':
    for v2 in 'abcdefghijklmnopqrstuvwxyz0123456789':
        for v3 in 'abcdefghijklmnopqrstuvwxyz0123456789':
            v=a+v1+v2+v3
            m=hashlib.md5()
            m.update(v.encode("utf-8"))
            n=m.hexdigest()
            if n=='1b4167610ba3f2ac426a68488dbd89be':
                print(v)

成功获得key是ichunqiu105。
post传入之后提示the next step: xx00xxoo.php
进入后提示源码在x0.txt。我们读取一下源码,这里我手动加上了<?php:

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

}

然后就是读题了。这题我真的是脑子有病,我看到authcode(flag) is xxxxx,我以为是让我逆向推出传入这个函数的string是什么。我以为string就是flag。其实仔细想想,这个源码应该是解密的,那个autocode(flag)是对flag加密得到了后面的很长一段东西,然后源码里的第二个参数是DECODE也提示了我们这是个解密函数,我们需要把很长的那段当作string放进函数。key的话,题目让我们guess这个key,之前不是爆破出了key是ichunqiu105吗,因此直接解密就可以得到flag:

$authcode='a070X36JDpmM5Mq10DAI0+JpmE65OyM71CgJweCW3cvO3v/aJDGeA2Dz117Lo4JKAWeCH+iD1kyHHgvRt3ErIuUzRuqXEyM';
$r=authcode($authcode,'DECODE','ichunqiu105');
echo $r;

总结

这题体现了自己的内网知识面很窄,而且读题也有问题。自己也做了一些题目了,真正需要逆向解密的给的函数不会这么长。其实自己一看到这个函数这么复杂这么长,就应该想到不可能是让自己逆向解密的,只可能是正向。所以说,自己的做题思维也有问题,真的需要多加思考。

猜你喜欢

转载自blog.csdn.net/rfrder/article/details/108932955