【愚公系列】2023年06月 攻防世界-Web(blgdel)


前言

1.文件上传漏洞

PHP文件上传漏洞是指攻击者能够通过上传恶意文件来执行恶意代码,从而控制服务器或窃取敏感数据的安全漏洞。一般来说,攻击者会将一些包含恶意代码的文件伪装成图片、压缩包等常见格式的文件,骗取用户上传,进而向网站提交指定的文件名,替换掉原有的文件,造成恶意代码的执行,危害网站安全。

攻击者可以通过以下方式来利用PHP文件上传漏洞:

  1. 上传Webshell:攻击者可以上传包含恶意代码的Webshell,通过Webshell控制服务器,获取敏感信息,或者利用Webshell进行后续攻击。

  2. 上传木马程序:攻击者可以上传带有木马功能的程序,将其嵌入到服务器的程序中,在服务器上执行恶意代码,从而控制服务器。

  3. 上传钓鱼页面:攻击者可以上传包含钓鱼代码的页面,骗取用户输入敏感信息。

为了避免PHP文件上传漏洞,可以通过以下方法提高服务器的安全性:

  1. 对上传的文件类型进行限制,只允许上传指定的文件类型,如图片文件、文档文件等。

  2. 对上传的文件大小进行限制,避免上传过大的文件,导致服务器崩溃。

  3. 对上传的文件进行安全扫描,检查是否包含恶意代码,尽早发现并处理可疑文件。

  4. 更新服务器操作系统和Web服务器软件,及时修复已知的安全漏洞。

2.htaccess配置文件

.htaccess文件是一种配置文件,用于Apache Web服务器,可以控制网站的访问权限、目录结构、重定向、错误处理等。

.htaccess文件通常位于网站根目录,它的作用范围仅限于所在目录及其子目录。在一个网站中可以创建多个.htaccess文件,它们可以覆盖并补充主配置文件httpd.conf中的配置。

.htaccess文件可以包含各种指令(命令)和规则来控制服务器的行为,例如:

  • RewriteRule:用于URL重写和重定向。
  • DenyAllow:控制某个IP地址或用户访问网站资源的权限。
  • ErrorDocument:自定义错误页面,如404错误等。
  • AuthTypeAuthNameAuthUserFileRequire:控制访问网站时的认证和授权。

覆盖.htaccess文件的配置可以通过多种方式实现,其中包括:

  1. 通过修改主配置文件httpd.conf中的相应参数,覆盖掉.htaccess文件中的配置。

  2. 在主配置文件中使用<Directory>指令,指定某个目录的配置信息,从而覆盖掉该目录下的.htaccess文件。

  3. 通过在.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}

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/131303964
今日推荐