第四章 跨站点请求伪造(CSRF)
CSRF的中文名是跨站点请求伪造,很多安全工程师不理解它的利用与危害,因此不予重视。
攻击形成的本质是重要操作的所有参数都可以被攻击者猜测到。
1.CSRF简介
攻击者仅仅诱使用户访问一个页面,就以该用户身份在第三方站点里执行了一次删除操作。
原理:用户访问攻击者的页面时,本地Cookie被读取,并在执行删除操作时附加带上作为用户认证使用。2.CSRF进阶
1.浏览器的Cookie策略
共2种Cookie,临时Cookie和本地Cookie
临时Cookie又叫做Session Cookie,本地Cookie又叫做第三方Cookie,区别是,前者没指定过期时间。
火狐浏览器允许第三方Cookie发送给第三方站。
2.不良后果(P3P头),在网站业务中,P3P头主要用于类似广告等需要跨域访问的页面。后果是,对于Cookie的影响扩大
到整个域中的所有页面,因为Cookie是以域和path为单位的,这不符合最小特权原则。P3P头的广泛应用,
使得CSRF的防御不能完全依靠浏览器的Cookie跨域拦截策略。
3.POST请求不能防止CSRF攻击,攻击者隐藏一个iframe窗口,构造一个form表单,发送表单时带上Cookie完成攻击动作。
4.Flash中的CSRF,在IE8以前,发送网络请求均可以带上本地Cookie
5.CSRF蠕虫传播垃圾消息,原理发送一条带图片的消息,图片地址在此指向CSRF页面。
3.CSRF的防御
1.验证码是最简单有效的防御方法
2.Referer Check,用户想发帖,Referer的值必然是在发帖表单所在的页面。这个检测机制的缺陷是,服务器并非什么
时候都能取到Referer。浏览器可能会出于安全考虑,不发送Referer。倒是可以用这个检测机制监控CSRF的发生。
3.Token方案,最优秀的CSRF防御方案,CSRF的参数加密后会给数据分析工作带来困扰,因此需要明文参数。
Token是保存原参数不变,新增一个参数Token,Token是随机的,不可预测的。Token放在表单和Session中,
提交后,服务器需要验证Token和用户Session是否一致。攻击者很难伪造出Token,除非存在XSS,用js读出Token。
每提交一次表单就消耗一个Token,考虑到多页面共存的需要,需要一次生成多个有效的Token第五章 点击劫持
1.点击劫持本质就是视觉欺骗,让你不断点击下一步。
2.Flash点击劫持,复制动作操作后,可以控制用户摄像头。
3.通过图片覆盖在关键位置上,视觉欺骗用户进入钓鱼网站。
4.拖拽劫持与数据窃取,通过让用户玩一个游戏,让用户把数据拖到透明的iframe中,窃取数据。
5.触屏劫持,类似于图片覆盖,在智能手机上操作起来更方便,完成钓鱼欺骗操作。
6.如何防御
1.frame busting
这个方案想通过使用js语句禁止iframe的嵌套,来防御点击劫持。
缺陷是恶意脚本可以通过限制iframe的js语句执行,让这安全策略失效。
2.X-Frame-Options
这个方案比较优秀,在HTTP头部告诉浏览器,拒绝加载frame页面。第六章 HTML 5安全
HTML5的新标签可能带来新的安全问题,注意这些新特性,可能会被用来绕过防御方案。
1.HTML5新标签
1.新标签的XSS,比如<video>标签允许加载一段视频,可能会被用来绕过XSS Filter
2.iframe的sandbox,H5中特别为iframe定义了sandbox属性,用来限制其脚本执行。
3.Link Types:noreferrer,H5中<a>标签加入了noreferrer属性,不再发送Referer
4.Canvas的妙用:H5的最大创新之一,其加入让js可以操作图片,甚至破解验证码。
2.其他安全问题
1.Cross-Origin Resouece Sharing,跨域访问需求,通过HTTP头实现,注意小心使用通配符。
2.postMessage,跨窗口传递消息,不受同源限制。必要时要验证Domain相当于代码中实现同源策略。
3.Web Storage,为离线浏览服务,受同源策略保护。
第七章 注入攻击
注入的本质,是把用户输入的数据单做代码执行。这里有两个关键条件,
第一个是用户能够控制输入,第二个是程序要执行的代码拼接了用户输入的数据。
1.SQL注入
1.盲注,服务器没有错误回显时完成的注入攻击。攻击者通过简单的条件判断,
对比页面的返回结果差异,判断SQL注入漏洞是否存在。
2.Timing Attack,延时注入,Mysql官网曾被黑客用BENCHMARK延时注入。
2.数据库攻击技巧
1.常见的攻击技巧,使用union select根据结果判断表名是否存在。
2.命令执行,除了可以通过导出webshell间接地执行命令外,
还可用UDF直接执行命令。sqlmap已集成该功能。MS SQL Server使用xp_cmdshell执行系统命令。
3.攻击存储过程,存储过程带来便利也带来潜在的威胁,xp_cmdshell在sqlserver05后默认关闭状态,
相比之下oracle的存储过程注入可能性要更大些。
4.编码问题,统一数据库、操作系统、Web应用所使用的字符集,避免宽字节注入。
5.SQL Column Truncation,若开启该选项后,MySQL插入超长的值时会发生截断问题,并插入成功,受影响的案例有wordpress。
3.正确地防御SQL注入
1.使用预编译语句
2.使用安全的存储过程
3.检查数据类型,很大程度上可以对抗SQL注入
4.使用安全函数,如OWASP ESAPI提供的函数。
4.其他注入攻击
1.XML注入,转义特殊字符即可防范。
2.代码注入,往往是由不安全的函数或者方法引起的,多见于脚本语言。
3.CRLF注入,可能会改变原语意,把一条日志变两条。甚至破坏HTTP头,关闭XSS Filter,提前结束HTTP头,XSS得以执行。
第八章 文件上传漏洞
文件上传漏洞是最低门槛的攻击漏洞,指的是用户上传了一个可执行的脚本文件,并通过脚本获得执行命令的权限。
1.文件上传漏洞概述
上传文件通常有这几类,脚本、flash策略文件、木马病毒、脚本图片。
首先文件得被Web容器解析执行,其次用户可以访问该文件,最后文件不能被安全检查或格式化、重编码损坏。
1.文件编辑器
老版本的编辑器会采用黑名单过滤策略,通常会有漏网之鱼。建议删除文件编辑前文件上传的代码。
2.绕过文件上传检查功能
在文件名后添加%00字节,可以截断某些函数对文件名的判断。
其中[\0]为十六进制下的0x00字符,xxx.php[\0].JPG得以上传,最终会识别成xxx.php
如果网站不仅通过后缀名,还通过MIME 判断文件类型,还需要伪造一个合法文件头。
2.功能还是和漏洞
开发者没有深入理解功能的细节, 往往会导致漏洞的发生。
1.Apache文件解析问题
对文件名的解析,从后往前解析。
2.IIS 文件解析问题
IIS 6会出现截断文件名。如果IIS6勾选了脚本资源访问复选框,MOVE方法将允许执行。MOVE方法可以用来更改文件名。
3.PHP CGI路径解析问题
Nginx配置fastcgi使用PHP时,http://xxx/a.jpg/noon.php, 若noon.php不存在,a.jpg将被被解析成php执行。
PHP官方建议是 将 cgi.fix_pathinfo 设置为0
4.利用上传文件钓鱼
通过传播带脚本的图片,跳转到指定的钓鱼网站。
3.涉及安全的文件上传功能考虑
目录内的文件不可执行
判断文件类型,重新编码或者压缩文件。
随机数改写文件名和路径。
另设文件服务器