文件上传-二次渲染绕过

    渗透测试 lz520520 5年前 (2019-10-06) 1014次浏览

    所谓二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。

    特点:无法通过普通的绕过方式进行上传,php代码会检测你传过去的数据流,如果检测不符合png、jpg、gif格式的话就会直接报错,如果上传成功之后,PHP会根据你的数据来生成新的特定jpg文件。并且利用时间戳或者其他随机方式来进行命名。所以普通绕过根本不可行。

    具体绕过方式如下所示,这里主要针对php来说明测试的,其他语言可参考测试:

    文件上传-二次渲染绕过GIF:如果能拿到渲染后的图像文件,对比没有修改过的区域添加恶意代码,就可以上传成功。
    PNG:将恶意代码写入PLTE数据块(调色板辅助数据块,因此仅针对彩色PNG有效)并重新计算CRC校验值。
    PNG:将恶意代码插入IDAT数据块(通用)。
    JPG:利用php函数imagecopyresized() 或 imagecopyresampled()的缺陷。

    详细操作说明

    (1)GIF:

    这块简单粗暴,对比上传前后图片的相同之处,修改成恶意代码即可,具体来说二次渲染前后,GLOBALCOLORTABLE 数据结构内容是相同的,可针对这块进行修改。

     

    (1) PNG PLTE:

    使用010editor即可解析png格式。

     

    PLTE辅助块因为是可选块,不一定有,PS过的会有这个模块。PLTE的数据结构分为数据块长度、PLTE头、PLTE数据块以及最后的CRC校验。

    文件上传-二次渲染绕过

     

    我们需要修改的就是数据块,建议用覆盖方式而不是追加,因为长度变化,最后上传到服务端二次渲染后,还是会恢复原来的长度,这个跟图像色深有关。如果插入代码长度大于数据块长度,就会导致被截断。
    要选择PLTE数据块长度较大的图片,这样比较好覆盖修改成更多的代码。
    修改完后需要重新计算CRC,否则渲染会有问题,这里可以使用010editor做格式解析,会自动计算出正确的CRC,或者手动计算
    计算公式CRC32(PLTE头部+PLTE数据块)

     

    或者使用我写的png_plte_generate.py自动生成。

    注意事项:

    1. 脚本使用python3编写

    2. 使用方法: python png_plte_generate.py plte_origin.png code.txt,最终会生成plte_code.png

     

    (2) PNG IDAT:

    PNG IDAT插入webshell会比较麻烦。

    生成步骤如下:

    1. webshell字符串通过DEFALTES算法压缩

    2. 绕过PNG过滤器

    3. 构造原始图像

    4.绕过图像转换

    这里提供脚本png_IDAT_generate.py自动生成png。

    注意事项:

    1. 脚本使用python3编写

    2. 使用前先安装Pillow模块, pip install Pillow

    3. webshell代码长度不要超过46字节,不然会生成失败

    4. 使用方法: python png_IDAT_generate.py -f code.txt -o test.png,最终会生成test.png

     

    (3) JPG:

    这里直接提供一个大佬写的jpg_payload.php来生成。

    注意事项:

    1. 使用方法:在安装了php的环境 运行以下命令 php jpg_payload.php image_origin.jpg

    2. 插入的webshell通过修改jpg_payload.php的$miniPayload来实现。

     

    文件下载

      文件名称:工具包  文件大小:233KB
      下载声明:本站文件大多来自于网络,仅供学习和研究使用,不得用于商业用途,如有版权问题,请联系博猪!
      下载地址: https://tools.lz520520.com/files/pentest/%E4%BA%8C%E6%AC%A1%E6%B8%B2%E6%9F%93%E7%BB%95%E8%BF%87.zip

    参考

    https://blog.csdn.net/qq_41079177/article/details/89386741

    https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/


    Security , 版权所有丨如未注明 , 均为原创丨
    转载请注明原文链接:文件上传-二次渲染绕过
    喜欢 (1)