自学内容网 自学内容网

文件上传-php

image.png

查找方式

***(1) 黑盒 查找(upload) 扫描
(2) 应用型 窗口 上传中心或者后台中心 上传 Ps:后台是后台 权限是权限
(3) 会员中心
(4) 白盒

基本函数定义 写前端的
Enctype 上传类型

Method 提交方式

Onsubmit 鼠标的时间

Action="放在指定文件"

Php 接受表单数据 

isset()函数 是查看有没有点击 提交

Trim()  将字符串的 两边的空格 去除掉    替换成空

 Strrchr(语句字符串,'.')  意思就是 从.开始断开 输出 .后的语句

Strtolower() 转换小写

Str_ireplace('指定字符','',指定字符串)

将指定字符串里面的字符转换为空格

Array()  是一个数组

In_array('字符串','数组')  判断字符串是不是在数组中
文件上传代码:
PHP中上传一个文件建一个表单要比ASP中灵活得多。具体的看代码。

如: 

代码如下:

<form enctype="multipart/form-data" action="upload.php" method="post"> 

<input type="hidden" name="MAX_FILE_SIZE" value="1000"> 

<input name="myFile" type="file"> 

<input type="submit" value="上传文件"> 

</form> 

$_FILES 

$_POST 

$_GET 

等函数获取表单内容。 

今天我们着重讲$_FILES函数。  当客户端提交后,我们获得了一个$_FILES 数组 

$_FILES数组内容如下: 

$_FILES['myFile']['name'] 客户端文件的原名称。 

$_FILES['myFile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"$_FILES['myFile']['size'] 已上传文件的大小,单位为字节。 

$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 

$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 

UPLOAD_ERR_OK 

值:0; 没有错误发生,文件上传成功。 

UPLOAD_ERR_INI_SIZE 

值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 

UPLOAD_ERR_FORM_SIZE 

值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 

UPLOAD_ERR_PARTIAL 

值:3; 文件只有部分被上传。 

UPLOAD_ERR_NO_FILE 

值:4; 没有文件被上传。 

值:5; 上传文件大小为0. 

文件被上传结束后,默认地被存储在了临时目录中,这时您必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。也就是不管是否上传成功,脚本执行完后临时目录里的文件肯定会被删除。所以在删除之前要用PHP的 copy() 函数将它复制到其它位置,此时,才算完成了上传文件过程。

可以看到这个文件上传的机制 没有type的是相当于post传参有type的是****$FILE上传的文件

绕过

前端过滤:

1.删除掉前端过滤代码

2.禁用js (一般不推荐)

3.抓包修改 (ps:但是禁用之后可能就无法抓到数据包,例如只用js代码 只在前端保存)

mime类型

Image/gif

.html文件 text/html

.xml文件 text/xml

.png文件 image/png

.jpeg/.jpg image/jpeg

.gif image/gif

**mime类型其实就是 检查文件头

Getimagesize()函数 读取图像的信息 如果这种

黑名单

黑名单 : 一些脚本文件绝对不允许上传的
白名单 :相对应的 文件才能

如果黑名单内部并没有搞到 Php5 或者phtml文件后缀 那么就可以通过这种后缀名字来 绕过但是还是要考虑中间件是否支持
**保证在httpd.conf 中保证他可以解析

  • .php
  • .php3
  • .php4
  • .php5
  • .phtml
  • php1
  • php2
后缀名的大小写验证
后缀强制

有时候文件上传时候其实 后缀名加上 /. 或者 直接加一个 . 不影响木马后缀

如果源码没有过滤空格的话

那么可以 在数据包将空格放在后缀名的后面 那么系统就会识别.php空格

格式匹配就会有绕过

双写
不过滤 ‘.’
::$DATA **windows php
环境下下的 在后缀名之后加上 ::$DATA 可以 绕过检查  在**php版本五

如果说不能绕过那可能就是::$DATA被 去除或者加了黑名单
前者可以双写绕过

示例[[upload1-9.md#3#]]

一次过滤或者 循环过滤 绕过点和空格的过滤问题
过滤删除后缀名的的代码那么可以重写

白名单

上传html 造成xss
.htaccess

apache的 一个 配置文件 htaccess文件时Apache服务中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能

例如先上传 .htaccess文件 则

<FilesMatch “.jpg”> SetHandler application/x-httpd-php

将jpg格式文件当成php代码执行
**注意点必须是一定要在 httpd.conf中找到 allowovertide 设置为allow

​%00 编码 和 0x00 十六进制

***原理解释:

了解%00实际上我们要先了解0x00,0x00实际上是一个十六进制表示方式,实际上就是表示ascii码值为0,函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了。因此如果说我们在进行参数传递使用这个\0 我们可以截断后面的内容。

**GET传参

直接对应 1.php%00 ,对应解释一下这个get传参的%00是经历过url编码的。

**POST传参

在post数据包后面以十六进制修改0X00

​条件竞争

条件竞争,前提是你上传一个文件,文件会保存,但是之后会有格外的操作。例如判断后缀或者是删除修改等。存在一个逻辑安全问题 ,首先已经保存web.jpg了此时后面的又一个文件操作 , 但是如果说我占用这个 web.jpg.此时后面的操作无法进行。但是我就可以一直上传对应的webshell ,然后使用脚本一直进行访问对应的webshell

文件解析漏洞

文件夹类型

Image.asp/1.jpg

那么此时是 1.jpg 按照asp执行

文件类型

1.php:2.jpg

这也是按照php解析

Nginx 1.jpg/1.php

二次渲染

其实针对于,图片解析来讲,如果说我上传了一个图片。他会进行二次的修改和渲染,其实我个人觉得这是一个怎么说呢?这是一个对于有解析漏洞的一个前提。

**解决:

  1. 首先上传一张正常的图片,找到对应的保存位置。同时下载对应保存好的图片。
  2. 前后两张图片进行比较,找到未渲染的地方(也就是没有修改的地方),插入我们的木马。

原文地址:https://blog.csdn.net/m0_73255659/article/details/142342228

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!