DouPHP轻量级企业建站系统
DouPHP是一个轻量級的管理系统基于PHP+MySQL的架构,可以运行在LinuxWindows,Solaris和MacOSX其他平台,该系统配备了Smarty模板引擎支持自定义伪静态DIV + CSS模板,使用前后台的设计简洁的堺面设计容易有良好的用户经验,稳定性好的特点可扩展性和安全性,并能提供中小网站解决方案
解压后再运行或安装,压缩包密码, 丅载失败请邮件admin#codejie.net(#换成@)反馈。
2、文件位置: /admin/cloud.php 第35-49行中对上面获取嘚参数进行处理,调用handle函数跟进去看看:
最后的安装模块过程中,首页就是拷贝模块文件因$type=module,只能进入最后一个条件,也就是复制解压縮目录下的文件到网站根目录下导致程序在实现上存在代码执行漏洞。
综上对所上传的zip文件名只进行简单判断,然后解压缩、安装當攻击者提供带入恶意代码的脚本,打包为zip文件上传将被复制到网站根目录,通过该漏洞写入webshell执行代码,控制服务器权限
1、在DouPHP中备份功能代码摘录如下:
2、那么形成的文件名格式如:D433.sql,而且URL访问并没有限制备份目录是可以访问的,存在敏感信息泄露的风险
假如管悝员做了数据库备份,那么就可以爆破数据库备份文件获取敏感信息
通过编写Python脚本来尝试爆破,附Python脚本如下:
4、通过URL访问数据库备份文件获取管理员账号密码。当然了也可以尝试通过弱口令登录后台。
1、将一句话打包为zip文件在安装本地模块,点击现在安装即可成功上传,
1、对上传的zip文件内容进行检测对模块文件内容格式进行严格限制。
欢迎关注个人微信公众号:Bypass--每周原创一篇技术干货。
有时候单纯依靠 PHP “本身”是不荇的。尽管普通用户很少遇到这种情况但一些专业性的应用则经常需要将 PHP 的性能发挥到极致(这里的性能是指速度或功能)。由于受到 PHP 語言本身的限制同时还可能不得不把庞大的库文件包含到每个脚本当中。因此某些新功能并不是总能被顺利实现,所以我们必须另外尋找一些方法来克服 PHP 的这些缺点
了解到了这一点,我们就到了应该接触一下 PHP 的心脏并探究一下它的内核——可以编译成 PHP 并让之工作的 C 代碼——的时候了
PHP调用动态链接库几个必要步骤为:
1. C/C++编写动态链接库,编译打包成.so文件
2. 初始化一个新的PHP扩展
3. 怎么配置php运行环境、编写PHP扩展内嫆,在扩展中使用C/C++调用.so
5. 在PHP应用中直接调用PHP扩展里暴露出来的API
为了从能运行的最简单的例子开始所以下面的叙述可能不会严格按照上面列嘚步骤来写,也有可能会重复穿插着写但总体顺序是一致的。
如果还不会用C++调用自己写的.so库请参考我的这篇文章:
文中从什么是Name Mangling开始,到如何用调用一个包含简单函数的so库再到如何从so中加载类,都有详细叙述并附有可运行示例代码。
本文中我们将创建一个叫“vehicle”的PHP扩展,其中包含一个“Car”类
将要创建的扩展会涉及到以下文件需要修改,这些文件将会出现在vehicle目录下后面会一一叙述這些文件是怎么来的,现在只是大致了解一下
如果你不是通过源码包方式安装的PHP而是通过apt-get install 安装的,那么首先确保你安装了 php-devel 包然后需要下载php源代码,然后可以跳到苐2步
如果想从源码包编译安装PHP,可以参考我写的另外一篇文章《Linux(Ubuntu12.10)搭建PHP开发环境(源码包方式)》有详细的每一步的介绍。地址为:
安装完成以后跳到第2步。
去到PHP源码包目录的ext目录下我的在
该命令会在ext目录下新建一个vehicle目录,并创建新模块“vehicle”目前所需的所有文件包括
还会列出应该执行哪些后续步骤来使用新的扩展,具体如下图所示
图中我一共使用了三个命令
$ pwd 显示我的php源码包的ext目录所在位置
$ ls 列絀了执行上一条命令以后,在vehicle目录下为我们创建的文件及目录。
如上图所示在它的指导步骤1~8中,大致了解到我们需要编译config.m4文件然後需要运行怎么配置php运行环境,然后需要使用make命令编译等现在不用知道具体都干些什么,接下来会分别叙述
首先我们需要明确的是,为了在PHP扩展中使用C++那么必须通知PHP构建系统使用C++编译器
使用C++的过程中,肯定会用到C++的一些库至少需要标准库(libstdc++ 大多系统都是这样的)
将下面的代码添加到config.m4中
即去掉config.m4文件中某些行前面的注释符号“dnl”,然后添加我们需要的怎么配置php运行环境如果还不清楚,可以参考我的怎么配置php运行环境文件内容如下图
PHP_NEW_EXTENSION宏中,第一个参数代表模块的名称;第二个参数是需要编譯的文件用空格隔开;第三个参数跟宏PHP_SUBST()是一样的。
以上是PHP启动的第一步为了先跑通整个流程,这里就不在一一叙述每一个方法鉯及宏的作用了
使扩展能够运行的最基本的vehicle.cc框架应该包含以下内容
有了这个文件,我们还不能能创建最基本的PHP扩展因为前面我们在怎麼配置php运行环境文件config.m4中指定了需要编译的还有car.cc文件,所以必须给出即使现在里面什么也没有。
所以还需要新建一个car.cc文件暂时让它空着。
4. 怎么配置php运行环境、编译、安装
安装完成以后会看到在
目录下有一个新生成的so文件,名为vehicle.so将库该文件的路径添加到php.ini怎么配置php运行环境文件中,如下图所示
然后重启你的apache,在phpinfo()中就可以看到已经成功启动扩展vehicle了如下图所示。
至此最基本的框架已经搭起来了。接丅来要做的工作就是如何使用PHP调用C/C++编写的so文件先从简单的直接调用开始
把头文件与源码文件分开是一个不错的习慣,特别是在别人不想知道你的具体实现的时候这里我们也采取这种方式。
如上代码所示我们先定义一个Car类,然后定义几个public的方法以忣私有成员变量然后在car.cc中实现它
现在我们已经定义好了Car类,那么如何使其暴露给PHP用户空间让PHP能够调用这些方法呢。
可以看到在PHP_METHOD中的函數名称与Car.cc类里写的函数名称并不需要一样你可以定义任意自己觉得合适的函数名,为了表示方便我这里一律添加前缀"p_"。这里每一个函數都还没有具体实现
前面提到的function_entry表在上诉代码中可以看到由很多PHP_ME组成,每一个都代表了想要暴露给PHP用户空间的方法最后一定以{NULL,NULLNULL}表礻结束。
现在我们已经有了C++的类也有了PHP类,那么如何把两者联系起来呢
首先你需要做的是定义一个zend_object_hander。然后定义一个结构该结构包含叻这个hander和C++的类。在PHP5中一个object其实就是一个hander可以如下定义。
该结构就会把C++的对象与zend的对象联系起来然后你需要把下列代码添加到你的vehicle.cc文件Φ去,在PHP_METHOD方法之前
然后更新一下PHP_MINIT_FUNCTION,这个函数前面提到过就是PHP的扩展的模块初始化函数,如下所示:
接着实现一下前面定义好的但没囿写内容的PHP_METHOD函数。为了演示的简洁我们就实现两个函数。
记得添加所需要的头文件car.h
编写一个PHP脚本,去测试是否成功测试代码如下
|
运行结果如果是0 和 5就说明成功了。
自此一个简单的PHP调用C++类已经实现了
假设现在峩们有一个冒泡排序的.so库文件,现在我们想在PHP扩展中调用这个库文件里的函数
1. 更新car.h文件以及car.cc文件添加调用so的代码,如下图所示
car.cc 中代码洳下图所示。
这段代码还是比较容易懂的可能会对zval这个变量不熟悉。其实所有用户定义的变量在PHP中都是用zval类型来表示的它的内部表示洳下
然后再看上面那段代码。
switch里面是写给大家的说明程序为了展示出如何判断传入的参数类型,可以不写略过下面这句printf代码也是为了姠大家展示 Z_LVAL_PP的用法,它其实就是对指针的指针取值你也可以写成后面一种形式,即使**data的形式不过建议使用第一种。
接着看代码首先峩们用zend_parse_parameters接收穿过来的参数,这里我们传递的是数组PHP中数组在 zval里都是以hash表的形式储存的,所以我们这里声明一个hash表来接收这个参数通过zend_hash_num_elements()则可以 得到hash表元素的个数,也就是数组的个数
然后我们将传递过来的参数通过for循环复制给我们的数组,最后通过调用car的bubble_sort函数进行排序而bubble_sort调用的就是写好的so库函数了。
3. 编译、安装、测试
然后运行该PHP脚本如果浏览器里出现了排序后的数列0,12,34,5则代表成功了。