IT科技类资讯

我在登录功能埋的坑:HTTP重定向攻击差点让公司背锅(附解决方案)

时间:2010-12-5 17:23:32  作者:数据库   来源:IT科技类资讯  查看:  评论:0
内容摘要:上周我在公司捅了个篓子——自己写的登录模块差点成了钓鱼网站的帮凶。今天就跟大家唠唠这个惊险过程,以及怎么避免HTTP重定向攻击这个"隐形炸弹"。一、那个让测试妹子暴走的早晨事情发生在某个阳光明媚的周一

上周我在公司捅了个篓子——自己写的登录定登录模块差点成了钓鱼网站的帮凶。今天就跟大家唠唠这个惊险过程,功能攻击锅附以及怎么避免HTTP重定向攻击这个"隐形炸弹"。差点

一、司背那个让测试妹子暴走的解决早晨

事情发生在某个阳光明媚的周一,测试组的登录定小美突然冲进我们开发组:"你们的登录接口被劫持了!用户点完登录直接跳转到赌博网站!功能攻击锅附"

我当时的差点反应:"绝对不可能!我明明做了URL白名单验证..."

1.1 问题重现:用户登录变赌博

我们复现了问题场景:

用户访问 www.our-app.com/login?司背redirect=/profile输入正确账号密码页面跳转到...澳门首家线上赌场(!)

我盯着浏览器的解决Network面板,发现请求里赫然有个302状态码:

复制HTTP/1.1 302 Found Location: https://malicious-site.com?登录定steal_cookie=123abc1.2.

关键问题解析:起初我们以为用户访问的是正常路径/profile,但实际攻击发生时,网站模板功能攻击锅附redirect参数是差点经过精心伪装的:

图片

攻击者如何操作?构造钓鱼链接:www.our-app.com/login?redirect=%2F%2Fmalicious-site.com(%2F是"/"的URL编码)服务器收到参数后: 复制// 未解码直接拼接 String redirect = request.getParameter("redirect"); // 得到"//malicious-site.com" response.sendRedirect("https://our-app.com" + redirect);1.2.3.

实际跳转地址变成:https://our-app.com//malicious-site.com浏览器自动解析为:https://malicious-site.com

为什么测试时没发现?

我们在测试环境用的都是类似/profile的简单路径,完全没料到这些骚操作:

//外部网站 的司背路径拼接攻击@恶意域名 的特殊解析%编码 的绕过手法

二、解剖这只"重定向蟑螂"

2.1 重定向的解决工作原理

图片

就像快递员送错包裹:

用户说:"送完这个去A地址"(带redirect参数)服务器说:"好的,下个包裹送到B地址"(返回302+Location)快递员(浏览器)无脑照做

2.2 漏洞代码长啥样?

这是我最初写的危险代码(Java示例):

复制// 危险示范!请勿模仿! String redirectUrl = request.getParameter("redirect"); response.sendRedirect(redirectUrl);1.2.3.

三、我是源码库怎么填坑的

3.1 第一层防护:白名单验证

复制List<String> allowedPaths = Arrays.asList("/profile", "/dashboard"); if(!allowedPaths.contains(redirectParam)){ redirectParam = "/default"; // 跳转到安全页面 }1.2.3.4.5.

3.2 第二层防护:签名校验

给redirect参数加"防伪码":

复制# 生成签名 sign = hashlib.sha256(redirect_path + SECRET_KEY).hexdigest() safe_url = f"{redirect_path}?sign={sign}" # 验证时 client_sign = request.GET.get(sign) server_sign = hashlib.sha256(redirect_path + SECRET_KEY).hexdigest() if client_sign != server_sign: abort(403)1.2.3.4.5.6.7.8.9.

3.3 第三层防护:相对路径转换

把绝对URL变成相对路径:

复制// 把 https://www.our-app.com/profile 转为 /profile function sanitizeRedirect(url) { return new URL(url).pathname; }1.2.3.4.

四、预防重定向攻击的五个要点

绝不信任客户端传参:把redirect参数当嫌疑人审禁用开放重定向:就像不给陌生人留家门钥匙设置跳转延迟:重要操作前加二次确认记录可疑日志:给异常跳转装监控定期安全扫描:用自动化工具查漏

五、血泪教训总结

这次事故让我明白:安全不是功能,而是底线。现在每次处理重定向时,我都会默念三遍:

"用户传参猛于虎,未经验证就是赌,白名单加签名锁,安全红线不能触。"

最后送大家一个自查清单:

• [ ] 所有redirect参数是否强制校验?

• [ ] 是否存在裸跳转(直接拼接URL)?

• [ ] 是否配置了CSP安全策略?

• [ ] 是否禁用非必要的HTTP方法?

• [ ] 是否定期进行渗透测试?

IT技术网
目前 Opera 提供了针对 Ubuntu 的 .deb 文件(官方下载地址 http://opera.cn.uptodown.com/ubuntu)。Debian的.deb文件应该也可以工作。 Opera 提供了两种基本安装类型:使用静态库和共享库。它们的区别是 Opera 是如何链接到 Qt 库的。在共享库版本中,Opera 使用你机器上的 Qt,而静态库的版本则使用 Opera 内建的 Qt。静态库版本下载的体积更大,在菜单和文件选择器使用了点阵字库(没有抗锯齿功能)。动态的编译版本集成到系统中,这样它使用你其它 Qt 应用程序相同的抗锯齿设置。静态的编译版本在浏览器窗口和其它用户界面还是支持抗锯齿功能。静态版本可能更快和更稳定,至少 Opera 的爱好者已经体验了很长时间。你可以都试试,因为在 Ubuntu 中安装和卸载软件相当容易。 请访问Opera 官方下载http://opera.cn.uptodown.com/ubuntu网站,选择你需要的包并选择一个下载镜像站点。 你也可以访问Opera FTP或网站以获得最新的版本。 保存你下载的文件 安装Opera打开一个终端,转移到你放置下载的deb文件的位置,输入: sudo dpkg -i opera.deb注:Tab 键能够自动帮助你输入较长的复杂的文件名。前提是你在正确的目录中,只要输入“opera”并在上述命令说明的地方按下键盘上的 Tab,Ubuntu 会自动帮助你输入完整的文件名。 安装Opera需要一点时间。 假如你得到一些信息显示依赖的包未安装,请输入: sudo apt-get -f installapt 将会安装这些缺失的包。假如需要最新版,需要自己下载其中opera10.63更新,修复了输入法问题,可以正常连续输入文字了。 http://bbs.operachina.com/viewtopic.php f=78&t=89346 下载地址:http://snapshot.opera.com/unix/22184_10.63-6447/替换方案——通过 apt-get 安装 Opera将下列信息添加到你的 apt sources.list(/etc/apt/sources.list) 文件: deb http://deb.opera.com/opera/ pool/non-free 0 opera或者,你不需要最新的版本可以选择稳定的版本: deb http://deb.opera.com/opera/ stable non-free.修改后保存 sources.list 文件,然后在终端中输入: sudo apt-get update接下来: sudo apt-get install opera所有需要的依赖关系将会被处理,并且你不需要像上面所述创建桌面文件,这些都自动完成了。(译注:事实似乎并非如此,建议你将本文“Ubuntu 化 Opera(完成安装)”的部分进行一遍。) 另一个好处是你不需要持续关注未来的升级,它会自动完成。 在更高版本的opera, 他会自动建立一个文件 /etc/apt/sources.list.d/opera.list , 就像 google-chrome会建立 google-chrome.list 一样, 这个文件就是源信息. 可能在opera 10 测试版本,这个文件名会是 /etc/apt/sources.list.d/opera , 只要手工添加 .list 后缀就行. 假如提示只有 lenny , 只要在文件中找到 opera-beta字样, 改为: deb http://deb.opera.com/opera-beta/ lenny non-free就行. 以后只要 sudo apt-get update ; sudo apt-get install opera 或 apt-get upgrade 就能升级他.很方便. 设置 Opera 为默认浏览器要将 Opera 设置为系统默认的浏览器和邮件客户端,请这么做: 进入“系统 ->首选项 ->首选应用程序” 在“Web 浏览器”标签页选择“自定义”并输入: opera -newpage %s在“邮件阅读器”标签页选择“自定义”并输入: opera -newmail %s启动浏览器你可以通过“应用程序 ->Internet ->Opera”启动这个非常棒的浏览器了。ubuntu里的opera设置一首先,打开opera的 工具——首选项——高级——内容—— 打开 插件选项 ——更改路径,去掉 火狐的插件文件夹的勾。 一、flash插件 1.到Adobe网站(http://get.adobe.com/flashplayer/)下载flashplayer的插件,选择下载tar.gz的那个; 2.解压后,你会发现目录中有一个libflashplayer.so的文件(不用理那个脚本,我们不安装); 3.关闭Opera,把这个libflahsplayer.so放到你的Opera插件目录中,比如/usr/lib/opera/plugins/。假如不知道有哪些插件目录,在Opera中首选项->高级->内容->插件选项,弹出的窗口下方就是你现有的插件路径。当然你也可更改添加路径,但务必保证libflahsplayer.so文件放在现有的的路径中; 4.重新开启Opera,去一些网站测试一下吧:新浪、本友会。假如看到flash播放的内容,那就说明flash插件安装成功。 PS:假如你发现还是无法播放flash,情仔细检查你的插件路径是否正确;或者在Opera中按F12,查看是否开启了插件(Enable plug-ins)。假如你安装的是ubuntu系统,那么可以下载deb格式的那个,直接关闭opera,双击运行就ok了。 二、Opera之在线影音 将附件目录中的所有10个文件(5个*.so、5个*.xpt)拷到Opera的插件目录。比如/usr/local/opera/lib/opera/plugins。注意这个路径必须在Opera的可用插件路径中。 我们会发现,无论是火狐还是opera,在百度mp3那里试听歌曲时,假如离开页面歌曲就暂停了,这个情况,其实也很好解决,只要在播放器上 右击 选择配置——并 去掉 离开窗口 暂时播放 前面的勾就搞定了。也就是最后的一个选项。
酷睿M处理器(探索酷睿M处理器的卓越表现与优势)
最近更新
copyright © 2025 powered by 编程之道  滇ICP备2023006006号-34sitemap