文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Discuz开源论坛_v3.4系列_远程代码执行漏洞详解

2023-08-31 08:27

关注

一、什么是远程代码执行漏洞?

       远程代码执行漏洞是一种安全漏洞,攻击者可以利用该漏洞在远程服务器上执行恶意代码。这种漏洞通常是由于应用程序没有正确地过滤用户输入或者没有正确地验证输入数据而导致的。攻击者可以通过发送恶意请求或者注入恶意代码来利用这种漏洞。一旦攻击者成功利用了该漏洞,他们可以执行任意的代码,包括但不限于窃取敏感数据、修改数据或者破坏系统。

二、Discuz论坛漏洞前期搜集

       Discuz X3.4更新版本最大的更新亮点是将论坛升级模块权限单独给予用户,这直接方便用户可以自主决定选择任意版本进行论坛更新或进行版本转换。依靠此切入点,开始分析X3.4版本的升级模块源代码。

三、Discuz_远程代码执行漏洞代码审计   

       定位到Utility/convert/include/do_config.inc.php,该文件正对应其升级/转变模块源代码文件,发现了疑似函数用于接收用户的指令。

       如图3-1所示,在A点创建了Config.inc.php文件,B点对创建的文件进行初步检查,C点的Submitcheck()函数定义在Include/global.func.php中,D点的变量Newconfig取得了用户的请求,并在If语句中进行了字符的检查,E点的Save_config_file()函数会将数据信息保存到Config.inc.php中。

图3-1  Do_config.inc.php文件代码审计

       跟随Submitcheck()函数所在位置来到Include/global.func.php文件,首先发现save_config_file()函数。

        A点的Setdefault将Config变量中的空白用Default来代替,而上文中的Newconfig恰是用来获取用户请求的,说明此处的行为是将空白直接赋值给Newconfig数组中的对应空白项,B点发现一个getvars函数,将变量Config的内容变成Newconfig的内容,如图3-2所示。

图3-2  Global.func.php文件代码审计01

       继续跟进Getvars()函数,如图3-3所示。分析代码了解是将用户的请求数据进行种类的转换,并进行关键过滤,再次发现一个Buildarray()函数,其参数Key恰是经过Getvars()函数进行过滤后的数据

       其中,A点进行了单个数据的种类过滤,B点是过滤后调用Buildarray()函数,C点为Buildarray()函数进行foreach循环过滤。D点发现了漏洞风险点,源代码本意是使用config数组的单个数据Key作为每一块配置区域的“标题”,从而将Key数据写入到配置变量Newline中,但是所依赖的Key确是用户本身可控的。E点直接将Newline的数据进行返回写入,并没有进行数据过滤和安全的边界处理,因此可以借助换行符\r绕过注释的作用范围,从而实现代码的注入。

图3-3  Global.func.php文件代码审计02

       至此,通过Buildarray()函数可初步确定如果利用升级模块的数据进行修改,由于其特征没有进行数据过滤从而实现远程代码的执行。本设计只进行测试,因此攻击语句只使用Phpinfo()来进行,该函数表示显示当前Php配置信息。

四、Discuz论坛漏洞复现

       浏览器访问到127.0.0.1/discuz3.4/utility/convert/index.php,进入X3.4系列升级/转换向导,如图4-1所示。

图4-1  X3.4系列升级/转换向导界面

       任意选择一个目标版本进行升级,本设计将X3.4转换为X2.0版本进行测试,如图4-2所示。

图4-2  Discuz! X2.0转换界面

       开启Burpsuite软件,并设置为“Intercept is on”,进行页面数据抓捕,如图4-3所示。

图4-3  Burpsuite截断界面

       开启浏览器插件Foxyproxy(设置IP为127.0.0.1,端口号8080)为Burpsuite的代理插件,如图4-4所示。

图4-4  开启代理

       单击下方保存服务器配置后,来到Burpsuite软件的Repeater重发器中,尝试修改Post数据,即手动介入改变Key的数据。

       首先构造攻击Payload语句。

&newconfig[aaa%0a%0dphpinfo();//]=aaaa&submit=yes

       其中,%0a代表换行,%0d代表回车,aaaa是伪造数据,从而尝试骗过过滤语句,将恶意代码Phpinfo()尝试注入。

       修改Payload完成后将数据继续发送给Discuz论坛服务器,此时返回论坛界面,并重新访问升级/转换导向界面,显示了Phpinfo()的配置信息,如图4-5所示。

图4-5   注入成功界面

五、加固方案     

       通过之前的代码审计,可以知悉由于在升级/转换向导被使用时会调用Buildarray()函数,而函数内部可控参数Key在写入配置文件时并没有进行严格的数据过滤,因此手动添加一个防护Payload语句,针对于所有的非字母、数字以及下划线等特殊字符,利用Preg_replace函数直接进行删除操作,此时若想再次通过利用手动输入%0a和%0d的方式绕过服务器会直接被删除从而无法实现恶意代码的写入,具体Payload语句如下:

$key = preg_replace("/[^\w]/", "", $key);

       再次定位到Discuz3.4/utility/convert/include/global.func.php的升级/转换向导调用Buildarray()函数处,将过滤防护语句加入到每次进行数据检查处,如图5-1所示。

图5-1  防护过滤语句添加

       开启Foxyproxy插件作为Burpsuite软件代理,对升级/转换向导模块进行抓包,使用同样的Payload进行攻击,倘若%0a和%0d发挥了作用,则一定会绕过服务器并写入到配置文件Config.inc.php中。此时访问该文件,发现恶意代码并没有写入,则说明成功过滤掉了恶意字符,如图5-2所示。

图5-2  配置文件防护成功界面

来源地址:https://blog.csdn.net/weixin_60708754/article/details/130684807

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯