【笔记】网易微专业-Web安全工程师-04.WEB安全实战-2.暴力破解

KP君之前买了一个拉杆箱,在初始设置密码时不熟悉步骤,一时手抖,密码已经设好,但不知道设置了什么密码,欲哭无泪。想要找回密码,只能一个个试验,拉杠箱的密码锁有3位,对应000~999,那么最多需要1000次就能打开密码,这就是简单的“暴力破解”。

暴力破解(Brute Force):核心就是“穷举法”,猜出用户的密码。看起来似乎工程量很大,但是通常用户设置密码都不太复杂,因此利用常用的密码字典,就能破获大部分的密码。理论上来说,只要给定足够的时间,暴力破解就一定能破译密码。

在实战前,先介绍一款渗透工具OWASP ZAP (Zed Attack Proxy),可点击下方链接了解和下载安装。

https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

这款工具功能强大,包含抓包,爬虫,端口扫描,主动扫描等等。我们在暴力破解这一章节中要利用的是它的抓包以及Fuzzy功能。

DVWA实战:

1. 打开phpStudy或xampp,运行Apach和MySQL;

2. 打开ZAP软件,默认代理端口是8080;因此,需要我们在Firefox设置同样的代理端口,可以使用之前提到的Proxy Switcher插件实现,也可直接配置浏览器的网络代理。

3. 浏览器进入DVWA主界面,在左侧栏选择DVWA Security安全等级为Low,然后进入Brute Force;

4. 随便输入一个用户名和密码:kplayer/password,收到报错提示:

通过ZAP抓包,我们看到登录时采用GET方法,带上username和password参数:

因此,我们采用暴力破解的一个思路就是构造多条URL请求,替换其中的username和password,不过要是人工构造,那跟在输入框里一个个输有什么两样?好在ZAP提供了Fuzz方法,让我们可以配置需要替换的域,一个个尝试,节省劳动力。

5. 选中kplayer,右键Fuzz,选中Payloads,点击Add,增加我们的用户名字典:admin,root,guest,Test;同样的方法,对password增加字典:admin,123456,111111,666666,root,password; 然后点击右下角Start Fuzzer,ZAP就会替我们自动组合发送请求。

6. 查看底部Fuzzer的任务,发现ZAP已经完成了所有的组合请求。那么问题来了,怎么知道哪一个是正确的用户名/密码响应?通常来说,登录成功和登录失败的响应报文大小会有差异,我们按响应报文大小排序,那个不一样的一般就是正确的用户名/密码,也就是我们的默认密码admin/password。

至此,我们完成了一个low等级的暴力破解,接下去我们看看medium等级的暴力破解。

7. 进入DVWA主界面,在左侧栏选择DVWA Security安全等级为medium,使用上述同样的方法,我们发现同样能够破解,只是需要花费的时间变长了,查看右下角View Source,我们发现代码中多了失败登录sleep两秒的控制:

else {
    // Login failed
    sleep( 2 );
    echo "<pre><br />Username and/or password incorrect.</pre>";
}

8. 接下去我们看看high等级的破解,采用同样的方法,这次失败了,我们查看请求报文,发现在原来的参数username和password后面,多了一个token:

查看页面源码,发现多了一个隐藏的token框:

<form action="#" method="GET">
    Username:<br />
    <input type="text" name="username"><br />
    Password:<br />
    <input type="password" AUTOCOMPLETE="off" name="password"><br />
    <br />
    <input type="submit" value="Login" name="Login">
    <input type=‘hidden‘ name=‘user_token‘ value=‘ac9dabf93f796a0b905e64e5326e579c‘ />
</form>

查看后台源码,发现登录中多了token的生成和校验。

<?php
if( isset( $_GET[ ‘Login‘ ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );
......
// Generate Anti-CSRF token
generateSessionToken();
?>

Token,也叫令牌,是随机生成的一组序列,一般用在两个地方: 1) 防止表单重复提交, 2) Anti-CSRF攻击。原理上都是通过session token来实现的:当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。

在Anti-CSRF攻击中:服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。

在“防止表单重复提交",服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变。

那么是不是就无懈可击了呢?只要能拿到每次的token,就能像之前一样拼接请求,完成自动发送,所以一种方法就是用Python写个脚本,每次都取返回报文里的token value值再拼接。另外一个思路是,既然只有在第一次请求后,服务器会生成一个token返给客户端,之后才需要校验,那么如果我们每次的请求都伪装成第一次,就不用进行token检测了。

9. 最后我们来看看impossible等级,这里我们发现输错密码3次后,提示我们15分钟后才能输入,有效的增加了暴力破解的时间成本。

查看后台源码,看看是如何进行控制的:

<?php
if( isset( $_POST[ ‘Login‘ ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ ‘user_token‘ ], $_SESSION[ ‘session_token‘ ], ‘index.php‘ );
    // Sanitise username input
    $user = $_POST[ ‘username‘ ];
    $user = stripslashes( $user );
    $user = mysql_real_escape_string( $user );
    // Sanitise password input
    $pass = $_POST[ ‘password‘ ];
    $pass = stripslashes( $pass );
    $pass = mysql_real_escape_string( $pass );
    $pass = md5( $pass );
    // Default values
    $total_failed_login = 3;
    $lockout_time       = 15;
    $account_locked     = false;
    // Check the database (Check user information)
    $data = $db->prepare( ‘SELECT failed_login, last_login FROM users WHERE user = (:user) LIMIT 1;‘ );
    $data->bindParam( ‘:user‘, $user, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();
    // Check to see if the user has been locked out.
    if( ( $data->rowCount() == 1 ) && ( $row[ ‘failed_login‘ ] >= $total_failed_login ) )  {
        // User locked out.  Note, using this method would allow for user enumeration!
        //echo "<pre><br />This account has been locked due to too many incorrect logins.</pre>";
        // Calculate when the user would be allowed to login again
        $last_login = $row[ ‘last_login‘ ];
        $last_login = strtotime( $last_login );
        $timeout    = strtotime( "{$last_login} +{$lockout_time} minutes" );
        $timenow    = strtotime( "now" );
        // Check to see if enough time has passed, if it hasn‘t locked the account
        if( $timenow > $timeout )
            $account_locked = true;
    }
    // Check the database (if username matches the password)
    $data = $db->prepare( ‘SELECT * FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;‘ );
    $data->bindParam( ‘:user‘, $user, PDO::PARAM_STR);
    $data->bindParam( ‘:password‘, $pass, PDO::PARAM_STR );
    $data->execute();
    $row = $data->fetch();
    // If its a valid login...
    if( ( $data->rowCount() == 1 ) && ( $account_locked == false ) ) {
        // Get users details
        $avatar       = $row[ ‘avatar‘ ];
        $failed_login = $row[ ‘failed_login‘ ];
        $last_login   = $row[ ‘last_login‘ ];
        // Login successful
        echo "<p>Welcome to the password protected area <em>{$user}</em></p>";
        echo "<img src=\"{$avatar}\" />";
        // Had the account been locked out since last login?
        if( $failed_login >= $total_failed_login ) {
            echo "<p><em>Warning</em>: Someone might of been brute forcing your account.</p>";
            echo "<p>Number of login attempts: <em>{$failed_login}</em>.<br />Last login attempt was at: <em>${last_login}</em>.</p>";
        }
        // Reset bad login count
        $data = $db->prepare( ‘UPDATE users SET failed_login = "0" WHERE user = (:user) LIMIT 1;‘ );
        $data->bindParam( ‘:user‘, $user, PDO::PARAM_STR );
        $data->execute();
    }
    else {
        // Login failed
        sleep( rand( 2, 4 ) );
        // Give the user some feedback
        echo "<pre><br />Username and/or password incorrect.<br /><br/>Alternative, the account has been locked because of too many failed logins.<br />If this is the case, <em>please try again in {$lockout_time} minutes</em>.</pre>";
        // Update bad login count
        $data = $db->prepare( ‘UPDATE users SET failed_login = (failed_login + 1) WHERE user = (:user) LIMIT 1;‘ );
        $data->bindParam( ‘:user‘, $user, PDO::PARAM_STR );
        $data->execute();
    }
    // Set the last login time
    $data = $db->prepare( ‘UPDATE users SET last_login = now() WHERE user = (:user) LIMIT 1;‘ );
    $data->bindParam( ‘:user‘, $user, PDO::PARAM_STR );
    $data->execute();
}
// Generate Anti-CSRF token
generateSessionToken();
?>

实战心得:

暴力破解的核心是“穷举法”,因此,采用token校验,限制登录错误次数,验证码校验都是有效的防止暴力破解的手段。

原文地址:https://www.cnblogs.com/kplayer/p/8467572.html

时间: 2024-11-07 10:15:54

【笔记】网易微专业-Web安全工程师-04.WEB安全实战-2.暴力破解的相关文章

网易微专业大数据工程师

本微专业由国际知名教育集团Wiley开发,面向全球化需求,并由Boolan博览网结合国内应用进行扩充.助你系统掌握大数据必备技能和核心技术,包括工具选择,存储.编程.处理和管理数据架构等.全网独家大数据双语课程.英文内容,中文字幕,原版内容,保证质量.Wiley权威教育资源,顶尖国外公司高管.国内一线工程师协同开发,Boolan博览网学习服务支持.强强联手,打造最有特色的大数据课程. 课程安排1.大数据基础必修 做为一名大数据工程师,不仅仅要了解核心技术,还需要了解技术架构是如何和商业环境.业务

【笔记】网易微专业-Web安全工程师-04.WEB安全实战-3.命令注入

命令注入(Command Injection):是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的. 前面的基础课程中,我们提到命令注入需要三个条件: 1. 是否调用系统命令? 2. 函数/参数是否可控? 3. 是否拼接输入? 具体怎么应用,我们在接下去的实战中学习和体会. DVWA实战: 1. 打开phpStudy或xampp,运行Apach和MySQL: 2. 浏览器进入DVWA主界面,在左侧栏选择DVWA Security安全等级为Low,然后进入Command Inj

【笔记】网易微专业-Web安全工程师-04.WEB安全实战-8.SQL盲注

上一节我们在实战中介绍了SQL注入的原理和危害,这一节我们要实战SQL盲注,与普通的SQL注入相比,数据库返回的结果不会显示在页面上,只会返回成功/失败或者真/假,这无形中加大了我们注入的难度. SQL盲注的一种思路:采用where语句"真and真=真","真and假=假",把我们需要确定的条件放在and之后,当我们的猜测为真那么返回为真,猜测错误则返回为假.具体怎么应用呢?我们在实战中学习. DVWA实战: 1. 打开phpStudy或xampp,运行Apach和

网易 微专业

目前买了以下的网易微专业课程,需要的可留言. iOS开发工程师 测试工程师 新媒体视频导演 前端开发 web安全 交互设计师 产品经理 独立音乐制作人 产品运营 安卓 UI设计师 java开发工程师 python web IT项目管理 C++开发工程师

【笔记】网易微专业-Web安全工程师-02.WEB安全基础

课程概述: 万丈高楼平地起,楼能盖多高,主要看地基打的好不好.学习任何知识都是一样的,打好基础是关键,通过本课的学习,你将了解一些常见的Web漏洞,以及这些漏洞的原理和危害,打好地基,为后面建设高楼大厦做好准备. 课程大纲: 第一章.无处不在的安全问题 第一节.常见的安全事件 第二章.常见Web漏洞解析 第一节.XSS 第二节.CSRF 第三节.点击劫持 第四节.URL跳转 第五节.SQL注入 第六节.命令注入 第七节.文件操作漏洞 笔记心得: 1. 无处不在的安全问题 "钓鱼":利用

【笔记】网易微专业-Web安全工程师-05.WEB安全体系建设

课程概述 未知攻,焉知防?通过前面的课程我们掌握了各种攻击技巧,本课将教会大家如何在企业进行安全建设,达到知攻知防的境界,这也是各个公司最终需要的安全人才. 课程大纲 第一节.SDL介绍 第二节.漏洞和事件处理 第三节.安全运营概述 1. SDL介绍 安全开发生命周期(Security Development Lifecycle) 培训:核心安全培训 需求:安全需求分析/质量要求,Bug数量/安全和隐私风险评估 设计:设计需求分析/减小攻击面 实施:使用指定工具/启用不安全函数/静态解析 验证:

微专业Python爬虫工程师

百度云盘 什么是爬虫? 爬虫可以做什么? 爬虫的本质 爬虫的基本流程 什么是request&response 爬取到数据该怎么办 什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. 其实通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据 爬虫可以做什么? 你可以爬取小姐姐的图片,爬取自己有兴趣的岛国视频,或者

web实战之暴力破解

2019微专业初级前端开发工程师教程

目录:┣━━1前端入门┃ ┣━━第1章 前端技术发展概述┃ ┃ ┗━━1前端技术发展概述.mp4┃ ┣━━第2章 微专业课程体系概述┃ ┃ ┗━━2微专业课程体系概述.mp4┃ ┣━━第3章 前端入门案例┃ ┃ ┗━━3前端入门案例.mp4┃ ┣━━第4章 前端开发工具┃ ┃ ┣━━4.1前端开发工具概述.mp4┃ ┃ ┣━━4.2WebStorm.mp4┃ ┃ ┣━━4.2WebStorm参考资料.doc┃ ┃ ┣━━4.3Sublime Text 参考资料.doc┃ ┃ ┣━━4.3Subl