马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
概念
DVWA
low
medium
high
impossible
Pikachu
client check
MIME type
getimagesize
文件上传毛病防护
概念
**文件上传毛病**是网络安全中常见的毛病之一,攻击者可以使用该毛病上传恶意文件,进而在服务器上实验恶意代码、绕过权限验证或获取敏感数据。文件上传毛病重要发生在答应用户上传文件的Web应用步伐中,比如图像、文档上传功能等。
### 毛病危害
1. **远程代码实验**:攻击者可以上传带有恶意代码的文件(如PHP、ASP等脚本文件),并通过访问这些文件在服务器上实验恶意代码,控制服务器。
2. **权限绕过**:攻击者上传伪装的文件,如改名为合法扩展名的文件,绕过上传限定,上传实验有害内容。
3. **Webshell**:攻击者上传一个 Webshell,答应他们通过这个入口对服务器举行进一步的操纵和攻击。
4. **存储型XSS攻击**:攻击者上传包罗恶意JavaScript的文件,并在其他用户查察时实验这些脚本,从而偷取用户数据或实验恶意操纵。
### 文件上传毛病的范例
1. **无文件范例限定**:应用步伐没有限定上传文件的范例或扩展名,答应上传恣意范例的文件。
2. **扩展名绕过**:构建上传文件后缀黑名单。
3. **MIME范例绕过**:通过修改文件的 MIME 范例,绕过服务器的检测。
4. **双扩展名攻击**:攻击者通过使用双扩展名(如 `shell.php.jpg`)迷惑上传机制,上传后服务器大概会根据末了一个扩展名来处置处罚,导致恶意代码实验。
###毛病条件
1.目标网站具有上传功能。
2.上传的目标文件可以或许被Web服务器剖析实验。
3.知道文件上传到服务器后的存放路径和文件名称。
4.目标文件可被用户访问。
DVWA
low
代码分析:
- <?php
- if( isset( $_POST[ 'Upload' ] ) ) {
- //判断上传是否为空
- //文件上传时,通常会将上传的文件保存到临时目录中,然后使用move_upload_file()将其移动到最终的存储位置。
- // Where are we going to be writing to?
- $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
- //定义了文件上传的目标路径,这里假设DVWA_WEB_PAGE_TO_ROOT是一个常量或变量,表示网站的根目录路径。目标路径为 “hackable/uploads/” 子目录。
- $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
- //basename(path,suffix)函数用于获取文件名部分
- //将上传的的原始文件名添加到目标路径中。
- //即:$target_path = 根目录/hackable/uploads/123.php
- // Can we move the file to the upload folder?
- if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
- //使用move_upload_file(string $filename,string $destination)函数将上传的文件从临时目录移动到目标路径
-
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
- else {
- // Yes!
- echo "<pre>{$target_path} succesfully uploaded!</pre>";
- }
- }
- ?>
复制代码 此代码仅做了上传判断,并没有对上传文件的后缀做判断,以是这里做恣意上传即可。
上传phpinfo.php,以及一句话木漏洞本。
蚂剑链接:
总结:恣意文件上传。
medium
代码分析:
- <?php
- if( isset( $_POST[ 'Upload' ] ) ) {
- // Where are we going to be writing to?
- $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
- $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
- // File information
- $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
- $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
- $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
- //提取上传文件的文件名、类型、大小
- // Is it an image?
- if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
- ( $uploaded_size < 100000 ) ) {
- //判断过滤上传文件的后缀类型为image/jpeg,image/png以及大小
- // Can we move the file to the upload folder?
- if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
- else {
- // Yes!
- echo "<pre>{$target_path} succesfully uploaded!</pre>";
- }
- }
- else {
- // Invalid file
- echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
- }
- }
- ?>
复制代码 此次上传木马报错:
于是我们抓包修改--抓包右键--发送至repeater:
修改为如下:
上传乐成:
蚁剑链接:
总结:抓包修改Content-Type范例(实体主题文件范例)
high
代码分析:
- <?php
- if( isset( $_POST[ 'Upload' ] ) ) {
- // Where are we going to be writing to?
- $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
- $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
- // File information
- $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
- $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
- // strrpos(string,find,start):返回指定字符串最后一次出现的位置
- // string:必须。规定被搜索的字符串
- // find:必须。规定要查找的字符
- // start:可选。规定开始搜索的位置
- //substr(string,start,length):返回指定字符串的指定一部分
- //即过滤出文件后缀。
- $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
- $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
- // Is it an image?
- if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
- ( $uploaded_size < 100000 ) &&
- getimagesize( $uploaded_tmp ) ) {
- //strtolower():将字符转换小写,基本杜绝了大小绕过
- //getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息;
- //getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
- // Can we move the file to the upload folder?
- if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
- else {
- // Yes!
- echo "<pre>{$target_path} succesfully uploaded!</pre>";
- }
- }
- else {
- // Invalid file
- echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
- }
- }
- ?>
复制代码 由于这里使用了getimagesize()函数对上传图片做了属性验证,我们添加GIF文件头标识:GIF89a绕过:

上传乐成(只试出了GIF文件头表现收效,别的的可以再试试)
接下来我们通过文件包罗毛病访问(困难度不限定):
http://[靶机ip]/DVWA/vulnerabilities/fi/?page=X:\phpStudy\WWW\DVWA\hackable\uploads\phpinfo.png

总结:伪造文件头辨认上传文件的文件范例。
impossible
代码分析:
- <?php
- if( isset( $_POST[ 'Upload' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
- // File information
- $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
- $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
- $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
- $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
- $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
- // Where are we going to be writing to?
- $target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
- //$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
- $target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
- $temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
- $temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
- // Is it an image?
- if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
- ( $uploaded_size < 100000 ) &&
- ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
- getimagesize( $uploaded_tmp ) ) {
- // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
- if( $uploaded_type == 'image/jpeg' ) {
- $img = imagecreatefromjpeg( $uploaded_tmp );
- imagejpeg( $img, $temp_file, 100);
- }
- else {
- $img = imagecreatefrompng( $uploaded_tmp );
- imagepng( $img, $temp_file, 9);
- }
- imagedestroy( $img );
- // Can we move the file to the web root from the temp folder?
- if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
- // Yes!
- echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
- }
- else {
- // No
- echo '<pre>Your image was not uploaded.</pre>';
- }
- // Delete any temp files
- if( file_exists( $temp_file ) )
- unlink( $temp_file );
- }
- else {
- // Invalid file
- echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
- }
- }
- // Generate Anti-CSRF token
- generateSessionToken();
- ?>
复制代码
Pikachu
client check
构造payload文件,比方phpinfo或一句话木马文件,文件范例为.jpg或.png上传绕过前端校验,
后抓包修改为.php文件,
访问该文件。已经直接给出文件存储路径,
MIME type
上传.php样本文件,修改Content-Type的字段值,
*MIME type:多用途互联网邮件扩展范例,本质是标识文件/数据格式化字符串,焦点作用是让欣赏器/服务器知道”当前处置处罚的是什么范例的数据“,从而精确剖析。比方:text/html(HTML文件),image/jpeg(JPG图片),applocation/json(JSON数据),application/pdf(PDF文件),audio/mp3(MP3音频),video/mp4(MP4视频)...一样平常前端上传文件时欣赏器会自动辨认文件的MIME type供服务器校验。
getimagesize
实验了前两种方式都不可,添加文件头方式:
文件上传毛病防护
*限定高危扩展名上传。
构建黑名单确定后缀名是否合法。
上传文件后缀重定名。
*限定高危文件内容出现。
使用内容检测是否存在非正常内容。
确认图片格式与上传文件内容是否对应。
图像加载二次渲染。
|