• 图片码二次渲染绕过


    目录

    一、环境

    1、代码

    2、文件处理方式

    3、图片码的制作

    二、绕过图片重构

    1、可行性分析

    2、数据比对

    3、完成绕过


    一、环境

    upload-labs靶场第十七关为例

    1、代码

    源码为: 

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

    82. 上传图片马到服务器。

    83. 注意:

    84. 1.保证上传后的图片马中仍然包含完整的一句话webshell代码。

    85. 2.使用"" target="_bank">文件包含漏洞能运行图片马中的恶意代码。

    86. 3.图片马要.jpg,.png,.gif三种后缀都上传成功才算过关!

  • 上传区

  • "multipart/form-data" method="post">
  • 请选择要上传的图片:

  • class="input_file" type="file" name="upload_file"/>
  • <input class="button" type="submit" name="submit" value="上传"/>
  • form>
  • <div id="msg">
  • php
  • if($msg != null){
  • echo "提示:".$msg;
  • }
  • ?>
  • "img">
  • if($is_upload){
  • echo '$img_path.'" width="250px" />';
  • }
  • ?>
  • if($_GET['action'] == "show_code"){
  • include 'show_code.php';
  • }
  • ?>
  • include '../footer.php';
  • ?>
  • 2、文件处理方式

        // 获得上传文件的扩展名
        $fileext= substr(strrchr($filename,"."),1);

        //判断文件后缀与类型,合法才进行上传操作
        if(($fileext == "jpg") && ($filetype=="image/jpeg")){
            if(move_uploaded_file($tmpname,$target_path)){
                //使用上传的图片生成新的图片
                $im = imagecreatefromjpeg($target_path);

    检查后缀,然后将上传的图片进行二次重构。

    3、图片码的制作

     检查图片码

    发现代码已经传上去了。

    但是由于图片进行了重构,所以上传之后的图片是被打乱了的。所以图片码无法执行。

    图片正常上传。

    将图片重新下载回来

     

    查看图片是否发生改变 

    发现图片里面已经没有我们传入的webshell了‘

    二、绕过图片重构

    1、可行性分析

    图片的重构不会将所有数据都改变完全,我们可以根据传入的图片码和传入后进行处理过的图片码数据进行比对,找到没有被修改的字段,通过修改这些没有被修改过的字段,达到绕过图片重构的目的。

    2、数据比对

    图片码数据比对,使用工具010editor

     灰色的表示前后匹配的,所以我们重点查找匹配的

     

     

    按照这样的原理进行修改,个人建议使用稍微大一点的图片。同时尽量选择.......多的地方修改,修改其他地方可能会导致图片出错。一两次失败很正常,尽量多尝试几次。

    3、完成绕过

    上传修改后的图片码

    然后在进行文件包含,执行这个图片码,发现确实上传成功了。

     

  • 相关阅读:
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的日常饮食管理APP[包运行成功]计算机毕业设计Android项目源码
    Jackson,Fastjson详细教程
    基于BP神经网络的图像跟踪与细胞追踪识别
    基于SVM的程序设计相关网页判别系统
    yarn CLI 命令
    Milvus 介绍
    React Native读取系统属性
    Python钢筋混凝土结构计算.pdf-混凝土强度设计值
    mac 环境搭建jmeter
    网络协议和服务
  • 原文地址:https://blog.csdn.net/m0_59049258/article/details/132792019