代码审计-1 开始审计前的准备&重装漏洞

开始审计前的准备

获得源码
很多PHP程序都是开源的、找到官网下载最新的源码包就好了(站长之家,A5源码)安装网站

安装网站
在本地搭建网站,一边审计一边调试。实时跟踪各种动态变化

网站结构
浏览源码文件夹,了解该程序的大致目录入口文件

入口文件
index.phpadmin.php文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑

配置文件
一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息

敏感函数回溯参数过程

直接使用工具可以扫出一些敏感的参数:

在这里插入图片描述

例如:
1)通过selectinsert结合fromwhere等关键字,判定是一条SQL语句,然后通过对字符串的识别,判断这个SQL语句里边的参数有没有拼接或者单引号过滤。

2)HTTP头里边的HTTP_CLIENTHTTP_X_FORWARDFOR 等获取到的IP地
址经常没有过滤就直接拼接到了SQL语句中,并且因为是在$_SERVER
量中,不受GPC的影响,因此可以查找HTTP_CLIENTHTTP_X_FORWARDFOR
关键字来快速寻找漏洞。

代码审计之重装漏洞

在这里插入图片描述在这里插入图片描述

VAuditDemo重装漏洞

重装

打开install.php文件查看

首先此处,判断完lock文件后直接进行的重定向,没有exit结束,所以install.php下面还是会继续执行的

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

只需要自己搭建环境,用burp拦截,将安装的请求包复制下来,然后将host改成目标的地址就可以对目标进行重新安装了

在这里插入图片描述
恶意代码写入配合重装

install.php此处将POST数据接收后没有过滤直接复制给了变量$dbname

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 );

此处将字符串进行拼接,拼接成php文件的形式赋值给变量$str_tmp,其中就包括$dbname变量
然后打开config.php文件,将变量中的内容进行写入

在这里插入图片描述
config.php文件中的内容

在这里插入图片描述
安装时burp抓包,对dbname的值进行修改

在这里插入图片描述

发送数据包

在这里插入图片描述此时我们再看config.php中的内容
在这里插入图片描述vauditdemo-- -";phpinfo();//";

payload分析:

因为没有做过滤,所以$dbname的值被用户恶意写入,然后又将$dbnameconfig.php中赋给$database

当程序去用$dbname中的值去创建数据库时,由于-- -符号为mysql中的注释符,所以后面的字符不会被当作数据库的名称带入,就不会报错。

config.php中在给$database赋值时,";对前面的赋值操作进行了拼接,让后面的恶意代码成功执行

zswin重装漏洞

首先正常打开安装界面进行安装

在这里插入图片描述在这里插入图片描述

我们来看一下install安装那块的代码

在这里插入图片描述
这个函数写了当安装成功存在lock文件时,将页面重定向并且执行exit

但是这个函数并不是类的初始化函数,并没有被调用,也就是说if判断重定向、还有exit结束都是不起作用的

安装成功后当我们再去访问安装界面路径时,可以看到并没有重定向,这里可以证明重装漏洞确实存在

在这里插入图片描述
在install安装中的代码,此处是直接将从$_POST获取的数据,给了$config_data这个数组,然后放到write_config函数中去执行

在这里插入图片描述

我们追踪一下write_config函数

在这里插入图片描述
此函数将conf.tpluser.tpl的内容读取出来,然后进行替换

conf.tpluser.tpl中和数组config索引相同的字符串,替换成对应的索引的值,替换后分别写入两个config.php

就是将读取的conf.tpluser.tpl中的这些

在这里插入图片描述
在这里插入图片描述
替换成索引对应的值,也就是替换成之前$_POST传入的对应的值,然后分别写入到app/common/conf/config.phpapp/user/conf/config.php

user.tpl文件与app/user/conf/config.php文件与对比
在这里插入图片描述在这里插入图片描述

上面也说过$_POST提交的数据是没有做过滤的,所以当我们提交时什么样,写到config.php文件里也是同样的

此时我们就可以在提交表前缀处构建闭合语句,去闭合app/user/conf/config.php);

在这里插入图片描述

提交完成后再看app/user/conf/config.php,语句已经插入成功

在这里插入图片描述
对路径进行访问,phpinfo()执行成功

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值