技术开发 频道

浅析PHP程序中的目录遍历漏洞

  这类漏洞主要是存在与基于PHP+TXT结构的程序中,漏洞代码也是来自于一个国外的BLOG,代码如下:

$act = $_GET['act'];
  if ($act == '')
  {
  include(
"blog.txt");
  }
  
else
  {
  include(
"act/$act.txt");
  }
  ?
>
  $blog_id
= $_GET['blogid'];
  if ($blog_id == '')
  {
  include(
"blog.txt");
  }
  
else
  {
  include(
"./blog_entries/$blog_id.txt");
  }
  ?
>

  从上面的代码可以清晰的看出问题所在,第一段程序获得$_GET[]提交的数据并赋值给$act,这里没有对act做任何的过滤,而在后面判断如果变量为空就把blog.txt包含进来,如果不为空就包含act目录下的$act.txt文件,不过只能读以.txt结尾的文件,读别的文件加上 txt后缀后会提示找不到文件,可以配合某些上传漏洞把文件包含进去,比如提交如下URL:

  index.php?act=blog&blogid=../../filename这样带到程序里就成了include("./filename.txt");包含近来的文件只要里面含有PHP代码就算后缀是TXT文件也会被执行,原理给上面的一样,我就不截图了.

  上面分别介绍了现在最主要的两种目录遍历漏洞,从表面上看基于TXT的PHP程序如果有这类漏洞似乎利用更方便一些,其实两者的危害性都是等价的.其实避免这类漏洞也是很简单的事情,象$blog-id这类数字形的参数只需用intval()函数强制整形化就可以了,对于字符形的参数我们可以自己写一个过滤函数把危险字符过滤掉,类似代码如下:

function fuckchar($var){
  $var
= str_replace("..","",$var);
  $var
= str_replace(".","",$var);
  $var
= str_replace("/","",$var);
  $var
= str_replace("\","",$var);
  $var
= str_replace(" ","",$var);
  }

  大家可以自己测试一下这类漏洞,不管什么语言过滤的思路都是一样的,用GOOGLE搜索: powered by Loudblog可以找到一些这类程序,不过官方现在已经推出新版本了,更多的漏洞等待大家自己去发掘吧.

  当PHP配置文件中的allow_url_open打开的话,我们可以在自己的WEB服务器上建立一个同名文件里面包含shell命令,然后提交我们自己建立的shell文件让被攻击的服务器远程包含,可以以WEB权限执行命令,这样就是所谓的远程执行命令漏洞了。

0
相关文章