1
CSRF
跨站请求伪造,是一种对网站的恶意利用。与XSS不同,它是对它伪装成用户的请求来访问网站。比XSS更加难以防范,更加具有危险性。
可以这么说攻击者盗用了你的身份,以你的名义发送恶意请求。可能会导致个人隐私泄露以及财产安全。
攻击步骤:1登录受信任网站并在本地生成cookie;2 在不登出A的情况下,访问危险网站B
2.CSRF是一种依赖web浏览器的、被混淆过的代理人攻击(deputy attack)。在上面银行示例中的代理人是Bob的web浏览器,它被混淆后误将Bob的授权直接交给了Alice使用
CSRF漏洞成因:网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,之后只要访问这个网站,都会默认你已经登录的状态。在此期间,攻击者发送了构造好的csrf脚本,或包含csrf脚本的链接,诱使受害者去点击
XSS与CSRF的区别
XSS:是攻击者盗取受害者cookie,并自己使用凭证进入系统,执行操作
CSRF:攻击者利用cookie凭证,是受害者自己进入系统,帮助攻击者执行各种操作且不会被察觉
防御
对服务端和客户端着手
服务端:在客户端页面增加伪随机数,在表单里增加hash值,以认证这确实是用户发送的请求。然后在服务端进行hash值验证
还有就是使用常见的验证码。
不同的表单包含一个不同的伪随机值
验证 HTTP Referer 字段;
在请求地址中添加 token 并验证;
在 HTTP 头中自定义属性并验证。
绕过:
不管哪种CSRF防御措施部署,你都可以先尝试如下两件事:点击劫持和更改请求方法。
点击劫持
在同一个功能端点利用点击劫持会绕过所有CSRF防御。因为从技术上讲,请求确实来自合法站点,如果易受攻击的端点所在页面容易遭受点击劫持攻击,那么所有的CSRF保护将变得没有效果,攻击者可以任意执行CSRF攻击。
更改请求方法
另外值得一试的方法就是更改请求的方法。如果要伪造的敏感请求是通过POST方法发送的,那么尝试将其转换为GET请求。如果操作时通过GET方法发送的,那么尝试转换为POST方法。应用程序可能仍然执行操作,且通常没有任何保护机制。
绕过正则表达式
如果referer检查是基于白名单的,你可以尝试绕过验证URL的正则表达式。例如,你可以尝试在referer的URL中将受害者域名置于二级域名区域或者URL目录区域。
移除referer字段
和发送一个空token值相同,有时候你只需简单地移除referer字段就可以绕过CSRF防御。你可以添加如下meta标签到存在漏洞的页面。
应用程序可能只是在发送后才会验证,这种情况下你可以绕过其CSRF防御。
删除token参数或发送空token
不发送token也可以正常请求数据是因为这种逻辑错误在应用程序中非常常见:应用程序有时会在token存在的时候或者token参数不为空的时候检查token的有效性。这种情况下,如果一个请求不包含token或者token值为空,那么也是有可能绕过CSRF的防御的。
XSS
漏洞原理,跨站脚本攻击。它就是说攻击者往web页面里插入恶意的JS代码,当用户浏览这个网页的时候,js代码会被执行,从而达到攻击效果。
利用我们所知道的各种黑魔法,向web页面插入js代码,让js代码可以被浏览器执行,访问该页面的用户则被攻击。
Xss其实是一种被动式的攻击。
反射型XSS也叫做非持久型XSS,
攻击者在URL中插入XSS代码,服务端将URL中的XSS代码输出到页面上,攻击者将带有XSS代码的URL发送给用户,
用户打开后受到XSS攻击。
通过修改页面的DOM节点形成的XSS,称之为XSS;效果跟反射型XSS类似
攻击者在URL中插入XSS代码,前端页面直接从URL中获取XSS代码并且输出到页面,导致XSS代码的执行,攻击者将带有XSS代码的URL发给用户,用户打开后受到XSS攻击。
存储XSS的原理
攻击者在页面上插入XSS代码,服务器端将数据存入数据库,当用户访问到存在XSS漏洞的页面时
服务器端从数据库中取出数据展示到页面上,导致XSS代码执行,达到攻击效果。
防御
过滤输入和转义输出。
具体执行的方式有以下几点:
第一、在输入方面对所有用户提交内容进行可靠的输入验证,提交内容包括URL、查询关键字、http头、post数据等
第二、在输出方面,在用户输内容中使用
标签。标签内的内容不会解释,直接显示。
第三、严格执行字符输入字数控制。
四、在脚本执行区中,应绝无用户输入。
XSS防御的总体思路是:对输入(和URL参数)进行过滤,对输出进行编码。
也就是对提交的所有内容进行过滤,对url中的参数进行过滤,过滤掉会导致脚本执行的相关内容;然后对动态输出到页面的内容进行html编码,使脚本无法在浏览器中执行。虽然对输入过滤可以被绕过,但是也还是会拦截很大一部分的XSS攻击。
3.1 对输入和URL参数进行过滤(白名单和黑名单)
对于输入,处理使用XSS filter之外,对于每一个输入,在客户端和服务器端还要进行各种验证,验证是否合法字符,长度是否合法,格式是否正确。在客户端和服务端都要进行验证,因为客户端的验证很容易被绕过。其实这种验证也分为了黑名单和白名单。黑名单的验证就是不能出现某些字符,白名单的验证就是只能出现某些字符。尽量使用白名单。
3.2 对输出进行编码
在输出数据之前对潜在的威胁的字符进行编码、转义是防御XSS攻击十分有效的措施。如果使用好的话,理论上是可以防御住所有的XSS攻击的。
对所有要动态输出到页面的内容,通通进行相关的编码和转义。当然转义是按照其输出的上下文环境来决定如何转义的。
XSS攻击访问方法:对输入(和URL参数)进行过滤,对输出进行编码;白名单和黑名单结合;
绕过
大小写绕过
这个绕过方式的出现是因为网站仅仅只过滤了<script>标签
利用过滤后返回语句再次构成攻击语句来绕过
我们直接敲入script标签发现返回的网页代码中script标签被去除了,但其余的内容并没有改变。
于是我们就可以人为的制造一种巧合,让过滤完script标签后的语句中还有script标签
编码脚本代码绕过关键字过滤
有的时候,服务器往往会对代码中的关键字(如alert)进行过滤,这个时候我们可以尝试将关键字进行编码后再插入,不过直接显示编码是不能被浏览器执行的,我们可以用另一个语句eval()来实现。eval()会将编码过的语句解码后再执行
Sql注入
原理:SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
防御手段:
绕过方法:
绕过空格 /**/ %a0,也可利用括号
引号绕过,使用十六进制
逗号绕过:使用from或者offset
比较符号<>绕过,用between and
Or and xor not 绕过:and=&& or=|| not=!
绕过注释符号#,后面跟一个空格
=绕过使用like rlike、regexp
绕过关键字:使用注释符、使用大小写混合、双关键字绕过
使用编码
PCRE绕过
文件上传:
- 原理 在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
绕过:
javascript验证突破
•大小写突破
•服务器文件扩展名检测
•过滤文件名突破
•特殊后缀名
• MIME类型检测
•文件内容检测
•分布式配置文件(文件重写)
• 0x00截断(目录路径检测
客户端检测绕过(js检测):
利用firebug禁用js或使用burp代理工具可轻易突破。
服务端MIME检测绕过(Content-Type检测):
使用burp代理,修改Content-Type的参数
服务端扩展名检测绕过:
文件名大小写绕过,例如Php,AsP等类似的文件名
后缀名字双写嵌套,例如pphphp,asaspp等
可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
可以利用asp程序中的漏洞,使用截断字符绕过
可以利用不再黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制
可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过
服务端内容检测绕过:
通过在文件中添加正常文件的标识或其他关键字符绕过
文件加载检测绕过,针对渲染加载测试
代码注入绕过,针对二次渲染测试
防护
- 文件的上传目录设为不可执行
- 可以使用黑名单以及白名单结合的方式限制文件上传
- 使用JS对文件的大小、拓展名进行剑测
- 使用取随机文件名,可以是md5也可以是时间