庖丁解'D',游刃有余---Discuz!免费版安全性分析
2008-04-09 04:12:20来源:互联网 阅读 ()
庖丁解"D",游刃有余
------Discuz!免费版安全性分析 作者:[I.T.S]Jambalaya
论坛:www.itaq.org 前言:记得第一次见分析家的时候,他问我最近在读什么,我告诉他我在继续读雷傲论坛的代码,他笑着说道:"那种东西漏洞一大把,读他做什么?去读Discuz!吧,就安全性而言,这个还有点挑战性"。读了几天后,觉得确实是一块硬骨头。后来事情一多,慢慢的忘却了。
前不久,我的一位朋友和我半开玩笑的说:“如果你能找到Discuz的漏洞,我就请你吃羊棒。找不到你请我吃。”(注:羊棒是我们附近的一家饭店的特色菜),朋友提出要求漏洞必须是在php默认magic_qoute_gpc为on的时候也是可利用的,并且限期一个星期之内。我当时因为竟想着羊棒了,哈喇子哗啦哗啦的往下流,于是连想都没想就一口答应下来了......
于是故事就这么开始了...... 一、漏洞涉及版本
Discuz!2.0以下免费版本(商业版没有拿到)。1.01及其以下的漏洞利用可能有所不同,但漏洞依然存在。 二、漏洞分析
由于install.php的程序书写错误,导致恶意用户构造语句可以写入webshell,进而控制整个服务器。
前几个晚上,把前台文件,只要是数据库调用中的变量都看了一遍。看看是不是有过滤不严的地方,看完后觉得,过滤不严的地方的确不少,但是都已经被单引号保护起来了。在php中,如果magic_qoute_gpc=on(默认的)编译器会自动把单引号等特殊字符转义,而这个时候我们想改变程序的执行流程是非常困难的。这样大大的增加了入侵的难度,在某种程度上,也的确保证了其安全。这也是为什么朋友提出一定要在magic_qoute_gpc为on的时候依然可以利用的要求。如果需要单引号介入才能利用的漏洞,在Discuz!论坛中基本上是没什么用处的。
在把所有文件中数据库连接的地方读了一个遍后,没找到任何有价值的东西。这个时候思路开始有一点乱了,我在犹豫自己是否应该试着从程序员的思维逻辑漏洞下手看看,这就意味着我要去通读所有代码,找到程序员在写程序时考虑不周全的地方,这种漏洞多半是上下文逻辑关系错误,或者是限定不唯一,还有就是一些本来应该注意,但管理员却偏偏忽略的地方。
想到这里,看来没什么能偷懒的了,只能通读代码。因为既然目标是逻辑错误,那么就一定要细看上下文的关系,所以选择从入口点开始读起。入口点就应该是logging.php,因为这是登陆的地方,所有人都会从这里登陆进入论坛。上吧!
老规矩,我们先来看一段代码:
=========codz begin==========
50 $errorlog = "$username\t".substr($password, 0, 2);
......
54 $errorlog .= substr($password, -1)."\t$onlineip\t$timestamp\n";
55 $password = md5($password);
56 $query = $db->query("SELECT m.username as discuz_user, m.password as discuz_pw, m.status, m.styleid AS styleidmem, m.lastvisit, u.groupid, u.isadmin, u.specifiedusers LIKE '%\t$username\t%' AS specifieduser
FROM $table_members m LEFT JOIN $table_usergroups u ON u.specifiedusers LIKE '%\t$username\t%' OR (u.status=m.status AND ((u.creditshigher='0' AND u.creditslower='0' AND u.specifiedusers=') OR (m.credit>=u.creditshigher AND m.credit<u.creditslower)))
WHERE username='$username' AND password='$password' ORDER BY specifieduser DESC");
......
69 if(!$discuz_user)
{
70 @$fp = fopen($discuz_root.'./forumdata/illegallog.php', 'a');
71 @flock($fp, 3);
72 @fwrite($fp, $errorlog);
73 @fclose($fp);
74 showmessage('login_invalid', 'index.php');
}
=========codz endz==============
这段代码我们来一句一句看看,他先纪录输入的用户名和密码,密码只取前两位,然后取密码后一位,并且将ip和时间一起赋过来。然后去密码的md5值,放到数据库中去。如果你认为我们可以改变数据库执行语句的操作流程那就错了,面对单引号我们没有什么可以做的(至少是我做不了什么,除非加密)。后面如果用户名和密码不对则将纪录下错误用户名和密码到illegallog.php中。整个这个记录错误密码的过程中,变量没有经过任何验证,也就是说如果我成心输入错误的用户名,他也不会作检查然后直接记录下来。那么如果我的错误的用户名是一个可执行的代码,他也会记录下来。在他记录下来之后我们去调用这个文件就可以形成一个shell。
到这里你是不是已经兴奋了?对不起,你的兴奋无效。我是一点都兴奋不起来,因为我在前面读第一遍的时候,特别注意过Discuz!对文件句柄的操作,他的确对个别变量没有过滤,但是他在install.php中得初始化的时候,已经给所有用到的以.php结尾的数据文件开始的地方添加了一句:<?PHP exit("Access Denied"); ?>。这是初始化的时候写入的,我们都应该明白这句话的作用。你无法去调用你写入的东西,因为一开始就已经结束了。
这样显然是无法成功的。有点烦了,心想不就是5根羊棒么?输就输了!一赌气扔下代码,自己跑到姥姥的那屋,搂着姥姥撒起娇来,(在姥姥面前撒娇、耍赖、捣乱是我最喜欢的事情之一)我在姥姥面前反复咒骂着Discuz!的变态,说我自己如何如何认真的读代码。姥姥并不知道我在说什么,也不在乎我给她捣乱,继续看着自己的电视。过了一会儿,姥姥应了一句:"你这孩子啊,就是粗心,一点都不心细,你看你这什么码(估计是说代码)又坏了吧"。我嘎嘎大声的笑着爬回了自己的屋子。坐在电脑前,喝了杯白开水,冷静了一下。
做安全的人细心,毅力,自学,善于总结是非常必要的。回过头又把logging.php文件重新读一编,看看有没有什么自己忽略的地方。文件并不长,又看了一遍觉得还是没什么问题。既然这里没什么问题,思路就放到那句<?PHP exit("Access Denied"); ?>上,这句话是如何写入的呢?
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:远程文件包含漏洞的利用
下一篇:网际网络安全技术分析和对策
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash