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

    科技2022-08-31  131

    前言

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

    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('0d', $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;

    总结

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

    Processed: 0.008, SQL: 9