所谓二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。
特点:无法通过普通的绕过方式进行上传,php代码会检测你传过去的数据流,如果检测不符合png、jpg、gif格式的话就会直接报错,如果上传成功之后,PHP会根据你的数据来生成新的特定jpg文件。并且利用时间戳或者其他随机方式来进行命名。所以普通绕过根本不可行。
具体绕过方式如下所示,这里主要针对php来说明测试的,其他语言可参考测试:
GIF:如果能拿到渲染后的图像文件,对比没有修改过的区域添加恶意代码,就可以上传成功。
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/