2020.09.07
今天发生了一些事情,世事无常,哎。好好的享受当下,该吃吃该喝喝好吧。人活一辈子,到底为了啥?
做题
题目
做题
- 这个题目还行,思路比较清晰,没那么多奇怪的脑洞??,看见验证码中的提示,意思已经很明白了,就是让你去找一个md5值前六位是指定值的数(严格来说不一定是数),所以在网上白嫖了大佬的脚本:
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()
- 刷新界面,找到这个六位数验证码,替换掉脚本中的对应内容,分分钟就出结果,多线程就是快??
- 在火狐上输入验证码,测试是否有SQL注入存在,验证结果是存在最简单的注入漏洞
admin‘ OR ‘1‘=‘1
,我一开始用的1‘ OR ‘1‘=‘1
显示错误,瓜皮…… - 成功注入之后就能进入
/Challenges/action.php?action=file
,这个界面下有三个文件可以下载,当然,只有一个文件有点用,告诉我们flag在服务器根目录中web root dir
- 这个地方我走了弯路,我总想着用上边那个界面去下载根目录下的flag.php,因为在存在一个
./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步的方法下载下来不就完了,然而出题人早就料到了??当然,我也料到了他应该早就料到了?? -
构造payload
flag=‘flag‘;
,这里又个坑,就是flag后边要加分号;
,因为eval方法中的字符串要成句才能执行,因此这里的分号不可缺少。 -
响应的还是空白页面……不看源码还以为做错了??
总结
- python多线程第一次接触,挺好
- 以后这种求截取md5前几位的数值的就会了,一开始想太多了,以为不知道明文是数字还是字符,这怎么求,后来一想,只要结果前几位能对得上不就完了……
- eval()办法中参数要是完整的php语句才能正确执行
- stripos(a,b)方法返回b字符串在a中首次出现的位置,并且是从0开始算的,所以如果这里是
false!=stripos($f, ‘return‘)
的话,完全可以构造return返回一个flag。 - 以后sql注入用admin比较好……
- 我一开始爆破出了
action=file
,但是提醒需要先登录,我想知道他是怎么判断这个用户是否登陆了的,是不是在cookie中或者其他地方做了标记呢?要是能看到源码就好了……