修改php源码防止Webshell跨目录浏览文件(防跨站)

php的Webshell能够实现浏览网站目录、修改网站文件、数据库查询、修改、下载等等,做为个人工具可谓功能完善且强大,做为黑客工具可谓功能恐怖,危害极大!做网站需要在各个方面做好安全防御。

首先,修改PHP源码后重新编译PHP环境

tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
cd php-5.2.14/
然后编辑文件main/fopen_wrappers.c,找到 php_check_open_basedir_ex 函数的定义部分,大约在 220行。在如下代码之后插入修改代码
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
	/* Only check when open_basedir is available */
	if (PG(open_basedir) && *PG(open_basedir)) {
		char *pathbuf;
		char *ptr;
		char *end;
		//从此处开始插入修改代码
插入的修改代码为:

char *env_doc_root;
if(PG(doc_root)){
        env_doc_root = estrdup(PG(doc_root));
}else{
        env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
}
if(env_doc_root){
        int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
        efree(env_doc_root);
        if (res_root == 0) {
                return 0;
        }
        if (res_root == -2) {
                errno = EPERM;
                return -1;
        }
}
修改完成的样子:

PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
	/* Only check when open_basedir is available */
	if (PG(open_basedir) && *PG(open_basedir)) {
		char *pathbuf;
		char *ptr;
		char *end;
		//增加代码.开始
                char *env_doc_root;
                if(PG(doc_root)){
                        env_doc_root = estrdup(PG(doc_root));
                }else{
                        env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
                }
                if(env_doc_root){
                        int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
                        efree(env_doc_root);
                        if (res_root == 0) {
                                return 0;
                        }
                        if (res_root == -2) {
                                errno = EPERM;
                                return -1;
                        }
                }
		//增加代码.结束
		//原文件其他代码...

保存退出后,继续编译、安装即可

然后修改php.ini中 open_basedir配置

open_basedir = "/tmp/:/var/tmp/"

以上,修改编译php和修改php.ini配置的目的在于,将php脚本的允许操作区域限制于自身目录和/tmp+/var/tmp之下,
不允许它随意对其他目录进行操作。
这样Webshell的活动区域就受限了,也就无法修改其他目录文件或挂马,
无法继续找到数据库配置文件进而对数据库进行操作。

关键词: 防跨站 , php

上一篇: 利用hh.exe反编译CHM电子书为HTML格式 BAT版
下一篇: ubuntu12.04下搭建LVS负载均衡(dr模型)附shell脚本,超简单

目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):