分类: LINUX
2009-12-12 01:14:27
Php已经成为当前网络中使用最多的数据库之一,特别是在Web应用上,它占据了中小型应用的绝对优势。这一切都源于它的小巧易用、它的安全有效、它的开放式许可、它的多平台,更主要的是它与三大Web语言之——PHP的完美结合。但不幸的是,一个缺省安全的Php,会因为设置不当,造成灾难性的后果。
第一个重要的参数是register_globals. 这个配置影响到php如何接收传递过来的参数,说白了register_globals的意思就是注册为全局变量,所以当该参数为值On的时候,传递过来的值会被直接的注册为全 局变量直接使用,而当该参数值为Off的时候,我们需要到从特定的数组里去得到它.操作
修改php.ini文件,设置register_globals=off
当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML 表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。这是个很艰难的抉择,但 PHP 社区还是决定默认关闭此选项。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是 register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。
当 magic_quotes_gpc=off ,写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。对于未经处理的单引号在写入数据库时会使sql语句发生错误。当 magic_quotes_gpc=on 写入数据库的字符串未经过任何处理。从数据库读出的字符串未作任何处理。magic_quotes_gpc=on 将单引号转换为’的转义字符使sql语句成功执行,但’并未作为数据入数据库,数据库保存的是snow”’’sun而并不是我们想象的 snow”’’sun。
修改php.ini文件,设置register_globals=off
php的 display_errors参数就是帮助开发者定位和确定这些错误的。容易使提供的这些信息被恶意攻击者采集信息。
操作
修改php.ini文件,设置display_errors =Off
php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system()等函数,同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的访问,比如/etc/passwd,但是默认的 php.ini是没有打开安全模式的,我们把它打开。safe_mode = on。
操作
修改php.ini文件,设置safe_mode = on 开启PHP的安全模式
open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了webshell的跨站攻击。
操作
修改php.ini文件,设置open_basedir=网站路径。
变量disable_functions能过滤一些危害性很大的system,exec等函数。
操作
推荐过滤的函数如下。
disable_functions = phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server。
popen,pentl_exec,passthru,exec,system,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,show_source,escapeshellcmd,escapeshellarg,curl_exec,curl_multi_exec,parse_ini_file,assert
但需要设置另两个参数safe_mode =on;safe_mode_gid =on
禁用Com组件,Windows平台下的PHP脚本平台存在一个安全漏洞,使得PHP设置即使在安全模式下(safe_mode),仍旧允许攻击者使用COM()函数来创建系统组件来执行任意命令。漏洞出现的原因是由于在安全模式下的PHP平台虽然system();pathru()函数被禁止,但是com.allow_dcom的设置依旧是为true。以至于攻击者可以使用COM()函数创建系统组件对象来运行系统命令。
操作
1、卸载wscript.shell对象
在cmd下运行:regsvr32 WSHom.Ocx /u
2、卸载FSO对象
在cmd下运行:regsvr32.exe scrrun.dll /u
3、卸载stream对象
在cmd下运行:
regsvr32 /s /u “C:Program FilesCommon FilesSystemadomsado15.dll”
恢复的话,去掉/u就行了
如Wscript.Shell就用在regsvr32 WSHom.Ocx就行了