http-only原理与防御XSS实践
创始人
2024-01-25 02:41:59

目录

  • 预备知识
    • XSS攻击
  • 实验目的
  • 实验环境
  • 实验步骤一
    • 触发XSS漏洞
  • 实验步骤二
    • 引入Http-only
  • 实验步骤三
    • 验证http–only在防御XSS攻击时的作用

预备知识

XSS攻击

http-only的设计主要是用来防御XSS攻击,所以学习本实验的读者应首先了解XSS攻击的相关原理内容。
跨站点脚本攻击是困扰Web服务器安全的常见问题之一。跨站点脚本攻击是一种服务器端的安全漏洞,常见于当把用户的输入作为HTML提交时,服务器端没有进行适当的过滤所致。跨站点脚本攻击可能引起泄漏Web站点用户的敏感信息。为了降低跨站点脚本攻击的风险,微软公司的Internet Explorer 6 SP1引入了一项新的特性。
对于很多只依赖于cookie验证的网站来说,http-only cookies是一个很好的解决方案,在支持http-only cookies的浏览器中(IE6以上,FF3.0以上),Javascript是无法读取和修改http-only cookies,这样可让网站用户验证更加安全。

实验目的

1)了解http-only的作用及在Cookie中的存在方式。
2)掌握通过设置http-only防御XSS攻击。

实验环境

在这里插入图片描述
一台Windows XP主机。
主机部署实验测试网站。
主机安装Fiddler软件。

实验步骤一

触发XSS漏洞

在IE浏览器中访问本实验的测试网站:http://10.1.1.189/httponly-test/login.php。
注意,本实验一定要在IE中浏览网页,这是因为目前版本的IE没有XSS过滤器,方便我们做实验
此时我们打开fiddler工具抓包,返回浏览器,在登录框中输入用户ID:admin和密码:123456进行登录。登录后我们可以看到主界面:
在这里插入图片描述
在Fiddler中查看刚刚用于登录的HTTP包,观察响应头的Cookie字段(红色框内),记录下此时的cookie内容:
在这里插入图片描述
这里的昵称输入框由于没有对输入字符进行过滤,存在XSS漏洞。我们在框中输入“”提交验证,结果弹出如下提示,从而验证了XSS漏洞的存在。(对于XSS不理解的读者一定要首先掌握XSS基本知识)
在这里插入图片描述
在网站建设过程中,由于编程人员安全意识薄弱或工作疏忽,很容易出现如上所示的XSS漏洞。恶意攻击者可以利用该种漏洞窃取用户Cookie信息,从而冒充用户身份访问网站。应对XSS攻击,可以采用对输入(输出)文本进行特殊字符过滤的方式,但由于网站业务类型复杂多样,且针对过滤也存在绕过方法,所以,仅仅通过过滤手段并不能完全解决XSS问题。Http-only的引入,就是从防止脚本读取Cookie的角度有效防御了XSS漏洞的攻击。

实验步骤二

引入Http-only

http-only具体怎样引入,又为何能解决XSS问题呢?
我们重新看步骤一中所抓取得http包,当我们输入用户名和口令进行登录操作时,服务器端对口令进行校验,如果成功,返回给我们登录信息,并且在返回数据包中包含了cookie信息,以便保存用户的登录状态。如这条cookie:

id=admin;expires=mon, 30-Nov-2020 08:53:35 GMT

它实质上包含了两个内容,一个是服务器端程序设定的用于保存用户身份标识的字段值(id=admin),另一个是这条cookie的过期时间。而步骤一中的XSS攻击做了什么呢?它利用JavaScript脚本,读取到了这条cookie,既然能读取到,那攻击者就更有办法把这条cookie为他所用,借用cookie中包含的身份标识假冒用户去登录网站。这时,如果能出台一种机制,禁止JavaScript脚本来读取cookie信息,那一切都得到了解决。攻击者即使成功发动了XSS攻击,获得了在用户浏览器端执行JavaScript脚本的能力,但由于脚本无法读取cookie,他仍然不能得到任何用户身份标识。
http-only字段,就是加在cookie身上的一个“护身符”。浏览器存在这种机制,只要cookie中含有Http-only字段,那么任何JavaScript脚本都没有权限读取这条cookie的内容。
所以,下边我们要改写服务器端代码,使用户重新登陆后,Cookie中附带上http­-only属性。找到源代码文件:C:\xampp\htdocs\httponly-test\login.php,右键选择EditPlus打开。注意不要用记事本修改php代码,否则会误添加BOM导致PHP无法正常解析。打开文件方法如下图所示:
在这里插入图片描述
找到下图所示两行代码,setcookie函数表示当验证用户合法登陆后,向用户浏览器中返回Cookie。
在这里插入图片描述
上图中的两条setcookie语句,在实际过程中就转变为服务器向客户端返回的两条cookie信息:

Set-Cookie:id=admin;expires=mon, 30-Nov-2020 08:53:35 GMT
Set-Cookie:pass=12346;expires=mon,30-Nov-2020 08:53:35 GMT

现在,我们修改setcookie方法参数,改为以下这种方式调用setcookie:
在这里插入图片描述
我们在setcookie方法的第七个传入参数中设置了变量TRUE,表示这个cookie具有HTTP-only属性。保存并退出文件。
回到浏览器中,首先把浏览器的Cookie清空。清空方法为打开菜单栏→工具→Internet选项,选择删除Cookie:
在这里插入图片描述
打开抓包软件Fiddler,重新登陆我们的测试网站。

http://10.1.1.189/httponly-test/login.php

登陆后在fiddler中观察数据包。
在这里插入图片描述
可以发现,这次服务器返回给用户浏览器的cookie中,两个字段都被添加上了http-only属性。这样从理论上,用户的身份标识cookie,因为有了http-only这个“护身符”,将令任何JavaScript脚本无可奈何。

实验步骤三

验证http–only在防御XSS攻击时的作用

我们接着步骤二的操作,现在我们已经成功登录进输入昵称的界面中。此时,这个输入框仍然存在反射型XSS漏洞,我们继续利用该漏洞点,尝试窃取cookie。在昵称输入框中输入:


点击提交,此时再观察弹出框:
在这里插入图片描述
此时发现,虽然XSS漏洞点依旧存在,但XSS的恶意利用脚本已无法获取到用户的Cookie,弹出的内容为空。这个实验结果成功验证向cookie中添加http-only字段的效果。通过这种方法,网站成功保护了用户的Cookie信息免遭攻击者窃取。
我们知道,防御XSS攻击的思路方法有很多。我们常见的,如在用户输入和输出端加过滤,过滤掉某些特殊字符,从而避免恶意JavaScript脚本的运行。而http-only,则是从另一角度考虑对XSS做防御,即使攻击者传进来的恶意JavaScript脚本得到运行,但我的用户cookie受到了保护,脚本无法读取cookie内容。这使得想利用XSS攻击窃取用户身份的想法化为泡影。在实战中,网站防御者们往往会综合利用到对字符做过滤和添加http-only属性的方式,对抗XSS。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
公司优势怎么写比较好 如何描述... 我对企业竞争优势的理解和总结
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
乌拉是什么意思 乌托邦是什么意... 相信对俄罗斯有一定了解的朋友肯定不会对“乌拉”(Ура,读成“歪--屁--哎”的朋友请出门左转不送)...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...