PHP安全配置(3)

2016-01-29 13:33 7 1 收藏

PHP安全配置(3),PHP安全配置(3)

【 tulaoshi.com - PHP 】

5、文件上传

php的文件上传机制是把用户上传的文件保存在php.ini的upload_tmp_dir定义的临时目录(默认是系统的临时目录,如:/tmp)里的一个类似phpxXuoXG的随机临时文件,程序执行结束,该临时文件也被删除。PHP给上传的文件定义了四个变量:(如form变量名是file,而且register_globals打开)

$file #就是保存到服务器端的临时文件(如/tmp/phpxXuoXG )
$file_size #上传文件的大小
$file_name #上传文件的原始名称
$file_type #上传文件的类型



推荐使用:

$HTTP_POST_FILES['file']['tmp_name']
$HTTP_POST_FILES['file']['size']
$HTTP_POST_FILES['file']['name']
$HTTP_POST_FILES['file']['type']



这是一个最简单的文件上传代码:

//test_5.php
if(isset($upload) && $file != "none") {
copy($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "文件".$file_name."上传成功!点击继续上传";
exit;
}
?



content="text/html; charset=gb2312"








这样的上传代码存在读取任意文件和执行命令的重大问题。

下面的请求可以把/etc/passwd文档拷贝到web目录/usr/local/apache/htdocs/test(注意:这个目录必须nobody可写)下的attack.txt文件里:

http://victim/test_5.php?upload=1&file=/etc/passwd&file_name=attack.txt

然后可以用如下请求读取口令文件:

http://victim/test/attack.txt

攻击者可以把php文件拷贝成其它扩展名,泄漏脚本源代码。

攻击者可以自定义form里file_name变量的值,上传覆盖任意有写权限的文件。

攻击者还可以上传PHP脚本执行主机的命令。

解决方法:

PHP-4.0.3以后提供了is_uploaded_file和move_uploaded_file函数,可以检查操作的文件是否是用户上传的文件,从而避免把系统文件拷贝到web目录。

使用$HTTP_POST_FILES数组来读取用户上传的文件变量。

严格检查上传变量。比如不允许是php脚本文件。

把PHP脚本操作限制在web目录可以避免程序员使用copy函数把系统文件拷贝到web目录。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。

把PHP脚本用phpencode进行加密,避免由于copy操作泄漏源码。

严格配置文件和目录的权限,只允许上传的目录能够让nobody用户可写。

对于上传目录去掉PHP解释功能,可以通过修改httpd.conf实现:


php_flag engine off
#如果是php3换成php3_engine off




重启apache,upload目录的php文件就不能被apache解释了,即使上传了php文件也没有问题,只能直接显示源码。

6、命令执行

下面的代码片断是从PHPNetToolpack摘出,详细的描述见:

http://www.securityfocus.com/bid/4303

//test_6.php
system("traceroute $a_query",$ret_strs);
?



由于程序没有过滤$a_query变量,所以攻击者可以用分号来追加执行命令。

攻击者输入如下请求可以执行cat /etc/passwd命令:

http://victim/test_6.php?a_query=www.example.com;cat /etc/passwd

PHP的命令执行函数还有system(), passthru(), popen()和``等。命令执行函数非常危险,慎用。如果要使用一定要严格检查用户输入。

解决方法:

要求程序员使用escapeshellcmd()函数过滤用户输入的shell命令。

启用safe_mode可以杜绝很多执行命令的问题,不过要注意PHP的版本一定要是最新的,小于PHP-4.2.2的都可能绕过safe_mode的限制去执行命令。

7、sql_inject

如下的SQL语句如果未对变量进行处理就会存在问题:

select * from login where user='$user' and pass='$pass'



攻击者可以用户名和口令都输入1' or 1='1绕过验证。

不过幸亏PHP有一个默认的选项magic_quotes_gpc = On,该选项使得从GET, POST, COOKIE来的变量自动加了addslashes()操作。上面SQL语句变成

来源:http://www.tulaoshi.com/n/20160129/1490597.html

延伸阅读
标签: PHP
今天,我们来侃侃PHP.INI文件中的一些有趣的内容吧。 PHP.INI文件相信每位PHP爱好者都不会陌生,在PHP的上一个版本PHP3.0中它被命名为PHP3.INI。用NOTEPAD打开它,文件通常在操作系统的Windows目录下。大家都看到,PHP.INI文件里面有很多分号,和Windows系统一样,这些分号用来表示注解,也就是说为了配置文件清晰易懂,开...
标签: PHP
在详细选项上,除了上述的安装简介外,也可以在编译时加入其它的选项。 apache模块 语法: --with-apache=DIR 说明: 用本选项可以让 PHP 以apache的模块方式使用,DIR 的字符串可以是 /usr/local/apache 或其它安装apache的目录 范例: --with-apache=/var/lib/apache fhttpd 服务器模块 语法: --with-fhttpd=DIR 说明:...
标签: PHP
今天,我们来侃侃PHP.INI文件中的一些有趣的内容吧。 PHP.INI文件相信每位PHP爱好者都不会陌生,在PHP的上一个版本PHP3.0中它被命名为PHP3.INI。用NOTEPAD打开它,文件通常在操作系统的Windows目录下。大家都看到,PHP.INI文件里面有很多分号“”,和Windows系统一样,这些分号用来表示注解,也就是说为了配置文件清晰易懂,开发者在分号...
标签: PHP
php.ini 或 php3.ini 是 PHP 在启动时会读取的配置文件。该文件的存放路径为 /usr/local/lib/。在 PHP 3.x 版的配置文件为 php3.ini;而在 PHP 4.x 版改为 php.ini。若 PHP 安装成服务器的模块,则在 Web 服务器启动执行时会读取,之后就不再读取,因此改动配置的话要重新启动 Web 服务器。若使用独立 PHP CGI 方式,则每次都读一...
标签: Web开发
1. 所需软件环境: 1. apache 2.2  2. active perl 5.8  c:perl 3. php 5.1  必须安在 c:php 4. ZendOptimizer-3.0.2  5. php环境所需 includes  --在 php 安装之后,无法正常运行时必须的库。 ----------------------------------------------- 2. apache 2.2--------httpd.conf ...

经验教程

338

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部