挖掘PHP整站程序漏洞的一些思路和经验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
挖掘PHP整站程序漏洞的一些思路和经验
(廖坚先)Bykid@广东科干
第一次写稿同时也是第一次投稿,文章写的不好,大家多多包涵;进入正题,今天要跟大家分享的是挖掘PHP整站程序漏洞的一些思路,就拿phpcms2007整站(版本:PHPCMS 2007-更新日期:20080717)来说吧。
先给大家展示我在phpcms2007挖掘到的几个安全漏洞和安全隐患,虽然有的已经在phpcms2008中不存在,但是却可以从中得到一些经验或许这些漏洞在其它整站程序中存在也不稀奇啊,然后呢再引出我是如何快捷的发现它们的,所以重点还在后面,大家要耐心看下去啊。
Bug->1:漏洞出现在安装整站的文件install.php,关键源代码:在217行“file_put_contents(PHPCMS_ROOT.'/data/uninstall/phpcms/phpcms.php',phpcms_encode(serial ize($user),'uninstall'));”和473行“@unlink(PHPCMS_ROOT.'/data/install/phpcms/phpcms.php');”,大家可以按照这个路径去找找看有没有install这个文件夹。答案是没有的,phpcms.php 是在uninstall\phpcms\下面。这里应该是程序员笔误,他应该是想删除217行建立的phpcms.php,此文件的作用是为了最后的安装操作传递用户填的管理员的账号和密码的。账号和密码经过了自写的函数“phpcms_encode”的加密但是可还原,同时这些编码是没有以PHP代码的形式存放的,也就是说我们浏览那个文件就可以看到内容并且通过“include\auth.func.php”里面的“phpcms_decode”函数解密来查看。
Bug->2:漏洞出现在corpandresize\ui.php,关键代码如下:
$dirnames=dirname($PHP_QUERYSTRING);//得到url问号后面的参数
$tmp=PHPCMS_ROOT.'/'.str_replace($PHPCMS['siteurl'],'',$dirnames).'/';
$tmp_url=str_replace($PHPCMS['siteurl'],'',$dirnames);
if(preg_match("/http:/",$tmp))//重点:只要提交的是外部站点的地址就会执行花括号的代码{
include_once PHPCMS_ROOT."/include/upload.class.php";
$tmp=PHPCMS_ROOT.'/'.$PHPCMS['uploaddir'].'/'.date('Ym').'/';
$tmp_url=$PHPCMS['uploaddir'].'/'.date('Ym');
dir_create($uploaddir);
}
我们的目的是利用dir_create($uploaddir),$uploaddir是未初始化的这样我们可以post这个变量上去,同样也应该是程序员的笔误,按照正常的逻辑$uploaddir这里应该是$tmp来的,这样就让我们有机可乘了(*^__^*)嘻嘻……顾名思义dir_create就是创建文件夹的,这个函数在“include\global.func.php”中被定义,值传递进去后没有什么限制,就不贴代码了。
Bug->3:这个是Oday漏洞来的,phpcms2008SP3-20100125版本中还存在,漏洞出现在“corpandresize\process.php”关键代码:
$thumbfile=$_COOKIE['thumbfile'];
if($thumbfile)@unlink(TMP_PATH.'/'.$thumbfile);
变量$thumbfile是从cookie中来的,大家可以自由发挥,TMP_PATH这个常量定义在“config.inc.php”里面,其实他也是cookie中传来的变量$tmp,所以$tmp+$thumbfile就可以删掉任何你想要删除的文件了,其实这个图片裁减的这个组件安全问题还是蛮多的。
好啦,到现在大家有没有发现这几个漏洞都是跟文件或文件夹的操作有关呢?想要渗透一个网站拿到webshell肯定要上传webshell了也就是对文件的操作了,那就关涉到PHP 的文件操作函数。
所以我要告诉大家的一条挖掘思路是利用dreamweaver的查找功能以PHP的函数作为关键字来查找,然后再追踪那些传进去的变量是否自己可以控制的。
我收集了一部分PHP的文件操作函数如下,可以方便大家作为关键字来挖掘漏洞:chdir(string dir)改变当前目录
new dir(string dir)一个类
int opendir(string path)返回句柄
string readdir(int句柄)读取句柄指针当前所指的文件,并返回文件名
void rewinddir(int句柄)将目录句柄指针移到顶端,相当于指针指向“.”目录
void closedir(int句柄)关闭已打开的目录
文件操作函数
int fopen(string filename,string mode)mode:r,r+,w,w+,a,a+在windows中还有b
int fclose(int fp)关闭打开的文件
int popen()以管道方式打开一个文件
int pclose()
bool flock(int fp,int operation)operation=1,2,3,4
int fseek(int fp,int offset)将指定的文件的指针所指的位置在文件流中偏移至offset 字节
int ftell(int fp)返回文件指针位置
int fcof(int fp)判断文件指针是否在文件末尾是ture
int rewind(int fp)将指针移到文件开头
string fgetc(int fp)得到文件指针处的字符并返回
array fgetcsv(int fp,int length,string[delimiter])读取文件指针到行尾的内容并用CSV方式进行分割delimiter为分割符默认为逗号
string fgets(int fp,int length)取得文件所在行的内容
string fgetss(int fp,int length,string[allowable_tags])能去掉html和php标记
array file(string filename,int[use_include_path])读文件的内容到数组
int readfile(string filename,int[use_include_path])读取一个文件到标准输出返回值为从文件中读取的字节数
int fpassthru(int fp)将当前文件指针所指处到文件末尾的所有数据输出
string fread(int fp,int length)从文件指针处向后读取length长度的数据并返回
int fwrite(int fp,string string,int[length])写文件
int fputs()同上
int copy(string源文件,string目标文件)
int rename("oldname","newname")
int unlink("filename")
int rmdir("dirname")
int mkdir("pathname",int mode)mode为文件的属性必须为八进制
void cleanstatcache()清除文件缓存
int set_file_buffer(int fp,int buffer)设定文件缓存大小
array stat("filename")取得文件的状态信息
array latat("filename")取得指定文件或链接的状态信息
int file_exists("filename")判断文件是否存在
bool is_readable("filename")
bool is_writeable("filename")