PHP泛安全

2016-01-29 14:16 3 1 收藏

PHP泛安全,PHP泛安全

【 tulaoshi.com - PHP 】

/*---------------
*Author:xy7
*Data:2006/11/1
*---------------
*/


如今基于PHP的WEB程序是越来越安全了,php.ini默认时的 magic_quotes_gpc=on就在初始安全性上提高了一个档次.很多程序在接受到用户的输入时都会提前判断一下 get_magic_quotes_gpc() 即使这个开关没有开就马上addslashes()函数跟上进行转义,所以想在PHP程序中找到一个类似与以前ASP注入那样的漏洞是比较不容易的.
对于PHP的跨站其实也很好防范,用 htmlentities() 就可以了,不过当处理XML文件时采用这个函数可能会出现些问题,只需手工转换下那5个元字符就可以了。举个例子,以前写过篇文章关于XML文件隐患的,其实就是CDATA部件的问题,现在比较流行的说法是AJAX hacking,大概说下,看看以下代码:
if ($rssid == 0 OR $rssid == 7) {
} elseif (!empty($stmt)) {
    $dbinfo =& $db-getResultSet($stmt, array('pageSize'=$pagesize));
    if ($dbinfo === false) {
        $msginfo = str_replace(']]', ']]', $lang['tpl.str0']);
        $TPL_items .= <<<EOT
        <item
            <title{$msginfo}</title
            <link{$fsetting['forumurl']}</link
            <author{$fsetting['forumname']}</author
            <pubDate{$datenow}</pubDate
            <description<![CDATA[{$msginfo}]]</description
        </item
EOT;
$msginfo是用户提交的,然后被程序写进RSS里以用来聚合,如果$msginfo的值为<sciriptalert('loveshell')</script时,RSS聚合解析后会原样输出,如果为]]<sciriptalert('loveshell')</script时,就可以跨站了,看看他的过滤:
if ($dbinfo === false) {
        $msginfo = str_replace(']]', ']]', $lang['tpl.str0']);
很好意识到了这点,可是这句呢<title{$msginfo}</title,意识到问题所在很关键,重要的是要理解问题.

可是还是有很多会被程序员疏忽的地方,这是安全意识的问题,对于用户的任何输入,在写程序时脑子里都要提前做个思考:用户的输入是什么类型的?用户会有哪些输入方式?怎么处理用户的错误和非常规输入?
PHP的安全还体现在Safe Mode 和openbase-dir上.即使这样基于PHP底层的一些漏洞还是会直接影响到这两个非常重要的安全选项.举个例子:
比如error_log() Safe Mode Bypass
看他的语法:bool error_log ( string message [, int message_type [, string destination [, string extra_headers]]] )
输出错误信息到一个文件,可以这样写
<?
error_log("<? phpinfo();?", 3, "test.php");
?
运行在safe_mode关闭的情况下,直接访问test.php就可以看到phpinfo了,当safe_mode开的时候就会报错,再这样写:
<?
error_log("<? phpinfo();?", 3, "prefix://../../test.php");
?可以看到phpinfo又被执行了
看下漏洞代码:
PHPAPI int _php_error_log(int opt_err, char *message, char *opt, char *headers TSRMLS_DC)

{

php_stream *stream = NULL;

switch (opt_err) {

case 1: /*send an email */

{

#if HAVE_SENDMAIL

if (!php_mail(opt, "PHP error_log message", message, headers, NULL TSRMLS_CC)) {[next]

return FAILURE;

}

php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mail option not available!");

return FAILURE;

}

break;

case 2: /*send to an address */

php_error_docref(NULL TSRMLS_CC, E_WARNING, "TCP/IP option not available!");

return FAILURE;

break;

case 3: /*save to a file */

stream = php_stream_open_wrapper(opt, "a", IGNORE_URL | ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL);

if (!stream)

return FAILURE;

php_stream_write(stream, message, strlen(message));

php_stream_close(stream);

break;

default:

php_log_err(message TSRMLS_CC);

break;

}

return SUCCESS;

}
可以看到error_log函数的核心就是 php_stream_open_wrapper()函数,问题也就出在保存错误信息

来源:https://www.tulaoshi.com/n/20160129/1492922.html

延伸阅读
我学这些东西的时候在网络上查了很久,感觉都很专业,初学者难以理解什么时候用,也很难找到简单的介绍,稍微整理一下下:  ------------------------------------------------------------------------------------------------------------------------------------------------------------ 反射 : Reflection 1. 基类调用派生类时候...
标签: PHP
一、Web服务器安全 PHP 其实不过是Web服务器的一个模块功能,所以首先要保证Web服务器的安全。当然Web服务器要安全又必须是先保证系统安全,这样就扯远了,无穷无尽。PHP可以和各种Web服务器结合,这里也只讨论Apache。非常建议以chroot方式安装启动Apache,这样即使Apache和PHP及其脚本出现 漏洞 ,受影响的也只有这个...
标签: Web开发
可以读/etc/passwd! 这段。。 [文件上载] PHP自动支持基于RFC 1867的文件上载,我们看下面的例子: FORM METHOD="POST" ENCTYPE="multipart/form-data" INPUT TYPE="FILE" NAME="hello" INPUT TYPE="HIDDEN" NAME="MAX_FILE_SIZE" VALUE="10240" INPUT TYPE="SUBMIT" /FORM 上面的代码让用户从本地机器选择一个文件,当点击提交后...
标签: PHP
有时候,您的业务可能涉及到 PHP 应用程序的安全性。当您遇到审计任务时,您知道如何执行查找吗?本系列将带您进入 PHP,并帮您在一定程序上了解它,让您在进行安全审计时知道查找什么。第 1 部分向您介绍 register_globals 设置。 入门知识 我在此假定您对 PHP 的语法有一个大致的了解,至少能够编写...

经验教程

476

收藏

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