php代码审计指南-文件上传篇

------------恢复内容开始------------

前言

回顾拓展

0X01首先我们来看一个文件上传的简单页面

<?php

{if ($_SERVER['REQUEST_METHOD'] == 'POST') 
{ echo "url:".$_FILES["upfile"]["name"];
if(!file_exists($_FILES["upfile"]["name"]))
{ copy($_FILES["upfile"]["tmp_name"], $_FILES["upfile"]["name"]); }}
?><
form method="post" enctype="multipart/form-data"><input name="upfile" type="file"><input type="submit" value="ok"></form><?php }?>

 

$_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以后成了常量) 

然后我们在来看这个页面生成的原生上传数据包

POST /upload/DVWA-master/upload.php HTTP/1.1
Host: 192.168.79.128
Content-Length: 212
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.79.128
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryArHsM3sb8zBffBHj
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.79.128/upload/DVWA-master/upload.php
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=khupnun5u2sclq2b9qoe6su845
Connection: close

------WebKitFormBoundaryArHsM3sb8zBffBHj
Content-Disposition: form-data; name="upfile"; filename="1x.php"
Content-Type: application/octet-stream-->type

<?php phpinfo();
------WebKitFormBoundaryArHsM3sb8zBffBHj--

 这里对这些数据包里面的数据进行详细解读

-----webkitformboundary” 是safari 浏览器从客户端向服务器端传送HTML标签数据所使用的分隔符(一般会在分隔符后附加一串十六进制的数以示区别)。这里所指的HTML标签数据包括文本框、密码框、文件上传框......一般来说,这些网页元素都被嵌入于form表单,所以才称为:formboundary。 
可以看见我们的源码type=file的哪里的数据是name=upfile 也就是指定$_FILE[upfile]这一命名空间

这是echo $_FILE['upfile']['temp_name']

 

 

好的 从简单的上传页面我们逐步熟悉了上传过程的数据传递过程

接下来 我们来看一个DWVA的上传high代码

 

 

 

这里因为getimagessize函数对文件的开头内容进行了检测  通过二进制识别你是否为图像 这里我们直接加上GIF89a就可以成功绕过

但是我们如何绕过文件后缀名的检查呐??

我这里的环境是windows 可以用windows特殊符号截断 php<5.3.4且Magic_quotes_gpc=OFF一下可以尝试%00截断 

 

 

 实战中的文件上传代码审计

 

 

posted @ 2021-02-04 13:54  yourse1f  阅读(376)  评论(0编辑  收藏  举报