小白日记50:kali渗透测试之Web渗透-CSRF
CSRF原理:经常与XSS混淆。
从信任的角度进行区分:XSS:利用用户对站点的信任;CSRF:利用站点对已经身份认证的信任(有一定的信任)【默认情况:站点不信任客户端】
结合社工在身份认证会话过程中实现攻击
场景:
1、修改账号密码、个人信息(email、收货地址)
2、发送伪造的业务请求(网银、购物、投票)
3、关注他人社交账号、推送博文
4、在用户非自愿、不知情情况下提交请求
属于业务逻辑漏洞(所有请求都是正常的请求)
对关键操作(支付、提交订单等)缺少确认机制(如验证码)
自动扫描程序无法发现此类漏洞
漏洞利用条件
被害用户已经完成身份认证(即已登录)
新请求的提交(重要性的)不需要重新身份验证
攻击者必须了解Web Application请求的参数构造
诱使用户触发攻击的指令(社工)
Burpsuite CSRF PoC generator
Post/Get方法
CSRF漏洞演示过程【win7为受害者,修改密码页面,kali为攻击机】
低级别,无需输入原密码【伪造页面和链接,诱使受害者点击】
注:GET方法:将会在页面有明显显示;POST方法:将可隐藏操作
GET
POST
查看网页源代码,直接修改表单的代码,保存成页面文件,诱使用户点击【使用burpsuite截断重放】
保存成html文件,伪造链接,发给受害者
代码审计
low
1 <?php 2 3 if (isset($_GET['Change'])) { 4 5 // Turn requests into variables 6 $pass_new = $_GET['password_new']; 7 $pass_conf = $_GET['password_conf']; 8 9 10 if (($pass_new == $pass_conf)){ 11 $pass_new = mysql_real_escape_string($pass_new); 12 $pass_new = md5($pass_new); 13 14 $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 15 $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); 16 17 echo "<pre> Password Changed </pre>"; 18 mysql_close(); 19 } 20 21 else{ 22 echo "<pre> Passwords did not match. </pre>"; 23 } 24 25 } 26 ?>
medium【绕过referer】
1 <?php 2 3 if (isset($_GET['Change'])) { 4 5 // Checks the http referer header 6 if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){ //判断来源,限制接受本机IP的包【可将其替换或在referer中包含127.0.0.1】 7 8 // Turn requests into variables 9 $pass_new = $_GET['password_new']; 10 $pass_conf = $_GET['password_conf']; 11 12 if ($pass_new == $pass_conf){ 13 $pass_new = mysql_real_escape_string($pass_new); 14 $pass_new = md5($pass_new); 15 16 $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 17 $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); 18 19 echo "<pre> Password Changed </pre>"; 20 mysql_close(); 21 } 22 23 else{ 24 echo "<pre> Passwords did not match. </pre>"; 25 } 26 27 } 28 29 } 30 ?>
high 【需输入原密码】
1 <?php 2 3 if (isset($_GET['Change'])) { 4 5 // Turn requests into variables 6 $pass_curr = $_GET['password_current']; 7 $pass_new = $_GET['password_new']; 8 $pass_conf = $_GET['password_conf']; 9 10 // Sanitise current password input 11 $pass_curr = stripslashes( $pass_curr ); 12 $pass_curr = mysql_real_escape_string( $pass_curr ); 13 $pass_curr = md5( $pass_curr ); 14 15 // Check that the current password is correct 16 $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';"; 17 $result = mysql_query($qry) or die('<pre>' . mysql_error() . '</pre>' ); 18 19 if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){ 20 $pass_new = mysql_real_escape_string($pass_new); 21 $pass_new = md5($pass_new); 22 23 $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 24 $result=mysql_query($insert) or die('<pre>' . mysql_error() . '</pre>' ); 25 26 echo "<pre> Password Changed </pre>"; 27 mysql_close(); 28 } 29 30 else{ 31 echo "<pre> Passwords did not match or current password incorrect. </pre>"; 32 } 33 34 } 35 ?>
自动扫描程序的检测方法【代码安全,确认机制角度】
在请求和响应过程中检查是否存在anti-CSRF token名
检查服务器是否验证anti-CSRF token的名值
检查token中可编辑的字符串
检查referrer头是否可以伪造
对策
Captcha
Referrer头 【可绕过机率较大】
降低会话超时时间