这道题有点意思 是SSI 漏洞
照样 我们先熟悉SSI漏洞是什么
服务端包含
- SSI 提供了对现有html增加动态的效果
-
- 是嵌入 html的指令 只有网页被调用了 才会执行
-
- 允许执行命令 所以会造成rce
- 当文件上传的时候 无法上传php
-
- 但是服务器开启了 SSI CGI支持
-
- 就可以通过 shtml文件上传
-
-
- Web 服务器已支持SSI(服务器端包含)
-
-
- Web 应用程序未对相关SSI关键字做过滤
-
-
- Web 应用程序在返回响应的HTML页面时,嵌入了用户输入
了解完了漏洞原理 我们开始做题
打开网站 登入界面 我们会想到 弱口令 无果 sql注入 不存在注入点 robots.txt 不存在
于是我们看看是不是存在其他文件
我们使用dirsearch扫 无果 奇了怪了 完全不行啊
后面使用另一个工具才扫出来备份文件
- <?php
- ob_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 "";
- $file_shtml = "public/".get_hash().".shtml";
- $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
- $text = '
- ***
- ***
-
Hello,'
.$_POST['username'].' - ***
- ***';
- fwrite($shtml,$text);
- fclose($shtml);
- ***
- echo "[!] Header error ...";
- } else {
- echo "";
-
- }else
- {
- ***
- }
- ***
- ?>
直接代码审计 这里其实就两块
- $admin = '6d0bc1';
- if ( $admin == substr(md5($_POST['password']),0,6))
通过MD5加密后的值需要前6位和admin变量中一样
直接python代码
- import hashlib
-
- for i in range(100000000):
- hashe=hashlib.md5(str(i).encode('utf-8')).hexdigest()
- if hashe[0:6]=="6d0bc1":
- print(i,hashe)
- 2020666 6d0bc1153791aa2b4e18b4f344f26ab4
- 2305004 6d0bc1ec71a9b814677b85e3ac9c3d40
随便选一个 作为密码登入即可
- $file_shtml = "public/".get_hash().".shtml";
- $shtml = fopen($file_shtml, "w") or die("Unable to open file!");
- $text = '
- ***
- ***
-
Hello,'
.$_POST['username'].' - ***
- ***';
- fwrite($shtml,$text);
- fclose($shtml);
- ***
- echo "[!] Header error ...";
- }
创建一个 shtml后缀 对内容进行写入 内容是 username的内容 写入完成输出 header error
这里就是用上面的SSI 漏洞来做了
返回username
抓包 然后写入代码
然后访问右边的路径
实现了rce
现在找flag就行了
学到了学到了 SSI 漏洞