4 重定向和文件
另
![](/icons/75404yi.gif)
类安全问题是围饶在web应用里重定向和文件
![](/icons/75404de.gif)
使用
![](/icons/75404dou2.gif)
4.1 重定向
web应用里
![](/icons/75404de.gif)
重定向是
![](/icons/75404yi.gif)
个被低估
![](/icons/75404de.gif)
craker工具:它不仅可以让用户掉入
![](/icons/75404yi.gif)
个陷进网站WebSite
![](/icons/75404dou.gif)
而且还可以创造
![](/icons/75404yi.gif)
个完备
![](/icons/75404de.gif)
攻击
![](/icons/75404dou2.gif)
当用户被允许由
![](/icons/75404yi.gif)
个URL重定向
![](/icons/75404de.gif)
时候
![](/icons/75404dou.gif)
它由可能就是个漏洞
![](/icons/75404dou2.gif)
最明显
![](/icons/75404de.gif)
攻击是将用户重定向到
![](/icons/75404yi.gif)
个和原始页面
![](/icons/75404yi.gif)
模
![](/icons/75404yi.gif)
样
![](/icons/75404de.gif)
假页面
![](/icons/75404dou2.gif)
这个所谓
![](/icons/75404de.gif)
‘钓鱼攻击’通过给用户发送
![](/icons/75404yi.gif)
封包含正常
![](/icons/75404de.gif)
不让人起疑
![](/icons/75404de.gif)
链接
![](/icons/75404de.gif)
email
![](/icons/75404dou.gif)
通过XSS方式往web应用里注射这个恶意链接或者把链接放到
![](/icons/75404yi.gif)
个虚假
![](/icons/75404de.gif)
网站WebSite(域名看起来差不多
![](/icons/75404dou.gif)
页面也相同
![](/icons/75404de.gif)
站点)
![](/icons/75404dou2.gif)
它是毫不让人怀疑
![](/icons/75404de.gif)
![](/icons/75404dou.gif)
![](/icons/75404yinwei.gif)
这个链接
![](/icons/75404de.gif)
起始URL是这个正常
![](/icons/75404de.gif)
web应用
![](/icons/75404dou.gif)
指向恶意站点
![](/icons/75404de.gif)
URL都被隐藏在重定向参数里:http://www.example.com/site/redirect?to= www.attacker.com. 这里由个例子:
def legacy
redirect_to(params.update(:action=>'
'))
end
如果用户访问legacy这个action
![](/icons/75404dou.gif)
将会被重定向到mail action
![](/icons/75404dou2.gif)
这样做
![](/icons/75404de.gif)
意图是为了维护legacy
![](/icons/75404de.gif)
参数
![](/icons/75404dou.gif)
并把这些参数传到
![](/icons/75404main.gif)
action
![](/icons/75404dou2.gif)
但是
![](/icons/75404dou.gif)
如果它包含了
![](/icons/75404yi.gif)
个host key
![](/icons/75404dou.gif)
就会被攻击者利用
![](/icons/75404dou2.gif)
http://www.example.com/site/legacy?param1=xy¶m2=23&host=www.attacker.com
如果它在url
![](/icons/75404de.gif)
尾部
![](/icons/75404dou.gif)
将很难被注意到
![](/icons/75404dou.gif)
用户就被神不知鬼不觉
![](/icons/75404de.gif)
重定向到了攻击者
![](/icons/75404de.gif)
页面
![](/icons/75404dou2.gif)
![](/icons/75404yi.gif)
个简单
![](/icons/75404de.gif)
对策是
![](/icons/75404dou.gif)
在legacy action里只包含预期
![](/icons/75404de.gif)
参数(白名单
![](/icons/75404de.gif)
办法
![](/icons/75404dou.gif)
不是取消所有意向不到
![](/icons/75404de.gif)
参数)
![](/icons/75404dou2.gif)
如果你重定向到
![](/icons/75404yi.gif)
个网址
![](/icons/75404dou.gif)
你需要用白名单或是正则表达式检查它
![](/icons/75404dou2.gif)
4.1.1 Self-contained XSS(自载
![](/icons/75404de.gif)
xss攻击)
另
![](/icons/75404yi.gif)
个重定向和self-contained XSS 攻击是通过firefox和opera里使用
![](/icons/75404de.gif)
![](/icons/75404yi.gif)
种数据协议
![](/icons/75404dou2.gif)
该协议直接在浏览器里显示其内容
![](/icons/75404dou.gif)
可以使任何内容
![](/icons/75404dou.gif)
从html
![](/icons/75404dou.gif)
javascript到图片
![](/icons/75404dou2.gif)
(这不是
![](/icons/75404yi.gif)
个漏洞
![](/icons/75404dou.gif)
而是
![](/icons/75404yi.gif)
个功能)
data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K
这个例子是
![](/icons/75404yi.gif)
个Base64编码
![](/icons/75404de.gif)
显示简单消息框
![](/icons/75404de.gif)
javascript
![](/icons/75404dou2.gif)
在
![](/icons/75404yi.gif)
个重定向
![](/icons/75404de.gif)
URL里
![](/icons/75404dou.gif)
![](/icons/75404yi.gif)
个攻击者能用它里面
![](/icons/75404de.gif)
恶意代码重定向这个url
![](/icons/75404dou2.gif)
更详细
![](/icons/75404de.gif)
攻击原理可以参看这里:http://www.gnucitizen.org/blog/self-contained-xss-attacks/
对策:do not allow the user to supply (parts of) the URL to be redirected to.(说实话
![](/icons/75404dou.gif)
这里我没看明白)
4.2 文件上传
- 确保文件上次不覆盖重要
![](/icons/75404de.gif)
文件
![](/icons/75404dou.gif)
和同步
![](/icons/75404de.gif)
媒体文件进程
![](/icons/75404dou2.gif)
很多web应用允许用户上传文件
![](/icons/75404dou.gif)
用户可以选择
![](/icons/75404de.gif)
文件名字
![](/icons/75404dou.gif)
应该随时被过滤
![](/icons/75404dou.gif)
![](/icons/75404yinwei.gif)
攻击者可以用恶意
![](/icons/75404de.gif)
文件名覆盖服务器上任意文件
![](/icons/75404dou2.gif)
如果你在/var/www/uploads存储上传文件
![](/icons/75404dou.gif)
用户输入
![](/icons/75404yi.gif)
个文件名:../../../etc/passwd
![](/icons/75404dou.gif)
它可能覆盖
![](/icons/75404yi.gif)
个重要文件
![](/icons/75404dou2.gif)
当过滤用户输入
![](/icons/75404de.gif)
文件名时
![](/icons/75404dou.gif)
不要试图去删除恶意
![](/icons/75404de.gif)
部分
![](/icons/75404dou2.gif)
想
![](/icons/75404yi.gif)
想
![](/icons/75404dou.gif)
如果去掉所有
![](/icons/75404de.gif)
../ , 攻击者输入.. .. //, 那么结果就成了../
![](/icons/75404dou2.gif)
最好是用白名单
![](/icons/75404de.gif)
方式
![](/icons/75404dou.gif)
用
![](/icons/75404yi.gif)
套可接受
![](/icons/75404de.gif)
![](/icons/75404zifu.gif)
去检查文件名
![](/icons/75404de.gif)
有效性
![](/icons/75404dou2.gif)
![](/icons/75404yi.gif)
旦它不是
![](/icons/75404yi.gif)
个有效
![](/icons/75404de.gif)
文件名
![](/icons/75404dou.gif)
则拒绝它(或替换它)
![](/icons/75404dou.gif)
但是不删除它们
![](/icons/75404dou2.gif)
这有
![](/icons/75404yi.gif)
份来自attachment_fu插件
![](/icons/75404de.gif)
文件名清单:
def sanitize_filename(filename)
ing filename.strip do |name|
# NOTE: File.basename doesn't work right with Windows paths _disibledevent=> 'inline'
另外
![](/icons/75404yi.gif)
个方式是在数据库里存储文件名
![](/icons/75404dou2.gif)
这种方式可以避免上传文件
![](/icons/75404de.gif)
代码被执行
![](/icons/75404dou2.gif)
attachment_fu用
![](/icons/75404de.gif)
就是类似
![](/icons/75404de.gif)
方式
![](/icons/75404dou2.gif)
本文出自 51CTO.COM技术博客
延伸阅读
最新评论