Kali linux 学习笔记(五十五)Web渗透——CSRF 2020.3.31

前言

CSRF
cross-site request forgery

与XSS相比
XSS:利用用户对站点的信任,攻击者通过注入程序来修改网站来使用户浏览器被重定向等
CSRF:利用站点对已经身份认证的用户的信任,攻击者伪造一个链接误导用户点击链接来使用用户的身份认证来访问服务器

1、简介

功能

  • 结合社工在身份认证会话过程中实现供给
  • 修改账号密码、个人信息(email、收货地址)
  • 发送伪造的业务请求(网银、购物、投票)
  • 关注他人社交账号、推送博文
  • 在用户非自愿、不知情的情况下提交请求

业务逻辑漏洞

  • 服务器对关键操作缺少确认机制
  • 自动扫描程序无法发现此漏洞

漏洞利用条件

  • 被害用户已经完成身份认证
  • 新请求的提交不需要重新身份认证或确认机制
  • 攻击者必须了解 Web APP 请求的参数构造
  • 诱使用户触发攻击的指令(社工)

自动扫描程序的检测方法

  • 在请求和响应过程中检查是否存在 anti-CSRF token 名
  • 检查服务器是否验证 anti-CSRF token 的名值
  • 检查 token 中可编辑的字符串
  • 检查 referrer 头是否可以伪造

对策

  • captcha
  • anti-CSRF token
  • referer 头
  • 降低会话超时时间

2、漏洞利用

新的修改密码请求不需要输入原密码
攻击者修改服务器 URL 地址,诱导用户点击修改密码

http://192.168.1.115/dvwa/vulnerabilities/csrf/?password_new=aaaaaaaa&password_conf=aaaaaaaa&Change=Change
# 放在 kali 本机,kali 模拟访问

普通用户在正常登陆 dvwa 的时候,点击此链接
被攻击者的密码被修改
攻击者可以使用新的密码进行登录

生成 PoC 文件

如图所示
Kali linux 学习笔记(五十五)Web渗透——CSRF 2020.3.31_第1张图片
把html内容copy下来放入/var/www/html
修改value,使得被攻击者点击链接后密码被修改
将 URL 保存至文件诱导用户访问

3、服务器源码

dvwa Low 安全级别

<?php        
    if (isset($_GET['Change'])) { 
        // Turn requests into variables 
        $pass_new = $_GET['password_new']; 
        $pass_conf = $_GET['password_conf']; 
        if (($pass_new == $pass_conf)){ 
            $pass_new = mysql_real_escape_string($pass_new); 
            $pass_new = md5($pass_new); 
            $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 
            $result=mysql_query($insert) or die('
' . mysql_error() . '
'
); echo "
 Password Changed 
"
; mysql_close(); } else{ echo "
 Passwords did not match. 
"
; } } ?>

dvwa Medium 安全级别

<?php     
    if (isset($_GET['Change'])) { 
        // Checks the http referer header 
        //只支持上一级的页面是来自本机的(由本机的页面跳转的此页面)
        if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){ 
            // Turn requests into variables 
            $pass_new = $_GET['password_new']; 
            $pass_conf = $_GET['password_conf']; 
            if ($pass_new == $pass_conf){ 
                $pass_new = mysql_real_escape_string($pass_new); 
                $pass_new = md5($pass_new); 
                $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; 
                $result=mysql_query($insert) or die('
' . mysql_error() . '
'
); echo "
 Password Changed 
"
; mysql_close(); } else{ echo "
 Passwords did not match. 
"
; } } } ?> # 只需要使用 burpsuite 修改 referer 值为本机

dvwa High 安全级别

<?php        
    if (isset($_GET['Change'])) { 
        // Turn requests into variables 
        $pass_curr = $_GET['password_current']; 
        $pass_new = $_GET['password_new']; 
        $pass_conf = $_GET['password_conf']; 
        // Sanitise current password input 
        $pass_curr = stripslashes( $pass_curr ); 
        $pass_curr = mysql_real_escape_string( $pass_curr ); 
        $pass_curr = md5( $pass_curr ); 
        // Check that the current password is correct 
        $qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';"; 
        $result = mysql_query($qry) or die('
' . mysql_error() . '
'
); if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){ $pass_new = mysql_real_escape_string($pass_new); $pass_new = md5($pass_new); $insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';"; $result=mysql_query($insert) or die('
' . mysql_error() . '
'
); echo "
 Password Changed 
"
; mysql_close(); } else{ echo "
 Passwords did not match or current password incorrect. 
"
; } } ?>

结语

与XSS有点类似的一个漏洞
主要利用的是已经身份认证的信息

你可能感兴趣的:(kali,linux)