跨站请求伪造漏洞原理与实战
跨站请求伪造漏洞原理与实战
hihopkc跨站请求伪造漏洞
定义
跨站请求伪造Cross-site request forgery(也称为CSRF、XSRF)是一种Web安全漏洞,允许攻击者诱导用户执行他们不打算执行的操作。攻击者通过伪造用户的浏览器的请求,向用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行操作。
跨站:从一个网站到另一个网站
请求:HTTP请求
伪造:仿造、伪装
一个网站A中发起一个到网站B的请求,而这个请求是经过了伪装的,伪装操作达到的目的就是让请求看起来像是从网站B中发起的,也就是说,让B网站所在的服务器端误以为该请求是从自己网站发起的,而不是从A网站发起的。当然,请求一般都是恶意的。看到这里,你可能会问:为什么要伪装成从B网站发起的呢?从网站A直接向B网站服务器发起请求不可以吗?之所以要伪装成从B网站发起的,是因为Cookie是不能跨域发送的。结合上面这个例子来说就是:如果从A网站直接发送请求到B网站服务器的话,是无法将B网站中产生的Cookie一起发给B服务器的。
可能你还会问,为什么非要发送Cookie呢?这是因为服务器在用户登录后会将用户的一些信息放到Cookie中返回给客户端,然后客户端在请求一些需要认证的资源的时候会把Cookie一起发给服务器,服务器通过读取Cookie中的信息来进行用户认证,认证通过后才会做出正确的响应。
A网站访问B网站服务器的一些需要认证的资源的时候,如果没有Cookie信息,服务器是拒绝访问的,那么A网站就无法进行恶意操作。而伪造成B网站的请求,就可以将B网站的Cookie一起发 到B服务器,这个时候就服务器就认为该请求是合法的,就会给出正确的响应,这个时候,A网站就达到目的了
简单一句话就是:攻击者盗用了你的身份,以你的名义发送恶意请求。
漏洞成因
CSRF漏洞一般是由于没有检查Referer以及未在头部设置token造成的。
漏洞危害
CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转 账……造成的问题包括:个人隐私泄露以及财产安全等等等等。可以说CSRF能够做什么,取决于你在 网站里能做什么操作。
CSRF与XSS的区别
CSRF与XSS不同,主要在于XSS是获取用户的凭证信息等,而CSRF是利用用户凭证信息,并不获 取。
漏洞类型
GET型CSRF
GET类型的CSRF利用非常简单,只需要一个HTTP请求,这种类型的CSRF一般是由于人员安全意识不强造成的,比如攻击者将一个修改密码的链接发送给受害者,受害者在登录网站的情况下点击该链接,则受害者的密码被修改了。
靶场示例
受害者A(admin/password)登录了网站,网站里有修改密码的功能
攻击者B(smithy/passwrod)也登录网站获取网站里修改密码的参数,因为同样的网站同等级的用户里面的功能是一样的
复制这个链接
1 | http://127.0.0.1/02bachang/DVWA/vulnerabilities/csrf/?password_new=test&password_conf=test&Change=Change# |
攻击者B将构造好的链接发送给受害者A(如果网站存在存储型的XSS漏洞,还可以将链接插入进去), 受害者A在没有退出网站的情况下点击了链接,则密码无意中被修改了
即simthy的密码也变成了test
POST型CSRF
这种类型的CSRF危害没有GET型的大,利用起来通常使用的是一个自动提交的表单,如:
<form action=http://test.com/csrf.php method=POST>
<input type=”hidden” name=”xx” value=”11” />
</form>
<script>document.forms[0].submit()</script>
访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作,同样会提交到服务器,更改 相关的信息。
靶场示例catfishcms
数据库密码为root
漏洞利用
攻击者视角
注册账户,登录后进入个人中心编辑资料
然后抓包并生成恶意文件html文件
生成后将改文件发给受害者(或者将该文件放到攻击者的服务器里,然后把链接发给受害者)
受害者视角
受害者也在网站上有账号(没有的话注册一个),然后受害者在登录网站的情况下在同一个浏览器打 开该文件,受害者的个人信息就被修改了
CSRF与XSS的组合拳
在前面关于XSS漏洞的防御中提到过,如果网站设置了http-only就不能获取cookie了,我们可以换个思路,不再去窃取用户的cookie,而是直接利用它。
例如,在存在xss漏洞的A网站上注入一条链接点击这里领取黑客秘籍<a href=”xxx.xxxx.xxx/test.php? money=1111”/>,当用户点击之后,进入攻击者提前写好的网站B,触发网站B中,例如<img src=”http:// 网站A/test.php?Id=1&money=100000”/>这样的恶意代码。这时候由于用户带有A网站的认证信息,B网站利用用户此时的请求,篡改GET或POST表单内的参数,在用户不知情的情况下请求A网站,完成转账,修改密码等恶意操作。
漏洞修复
Referer检查。攻击者虽然是利用用户的请求进行访问,但是Referer的内容显示的是B网站,也就是攻击者自己构造的网站。如果对Referer进行白名单检查,看是否来自合法的网站。如果不是,就极有可能是CSRF攻击。
添加Token验证。CSRF攻击成功的原因就是利用用户已经认证过的cookie信息。cookie中的身份信息在请求时会自动添加,所以我们要在cookie外再加入一种验证身份的信息。具体的做法是在HTTP请求中,以参数的形式加入一个随机产生的Token,并在服务器端建立一个拦截器来验证这个Token,如果请求中没有 Token 或者 Token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求