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

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

二、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31722.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注