目录
第05关 .htaccess过滤绕过
1.打开靶场
http://iwebsec.com:81/upload/05.php
构造脚本info.php,内容为<?php phpinfo();?>,如下所示
随手上传脚本,提示不让上传php文件
2.源码分析
如下所示文件过滤方式为检查是否包含大小写不敏感的php关键字
<?php
require_once('../header.php');
?>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf8"/>
<head>
<title>.htaccess文件上传</title>
</head>
<h2>.htaccess文件上传</h2>
<div class="alert alert-success">
<p>请上传PHP文件</p>
</div>
<body>
<form enctype="multipart/form-data" method="post" name="uploadfile">
请上传文件:<input type="file" name="upfile" /><br>
<input type="submit" name="submit" value="submit" />
</form>
</html>
<?php
//print_r($_FILES["upfile"]);
if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
$upfile=$_FILES["upfile"];
//获取数组里面的值
$name=$upfile["name"];//上传文件的文件名
$type=substr($name, strrpos($name, '.')+1);//上传文件的类型
$size=$upfile["size"];//上传文件的大小
$tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
//判断是否为图片
if (preg_match('/php/i', $type)) {
echo "<script>alert('不能上传php文件!')</script>";
die();
}else{
$error=$upfile["error"];//上传后系统返回的值
echo "================<br/>";
echo "上传文件名称是:".$name."<br/>";
echo "上传文件类型是:".$type."<br/>";
echo "上传文件大小是:".$size."<br/>";
echo "上传后系统返回的值是:".$error."<br/>";
echo "上传文件的临时存放路径是:".$tmp_name."<br/>";
echo "开始移动上传文件<br/>";
//把上传的临时文件移动到up目录下面
move_uploaded_file($tmp_name,'up/'.$name);
$destination="up/".$name;
echo "================<br/>";
echo "上传信息:<br/>";
if($error==0){
echo "文件上传成功啦!";
echo "<br>图片预览:<br>";
echo "<img src=".$destination.">";
//echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\">";
}
}
}
?>
关键部分的代码如下所示
//判断是否为图片
if (preg_match('/php/i', $type)) {
echo "<script>alert('不能上传php文件!')</script>";
die();
}
这个时候可以使用绕过的方法就包括.htacess法,.ini法,空格过滤法等,应本关卡的主题.htaccess过滤,于是选择htaccess法绕过
3.htaccess文件介绍
(1)什么是.htaccess文件
htaccess文件全称是超文本入口,提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。上传.htaccess文件,来绕过黑名单。
(2)如何配置使.htaccess生效
是否只要上传.hataccess文件就一定产生作用?
不一定,需要配置相应的文件.
(1)配置文件mod_rewrite模块开启
(2)配置文件httpd.conf需要AllowOverride 处于All状态
(3)ts多线程安全版本
特别要注意的是phpstudy版本中默认安装的php为nts版本,不支持.htaccess功能绕过。也就是说需要绑定ts版本的php,否则.htaccess文件也是无法生效的。
4.如何通过.htaccess文件绕过过滤
方法1:
如下配置的原理是jpg后缀名的文件使用php解析,然后再上传一个带有webshell的jpg文件即可。
AddType application/x-httpd-php .jpg //含义:将jpg文件解析为php文件
方法2:
该语句作用是让Apache将其他类型文件均以php格式解析,这样可以上传任意webshell的非php文件格式
SetHandler application/x-httpd-php //含义:将所有的文件都当做PHP执行
方法3:
该语句的作用是将指定info5.jpg按照php格式执行,这样上传info5.jpg后,这个info5.jpg将被当作php文件执行
<FilesMatch "info5.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
5.构造htaccess文件
基于如上分析,使用方法3来进行绕过,创建.htaccess文件,内容如下
<FilesMatch "info5.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
同时将info.php改名为info5.jpg,如下所示,
6.上传脚本
将info5.jpg和.htaccess均上传到服务器中,如下所示.htaccess文件由于不在黑名单中,可以上传成功
接下来将info5.jpg上传
7.获取上传图片url地址
在info5.jpg上传成功的图片预览处,右键鼠标复制图片地址
8.访问上传脚本
phpinfo()http://iwebsec.com:81/upload/up/info5.jpg
如上所示,渗透成功