• 文件上传漏洞案例


    目录

    1.案例一

    1)案例源码

    2)创建web.php文件

    3)使用抓包软件

    2.案例二 

    1)案例代码

    2) 案例分析

    3)copy命令生成图片马

     4)上传图片马到服务器

    5)解析 文件图片

    3.案例三

    1)案例代码

    2)绕过方法

    3)上传木马,然后抓包

     4)持续发包

    5)直接访问 


    1.案例一

    1)案例源码
    1. function checkFile() {
    2. var file = document.getElementsByName('upload_file')[0].value;
    3. if (file == null || file == "") {
    4. alert("请选择要上传的文件!");
    5. return false;
    6. }
    7. //定义允许上传的文件类型
    8. var allow_ext = ".jpg|.png|.gif";
    9. //提取上传文件的类型
    10. var ext_name = file.substring(file.lastIndexOf("."));
    11. //判断上传文件类型是否允许上传
    12. if (allow_ext.indexOf(ext_name + "|") == -1) {
    13. var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
    14. alert(errMsg);
    15. return false;
    16. }
    17. }
    2)创建web.php文件

    文件里面写入下面一行代码

     phpinfo(); ?>

    然后上传该文件

    就会发现格式不对,需要把后缀名改为.jpg。就会发现现在能上传文件,但是不能解析文件。

    3)使用抓包软件

    修改下面文件后缀为php就可以上传成功

    2.案例二 

    1)案例代码
    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. }
    2) 案例分析

    exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
    返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。

    3)copy命令生成图片马

     4)上传图片马到服务器

    5)解析 文件图片

    3.案例三

    1)案例代码
    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. }
    2)绕过方法

    测试图片的渲染后没有修改的位置,将一句话木马添加进去,这样就可以利用文件包含去执行php一句话木马了

    对于GIF 的上传,只需要判断没有修改的位置,然后将php一句话木马添加即可

    对于PNG的上传,需要修改PLTE数据块或者修改IDAT数据块,

    这里可以利用别人写好的脚本,将php一句话 ,一句话利用了php短开标签

    3)上传木马,然后抓包

     4)持续发包

    ');?> 

    5)直接访问 

  • 相关阅读:
    手撕Vue-查找指令和模板
    Python常用函数中NumPy的使用教程
    【编译原理】实验一 词法分析器(Java实现)
    1688代采系统:解决全球化采购难题的技术创新
    win10 OpenVINO2022版
    陈春花发布声明,这场流量狂欢该到了收尾的时候
    爬取基金收盘价并用pyecharts进行展现
    SSH框架过时了吗?那就最后分享一份阿里架构师整合的SSH框架实战心得吧!
    R语言使用match函数获取向量中特定值的位置(position of a particular value)、which.min函数获取向量中最小值的位置
    es6.x和es7.x如何创建索引?
  • 原文地址:https://blog.csdn.net/m0_69435261/article/details/132673923