乔悟空-CTF-i春秋-Web-GetFlag

2020.09.07

今天发生了一些事情,世事无常,哎。好好的享受当下,该吃吃该喝喝好吧。人活一辈子,到底为了啥?

做题

题目

题目地址

做题

  1. 这个题目还行,思路比较清晰,没那么多奇怪的脑洞🙄,看见验证码中的提示,意思已经很明白了,就是让你去找一个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()
  1. 刷新界面,找到这个六位数验证码,替换掉脚本中的对应内容,分分钟就出结果,多线程就是快😑
  2. 在火狐上输入验证码,测试是否有SQL注入存在,验证结果是存在最简单的注入漏洞admin' OR '1'='1,我一开始用的1' OR '1'='1显示错误,瓜皮……
  3. 成功注入之后就能进入/Challenges/action.php?action=file,这个界面下有三个文件可以下载,当然,只有一个文件有点用,告诉我们flag在服务器根目录中web root dir

  4. 这个地方我走了弯路,我总想着用上边那个界面去下载根目录下的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");
}
?>
  1. 看到最后出来一个helloctf.php,我寻思直接用第5步的方法下载下来不就完了,然而出题人早就料到了😪当然,我也料到了他应该早就料到了🥱

  2. 构造payloadflag='flag';,这里又个坑,就是flag后边要加分号;,因为eval方法中的字符串要成句才能执行,因此这里的分号不可缺少。

  3. 响应的还是空白页面……不看源码还以为做错了🤐

总结

  1. python多线程第一次接触,挺好
  2. 以后这种求截取md5前几位的数值的就会了,一开始想太多了,以为不知道明文是数字还是字符,这怎么求,后来一想,只要结果前几位能对得上不就完了……
  3. eval()办法中参数要是完整的php语句才能正确执行
  4. stripos(a,b)方法返回b字符串在a中首次出现的位置,并且是从0开始算的,所以如果这里是false!=stripos($f, 'return')的话,完全可以构造return返回一个flag。
  5. 以后sql注入用admin比较好……
  6. 我一开始爆破出了action=file,但是提醒需要先登录,我想知道他是怎么判断这个用户是否登陆了的,是不是在cookie中或者其他地方做了标记呢?要是能看到源码就好了……
posted @ 2020-09-08 00:45  乔悟空  阅读(428)  评论(0编辑  收藏  举报