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截断
实战中的文件上传代码审计