CSRF原理、分类详解
CSRF原理、分类详解
目录
今天学会一个词,失之毫厘谬以千里
CSRF
一、简介:
CSRF(Cross-site Request Forgery)跨站请求伪造(或者缩写为XSRF),也被称为"One Click Attack"或"Session Riding"(曾被列为互联网 20 大安全隐患之一),是一种借助社工对网站身份的恶意利用。
不大流行,但如果被成功利用,危害更大。
1、在跨站点请求伪造(CSRF)攻击中,攻击者只需创建一个看似无害的网站,致使用户的浏览器直接向易受攻击的应用程序提交一个请求,执行某种有利于攻击者的无意操作。同源策略并不阻止一个网站向另一个域提出请求,但它确实阻止提出请求的网站处理跨域请求的响应,正常情况下,CSRF攻击只是一种“单向“ 攻击。
2、所以在纯粹的CSRF攻击中, 要想实施如XSS蠕虫中的多阶段操作,从响应中读取数据并将其合并到随后的请求中, 将很难实现
3、请求易于受到CSRF攻击可能有:请求执行特权操作、仅仅依靠HTTPcookie来追踪会话、攻击者可以确定执行操作所需的所有参数等。
4、针对这些特点表现出的缺陷, 攻击者可以构建一个Web页面,向易受攻击的应用程序提出一个跨域请求, 在其中包含执行特权操作所需的所有步骤。攻击将所有请求参数放入隐藏表单字段中, 并包含一段用于自动提交表单的脚本,用户的浏览器提交此表单时, 将自动添加用户的目标域的cookie,并且应用程序会正常处理生成的请求。如果管理用户登录到易受攻击的应用程序,并访问攻击者的包含此表单的Web页面,该请求将在管理员的会话中处理,攻击者的账户因此得以创建
5、应用程序确认站外图像方面的漏洞称为 "检查时间,使用时间” 漏洞。因为某个数据在一个时间确认,却在另一个时间使用,导致攻击者能够在这两个时间的间隔内修改该数据的值
二、CSRF与XSS的区别:
XSS
通过盗取网站内的已有的用户的身份,然后再执行相关操作
CSRF
通过伪装(伪造、更改状态的请求)用户身份(即盗用身份),通过服务器身份认证后,然后发送恶意请求(服务器会认为请求是合法的),但是服务器给出响应肯定是给真实的那个用户,
三、原理:
在浏览器中cookie在一段时间内是不会过期(不关闭或者退出浏览器),再次访问都会默认登录,这个应该都有体验。如果在cookie存在期间,通过构造csrf脚本或包含csrf脚本的链接发送给用户,得到信息后,再伪造成用户身份,执行相关操作
四、基本流程:
用户在某网站A进行登录-------->身份验证成功,返回cookie给用户---------->攻击者构建一个网站F,诱使用户使用同一浏览器进入(前提:未退出网站A,一般都会有默认浏览器)------------->网站F收到用户请求后,返回恶意代码给用户,强制他访问网站A---------->用户浏览器在网站A上执行相关操作(以已经持有的cookie)
五、危害:
比如发消息、盗号、转账……等没有没有需要再次验证身份的基本操作。
再要验证身份的话,那就再社工……(搭建一个一模一样的网站……)
六、分类:
站外攻击:
因为考虑到用户体验感,就不会将用户限制的死死的,一定会开放一部分功能供使用,攻击者在站外构造脚本伪造请求,用户在攻击者构造的网站中触发伪造请求时,强制用户客户端就会发起请求(一般是在同一浏览器,而且某一用户登录上的未退出的网站)
站内攻击:
如果开发人员滥用$_REQUEST 类变量,以Post提交的数据表单,也支持Get传参。攻击者把预测的请求参数上传到站内贴子或留言的图片链接里,当用户浏览了含有请求参数的页面就强制发出这些请求。
七、举例:
Get提交方法:
在你精心构造网页的事件里面,添加一些要求用户执行相关请求行为的链接
<a href="转款URL">砍一刀立赚200块</a>
这个标签把,也可以在其他里面,就是看哪里点击概率大
<img src="URL">
……
<meta charset='utf-8'>
<img src='./1.jpg'><br />
<img src='URL/bank/action.php?
username=xxx&money=10000&submit=%E4%BA%A4%E6%98%93'
alt='砍一刀赚200,这不冲'>
<meta>:可提供有关页面的元信息,位于头部。在 HTML 中,没有结束标签。 在 XHTML 中,必须被正确地关闭。
charset:编码
username、money:都是可能的参数名
alt:替代文本
Post提交方法:
post提交,一般都是提交到服务器的一些重要的东西
也可以在构造的网页里面有一个让别人容易相信的表单等post提交方法(不涉及很多私密东西)
用户提交post请求后,然后触发post伪造请求用户自己登录过的网站服务器,执行……
<meta charset='utf-8'>
<form name='csrf' action='URL/bank/action.php' method='post'>
<input type='hidden' name='xxxx' value='xxxx'>
<input type='hidden' name='money' value='10000'>
</form>
<script>document.csrf.submit()</script>
<img src="./1.jpg" ><br />
</form>:创建供用户输入的 HTML 表单
document:每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问
未进行CSRF-token验证
位置:
cookie、 form表单、 URL参数
原理:
当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错
cookie中的token:
cookie一般不会附带HttpOnly属性,因为如果服务器自己要想再在cookie里面提取东西就不行了
因为CSRF-toke是限制CSRF,所以我们就要通过一定方法拿到CSRF-toke,问题就解决了
所以我们需要结合其他手段进行获取,例如xss等
FLASH CSRF
属性:
AllowScriptAccess:控制Flash与HTML页面的通信(设置不当导致XSS)
AllowNetworking:控制Flash与外部网络的通信(设置不当导致CSRF)
Json劫持
简介:
又称“JSON Hijacking”(与CSRF类似),Json劫持是为了达到获取敏感数据的目的,而CSRF类似于钓鱼(愿者上钩)
简而言之,就是对数据进行窃取,转向发给自己
获取数据的方式:
xmlhttp:
{"username":"……","password":"……"}
script:
userinfo={"username":"……","password":"……"}
利用过程:
第一步:寻找网站对象,使用AJAX(一般为JSON传输数据)作为前端脚本
第二步:诱导用户进入钓鱼网站
第三步:劫持钓鱼网站中用户的数据
- 点赞
- 收藏
- 关注作者
评论(0)