PHP-Nukeweb中心系统中的用户登录SQLhacking

王朝php·作者佚名  2008-05-19
宽屏版  字体: |||超大  

之所以翻译这个文章,是因为它非常细致完整地描述了发现安全漏洞的过程,包括成功的和不成功的尝试,提供了一些有用的技术和思路。PHP-Nuke本身的这些已被发现的漏洞会很快被修补,但发现问题的思路不会有大的改变,所以关键在于学习他的思路。文中可能有一些理解或翻译上的错误,原文可以在找到: http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=2-----/ RFP2101 /-------------------------------/ rfp.labs / wiretrip/----RFPlutonium to fuel your PHP-Nuke SQL hacking user logins in PHP-Nuke web portal------------------------------------/ rain forest puppy / rfp@wiretrip.net目录:-/ 1 / 标准的建议信息 -/ 2 / 总览 -/ 3 / 细解 -/ 4 / 其他手段 -/ 5 / 解决方案-------------------------------------------------------------------------- 声明:没人强迫你读这个,不想看的话你可以不看 ---------------------------------------------------------------------------/ 1 / 标准的建议信息 /------------------------------------软件包: PHP-Nuke 厂商主页: www.phpnuke.org 测试过的版本: 4.3 平台: 独立于平台(PHP) 联系厂商时间: 12/29/2000 CVE 候选号: CAN-2001-0001 脆弱性类型: 访问验证弱点(普通用户和管理员) RFPolicy v2: http://www.wiretrip.net/rfp/policy.html以前存在问题: 绕过管理员认证, Aug 2000 BID: 1592 CVE:CVE-2000-0745 SAC: 00.35.032当前版本:4.4 (可能还是有问题,未测试)-/ 2 / 总览 /------------------------------------------PHP-Nuke 是一个用PHP实现的网站和新闻中心系统。我对它的外表和提供的功能印象深刻,决定在以后的两个项目中用到它。就象我决定使用的其他代码一样,我会对那些代码做一个快速的审核(开放源码万岁)。我对代码整体上是满意的,它的确消除了一些有关SQL的安全问题。我觉得把这个脆弱性的如何工作的整个过程揭示出来,从教育的眼光来看,比只写什么“PHP-Nuke是可脆弱的”有意义的多。如果你想了解更多关于SQL hacking,应该看看RFP2K01,在: http://www.wiretrip.net/rfp/p/doc.asp?id=42这并不是个非常有用的入侵,它只是允许你冒充其他用户得到他们加密后的口令。它也给攻击者暴力破解用户或管理员的口令提供了可能性。-/ 3 / 细解 /--------------------------------------首先,为了更好地辅助SQL hacking,打开SQL查询的记录选项是有帮助的。对MySQL来说只要在(safe_mysqld)启动的时候加上'-l logfile'参数就行了。其次,让我们看一下代码。因为是用PHP写的而且用MySQL,我们的目标函数当然是mysql_query()了。让我们把所有的mysql_query()都grep出来:[rfp@cide nuke]# ls admin/ config.php index.php print.php topics.php admin.php counter.php language scroller.js ultramode.txt article.php dhtmllib.js links.php search.php upgrades auth.inc.php faq.php mainfile.php sections.php user.php backend.php footer.php manual/ stats.php voteinclude.php banners.php friend.php memberslist.php submit.php cache/ header.php pollBooth.php themes/ comments.php images/ pollcomments.php top.php[rfp@cide nuke]# grep mysql_query * admin.php: $result = mysql_query("SELECT qid FROM queue"); .... 超过254条SQL queries就不贴在这了 ....让我们来看看那些带有变量的语句,因为里面可能带有用户的输入。例如一些select语句:article.php: mysql_query("update users set umode='$mode', uorder='$order', thold='$thold' where uid='$cookie[0]'");banners.php: mysql_query("delete from banner where bid=$bid");comments.php: $something = mysql_query("$q");user.php: $result = mysql_query("select email, pass from users where (uname='$uname')");index.php: mysql_query("insert into referer values (NULL, '$referer')");来自 article.php 的查询带有四个变量: $mode, $order, $thold,和 $cookie[0]。 comments.php 很有趣,看起来整个查询放在$q变量中,这意味着我们必须到文件中去看那个变量的值是什么,在文件中,我们可以看到:$q = "select tid, pid, sid, date, name, email, url, host_name, subject, comment, score, reason from comments where sid=$sid and pid=$pid"; if($thold != "") { $q .= " and score=$thold"; } else { $q .= " and score=0"; } if ($order==1) $q .= " order by date desc"; if ($order==2) $q .= " order by score desc";所以我们可以看到$q里用到了变量$sid和$pid,可能还有$thold,如果它被定义了的话。现在我们该怎么办?让我们来看看那些变量里到底有些什么。我们从article.php中的那个查询开始。去掉注释后,实际的代码是这样的:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有