前言
1.文件上传漏洞
PHP文件上传漏洞是指攻击者能够通过上传恶意文件来执行恶意代码,从而控制服务器或窃取敏感数据的安全漏洞。一般来说,攻击者会将一些包含恶意代码的文件伪装成图片、压缩包等常见格式的文件,骗取用户上传,进而向网站提交指定的文件名,替换掉原有的文件,造成恶意代码的执行,危害网站安全。
攻击者可以通过以下方式来利用PHP文件上传漏洞:
-
上传Webshell:攻击者可以上传包含恶意代码的Webshell,通过Webshell控制服务器,获取敏感信息,或者利用Webshell进行后续攻击。
-
上传木马程序:攻击者可以上传带有木马功能的程序,将其嵌入到服务器的程序中,在服务器上执行恶意代码,从而控制服务器。
-
上传钓鱼页面:攻击者可以上传包含钓鱼代码的页面,骗取用户输入敏感信息。
为了避免PHP文件上传漏洞,可以通过以下方法提高服务器的安全性:
-
对上传的文件类型进行限制,只允许上传指定的文件类型,如图片文件、文档文件等。
-
对上传的文件大小进行限制,避免上传过大的文件,导致服务器崩溃。
-
对上传的文件进行安全扫描,检查是否包含恶意代码,尽早发现并处理可疑文件。
-
更新服务器操作系统和Web服务器软件,及时修复已知的安全漏洞。
2.htaccess配置文件
.htaccess
文件是一种配置文件,用于Apache Web服务器,可以控制网站的访问权限、目录结构、重定向、错误处理等。
.htaccess
文件通常位于网站根目录,它的作用范围仅限于所在目录及其子目录。在一个网站中可以创建多个.htaccess
文件,它们可以覆盖并补充主配置文件httpd.conf
中的配置。
.htaccess
文件可以包含各种指令(命令)和规则来控制服务器的行为,例如:
RewriteRule
:用于URL重写和重定向。Deny
和Allow
:控制某个IP地址或用户访问网站资源的权限。ErrorDocument
:自定义错误页面,如404错误等。AuthType
、AuthName
、AuthUserFile
、Require
:控制访问网站时的认证和授权。
覆盖.htaccess
文件的配置可以通过多种方式实现,其中包括:
-
通过修改主配置文件
httpd.conf
中的相应参数,覆盖掉.htaccess
文件中的配置。 -
在主配置文件中使用
<Directory>
指令,指定某个目录的配置信息,从而覆盖掉该目录下的.htaccess
文件。 -
通过在
.htaccess
文件中使用AllowOverride
指令,指定可以覆盖的配置信息类型,从而控制是否允许.htaccess
文件中的配置覆盖主配置文件中的参数。默认情况下,AllowOverride
指令设置为None
,不允许.htaccess
文件中的配置覆盖主配置文件的相应参数。但是可以将其设置为All
或者指定要允许覆盖的参数类型。
3.master伪协议
master
伪协议是PHP中的一种特殊文件协议,它可以在PHP代码中直接引用包含在当前执行脚本中的未定义变量。
该协议的原理是,PHP解释器在解析文件路径时,如果遇到以master
开头的协议,则会将该文件路径当作一个未定义变量来处理,并使用该变量的值作为实际的文件路径。如果该变量没有被定义,则会将其作为空字符串处理。
例如,在以下代码中:
<?php
include 'master://whatever';
?>
PHP解释器会将master://whatever
当作未定义变量,然后使用该变量的值作为实际的文件路径进行文件包含操作。如果变量$whatever
未被定义,则会将其作为空字符串,相当于引入一个空文件,否则会引入变量$whatever
所代表的文件。
攻击者可以通过构造恶意master
请求,将自己的恶意代码当作变量值传递给PHP解释器,从而实现文件包含漏洞的利用,比如:
<?php
$_GET['page'] = 'php://filter/read=convert.base64-encode/resource=index.php';
include 'master://'.$_GET['page'];
?>
在上述代码中,使用了master
伪协议和php://filter
协议共同构造了一个包含漏洞,将$_GET['page']
参数值作为变量传递给PHP解释器,并使用其值作为实际的文件路径。由于使用了php://filter
协议,导致引入的文件被base64编码,从而可以绕过文件类型检查和代码过滤等安全措施,最终成功执行恶意代码。
一、blgdel
1.题目
2.答题
2.1 信息收集
查看页面后,常规操作扫一下目录
发现几个目录可能有线索:robots.txt
config.txt 代码审计
<?php
class master
{
private $path;
private $name;
function __construct()
{
}
function stream_open($path)
{
if(!preg_match('/(.*)\/(.*)$/s',$path,$array,0,9))
return 1;
$a=$array[1];
parse_str($array[2],$array);
if(isset($array['path']))
{
$this->path=$array['path'];
}
else
return 1;
if(isset($array['name']))
{
$this->name=$array['name'];
}
else
return 1;
if($a==='upload')
{
return $this->upload($this->path,$this->name);
}
elseif($a==='search')
{
return $this->search($this->path,$this->name);
}
else
return 1;
}
function upload($path,$name)
{
if(!preg_match('/^uploads\/[a-z]{10}\/$/is',$path)||empty($_FILES[$name]['tmp_name']))
return 1;
$filename=$_FILES[$name]['name'];
echo $filename;
$file=file_get_contents($_FILES[$name]['tmp_name']);
$file=str_replace('<','!',$file);
$file=str_replace(urldecode('%03'),'!',$file);
$file=str_replace('"','!',$file);
$file=str_replace("'",'!',$file);
$file=str_replace('.','!',$file);
if(preg_match('/file:|http|pre|etc/is',$file))
{
echo 'illegalbbbbbb!';
return 1;
}
file_put_contents($path.$filename,$file);
file_put_contents($path.'user.jpg',$file);
echo 'upload success!';
return 1;
}
function search($path,$name)
{
if(!is_dir($path))
{
echo 'illegal!';
return 1;
}
$files=scandir($path);
echo '</br>';
foreach($files as $k=>$v)
{
if(str_ireplace($name,'',$v)!==$v)
{
echo $v.'</br>';
}
}
return 1;
}
function stream_eof()
{
return true;
}
function stream_read()
{
return '';
}
function stream_stat()
{
return '';
}
}
stream_wrapper_unregister('php');
stream_wrapper_unregister('phar');
stream_wrapper_unregister('zip');
stream_wrapper_register('master','master');
?>
sql.txt
CREATE DATABASE `sshop` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `sshop`;
CREATE TABLE `sshop`.`users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NULL DEFAULT NULL,
`mail` varchar(255) NULL DEFAULT NULL,
`password` varchar(255) NULL DEFAULT NULL,
`point` varchar(255) NULL DEFAULT NULL,
`shopcar` varchar(255) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
2.2 文件上传
注册登录后,访问user.php,看到有文件上传,试着上传一句马,积分达到100分才可上传文件,通过刷推荐人达到,上传后,访问uploads路径下上传的文件
看到有文件上传,试着上传一句马,积分达到100分才可上传文件,通过刷推荐人达到,上传后,访问uploads路径下上传的文件
点开文件,发现代码被过滤
2.3 htaccess
查看config.txt,上传的文件内容过滤了<等符号,这里可以上传.htaccess文件,用.htaccess修改配置文件
.htaccess相关介绍:https://blog.csdn.net/cmzhuang/article/details/53537591
第一步,通过构造master伪协议来搜索flag
php_value auto_append_file master://search/path=%2fhome%2f&name=flag
要把正斜杠编码%2f传入才行,写入.htaccess文件后上传,在上传随便一个php文件,这样访问php文件时就会执行
第二步,再修改.htaccess内容,包含文件名
php_value auto_append_file /home/hiahiahia_flag
再次上传.htaccess文件,访问php
得到flag:cyberpeace{4d9d19b69232a8e1548fb4910e9efa6a}