首页 > php教程 > php手册 > 正文

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

php中文网
发布: 2016-06-06 19:36:19
原创
1606人浏览过

目录 遍历 漏洞 在国内外有许多不同的叫法,比如也可以叫做信息泄露 漏洞 ,非授权文件包含 漏洞 .名称虽然多,可他们却有一个共同的成因,就是在 程序 中没有过滤用户输入的../和./之类的 目录 跳转符,导致恶意用户可以通过提交 目录 跳转来遍历 服务器 上的任

  目录遍历漏洞在国内外有许多不同的叫法,比如也可以叫做信息泄露漏洞,非授权文件包含漏洞.名称虽然多,可他们却有一个共同的成因,就是在程序中没有过滤用户输入的../和./之类的目录跳转符,导致恶意用户可以通过提交目录跳转来遍历服务器上的任意文件,其危害可想而知.这类漏洞大家比较熟悉的可能就是在一些邮件列表程序以及网络硬盘程序中,其实这类漏洞还广泛存在与一些国外的BLOG程序中,这类漏洞大概分两种下面就来通过实例来说明这类漏洞是如何产生以及该如何防范.

  首先,我们来看一个国外的blog,前几天从网上下了一个名为loudblog的blog程序,

  在它的index.php页面中看到如下代码:

<p><span>//</span><span>build an include-path from the url-request</span><span><br /></span><span>  </span><span>else</span><span> {<br />  </span><span>$loadme</span><span>=</span><span>"</span><span>inc/backend_</span><span>"</span><span>.</span><span>$_GET</span><span>[</span><span>'</span><span>page</span><span>'</span><span>] </span><span>.</span><span>"</span><span>.php</span><span>"</span><span>;<br />  }<br />  </span><span>//</span><span>yee-hah! finally we do show real content on our page!</span><span><br /></span><span>  </span><span>include</span><span> (</span><span>$loadme</span><span>);<br />  </span><span>?></span></p>
登录后复制

  这段程序很简单却包含了一个可怕的漏洞,变量$page是我们GET上去的,如果没有设置page参数,程序就自动包含inc/backend_postings.php这个文件,如果有page参数就把$page的值放到inc目录下以backend_前缀开头的文件形成一个新的文件.这里并没有对$page的值做任何的过滤,导致我们可以遍历所有文件了.

  这里要注意的是,我们提交的$page的值会自动的加上php后缀,所以我们阅读php文件是不会有效果的.当然我们可以读一些配置文件也是很有用的.下面就来测试一下,我们在inc目录外建立一个 TXT文件,内容为Wh0 !s H4K_BaN?我们提交如下URL看看结果:

立即学习PHP免费学习笔记(深入)”;

  http://localhost/loudblog/loudblog/loudblog/index.php?page=/../../hello.txt%00这里要说的是由于变量会加上php后缀,所以我们要用%00来截断后缀这样才能正常显示文件内容。

  测试成功说明漏洞存在了,那我们接着读一些敏感文件吧,提交如下URL:

  http://localhost/loudblog/loudblog/loudblog/index.php?page=/../../../../../../conf/httpd.conf%00

  APACHE的配置文件也顺利读出来了,接下来就来看另外一种情况.

巧文书
巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 281
查看详情 巧文书

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

<p><span>$act</span><span>=</span><span>$_GET</span><span>[</span><span>'</span><span>act</span><span>'</span><span>];<br />  </span><span>if</span><span> (</span><span>$act</span><span>==</span><span>''</span><span>)<br />  {<br />  </span><span>include</span><span>(</span><span>"</span><span>blog.txt</span><span>"</span><span>);<br />  }<br />  </span><span>else</span><span><br />  {<br />  </span><span>include</span><span>(</span><span>"</span><span>act/</span><span>$act</span><span>.txt</span><span>"</span><span>);<br />  }<br />  </span><span>?></span><span><br />  </span><span>$blog_id</span><span>=</span><span>$_GET</span><span>[</span><span>'</span><span>blogid</span><span>'</span><span>];<br />  </span><span>if</span><span> (</span><span>$blog_id</span><span>==</span><span>''</span><span>)<br />  {<br />  </span><span>include</span><span>(</span><span>"</span><span>blog.txt</span><span>"</span><span>);<br />  }<br />  </span><span>else</span><span><br />  {<br />  </span><span>include</span><span>(</span><span>"</span><span>./blog_entries/</span><span>$blog_id</span><span>.txt</span><span>"</span><span>);<br />  }<br />  </span><span>?></span></p>
登录后复制

  从上面的代码可以清晰的看出问题所在,第一段程序获得$_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()函数强制整形化就可以了,对于字符形的参数我们可以自己写一个过滤函数把危险字符过滤掉,类似代码如下:

<p><span>function</span><span> fuckchar(</span><span>$var</span><span>){<br />  </span><span>$var</span><span>=</span><span>str_replace</span><span>(</span><span>"</span><span>..</span><span>"</span><span>,</span><span>""</span><span>,</span><span>$var</span><span>);<br />  </span><span>$var</span><span>=</span><span>str_replace</span><span>(</span><span>"</span><span>.</span><span>"</span><span>,</span><span>""</span><span>,</span><span>$var</span><span>);<br />  </span><span>$var</span><span>=</span><span>str_replace</span><span>(</span><span>"</span><span>/</span><span>"</span><span>,</span><span>""</span><span>,</span><span>$var</span><span>);<br />  </span><span>$var</span><span>=</span><span>str_replace</span><span>(</span><span>"</span><span>\</span><span>"</span><span>,</span><span>""</span><span>,</span><span>$var</span><span>);<br />  </span><span>$var</span><span>=</span><span>str_replace</span><span>(</span><span>"</span><span>"</span><span>,</span><span>""</span><span>,</span><span>$var</span><span>);<br />  }</span></p>
登录后复制

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

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

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号