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

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

二、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  配置文件防护成功界面
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐