摘要
通過分析 windoze 下 Web 認證過程
提出在 Linux 中用*腳本*實現通過 Web 認證方式上網的方法
問題由來
近來
隨著寬帶入戶
越來越多的 ISP 采用 Web 認證這種接入認證技術
Web 認證從用戶的角度看
是指用戶在浏覽器中通過 Web 頁面輸入用戶名和密碼的認證過程
多數 ISP 號稱無需客戶端軟件
實際情況卻是
Windoze 下用戶可以順利通過 Web 認證上網
但 Linux 用戶卻沒有這麼幸運
分析原因
什麼原因呢?解決問題還需從分析認證頁面入手
下面的分析主要針對我這裡的情況
在 Mozilla 中打開認證頁面後
沒有顯示任何內容
仔細分析認證頁面
發現認證頁面采用 JavaScripts 編寫
並且是針對 IE 編制的
IE 並未完全按照標准使用 JavaScripts
IE 對 JavaScripts 做了一些擴充
主要有以下幾項
*
cab files for download of binaries
* document
all
* element
innerHTML
詳情請參閱
IE 對 JavaScripts 的這些擴充
Mozilla 是不支持的
實際上 Mozilla 對標准 JavaScripts 的支持比 IE 好
所以
這些有 IE 特點的認證頁面 Mozilla 等浏覽器自然無法通過了
從用戶浏覽器的角度看
Web 認證除了通過 Web 頁面輸入用戶名和密碼外
還需要通過 http 協議傳送客戶由 DHCP 獲得的 IP
有些 ISP 在用戶登錄到認證頁面時
由浏覽器自動下載
cab 文件
然後執行該文件獲得用戶的 IP
再傳給 Web Server
還有些 ISP 在用戶通過認證後
會在客戶端彈出一個計時窗
定時向 ISP 發送 keep
alive 包
當然
Web 認證是一個比較新的方式
還沒有形成標准
所以各提供商的方法也不盡相同
所謂各村有各村的高招
你那裡的方法就很有可能與我的不同
但道理應該是一樣的
根據以上的分析
可以看出 Linux 用戶自然不可能用非 IE 兼容的浏覽器直接通過登錄 Web 認證界面上網啦
解決方法
好了
問題就在這些 Web 頁面使用 IE 方言的 JavaScripts 上
有幾種解決方法
使用 Linux 下 IE 兼容的浏覽器
有嗎?誰知道請告訴我
使用 wine + IE 的方法
有成功的嗎?大家共同分享
如果將這些鳥語改為普通話
我們就可以用 Mozilla 等非 IE 浏覽器通過 Web 認證方式上網了
要求 ISP 提供支持 W
C 標准的認證頁面
分析 web 認證的原理
編寫認證程序
最理想的方法四
可是我等不急
也不一定能等到
也許你比我幸運
我采取第三種方法
對於方法三
你一定會問
認證頁面在 Web Server 上
我無權修改
行不通
確實如此
這裡有個變通的辦法
下載認證頁面
按照 JavaScripts 標准修改並保存在本地
每次上網前用本地經過修改的 Web 認證頁面而非 Web Server 的認證頁面就可以了
具體修改方法
參照 中的對照表
找出認證頁面使用 IE 方言的 JavaScritps
根據對照表提供的修改建議對你的認證頁面作出相應修改
對於使用
cab 的認證頁面
情況就比較復雜
需要分析這個
cab 在你的 JavaScripts 中的用法
判斷它的功能
我這裡是用它獲得本地 IP
所以
我在本地執行腳本獲得 IP 來模擬這個功能
似乎
cab 多與 IP 有關
一個例子
* 以我這裡為例
我的使用環境
ISP
鐵通 ADSL
認證方式
Web 認證
ISP 的接入服務器
華為 Quidway MA
E/F (具體型號不能完全確定)
Linux
GENTOO
rc
Browser
Mozilla
a/Phoenix
* 在 Linux 下用 mozilla (一定要用非 IE 浏覽器獲得認證頁面
這話有點多余
但有的用戶是在 Window$ 下調試的)
訪問 ISP 的 WEB 認證頁面時
浏覽器中沒有顯示任何內容
根本無法輸入帳號和密碼
更談不上通過認證
這難不倒咱 linuxer
查看認證頁面(/index
jsp)源碼
發現這兩段 javascript
id=
PortalClient
codebase=#version=
var clientIp = PortalClient
localIP;
var languagetype =
;
if ((clientIp==
)||(clientIp==null)) {
window
parent
location
;
} else {
window
parent
location
+clientIp+
&newbl=
+languagetype;
}
可以看出它用 PortalClient 獲得本地的 IP
如果成功
轉到 ?ip=你當前的IP
而 Mozilla 不支持它獲取 IP (PortalClient
是針對IE的
唉
這個程序編得太短視)
看來問題出在這裡
既然如此
我們可以手工加上自己的 IP(這個 IP 是與 ADSL 相聯的網卡從 ISP 的 DHCP 服務器獲得的地址)
在 Mozilla 地址欄中輸入
?ip=
^^^^^^^^^^^
^^^^^^^^^^^
你的ISP認證服務器
你當前的IP
嗒嗒
登錄頁面出來啦!
趕快輸入帳號
密碼
按登錄按鈕(期待中
)
viva!!!
ISP 的首頁終於被揪出來啦
在終端中 ping
ping 通
沒問題
* 至此
在 Linux 下 web 認證方式已經完成
方法很簡單
每次上網時
在 mozilla 的地址欄中輸入
?ip=你當前的IP
登錄頁面出來後
和 IE 中的操作過程完全一樣
* 當然你可以把這些步驟寫成一個腳本
以後簡單執行腳本就可以了
#!/bin/bash
dhcpcd eth
phoenix ?ip=`ifconfig eth
|grep inet|sed
s/^ *//
|sed
s/ /:/g
|cut
f
d:` &
說明
eth
是與 ADSL 聯的網卡名
根據你的實際情況填寫
是我這 ISP 的認證地址
後面一段是獲得 eth
的 ip 地址
注意!一定要用非 IE 浏覽器獲得調試認證頁面
因為 IE 可以執行認證頁面的 JavaScripts
有些認證過程實際上是執行多個頁面完成的
IE 最後停留的頁面不一定是起始的認證頁面
你有可能漏掉前面的重要信息
我這裡就是這種情況
另外一種方法
如果你對方法
不滿意
可以用方法
繼續分析 web 認證的原理
編寫自己的認證程序
其實搞清原理後
實現的方法更簡單
更靈活
而且在 ISP 要求客戶端定時發送 keep
alive 包的情況下
也只能采取這種方法
我是這樣做的
用網絡分析軟件(如
ethereal)
抓取正常認證過程的通訊包
在 windoze 下
用 ethereal 抓包
注意抓包時
除了 IE 不要啟動其它產生網絡通訊的程序
以免產生干擾數據
保存這些通訊包
分析所抓包的內容
只要看一眼 web 認證過程產生的通訊包
你就明白我為什麼說這種方法更簡單了
簡單講
web 認證方式實際是客戶端用 http 協議向 ISP 發送用戶名
密碼和 IP 等內容的過程
客戶端讀取認證頁面
將填寫好認證頁面表格發送到 ISP 的認證服務器
過程就這麼簡單
編寫生成這些包的程序
用任意一個支持 http 協議的語言或工具
編寫向認證服務器 POST 認證頁面中 form 的程序即可
甚至讀取認證頁面都不需要
我用 curl 和 python 各做了一個
如果你略微了解 http 協議
只要找到認證頁面中向服務器 POST 用戶名
密碼等數據的 form
然後轉換為你采用語言的語法格式就可以了
根本不需要分析認證頁面中繁雜的 Javascripts
對計時窗發出的 keep
alive 包也采用同樣的方法
例子
* 認證頁面中的 form
* 用 curl 寫的一個腳本
#!/bin/bash
/etc/init
d/myiptables start
dhcpcd eth
MYIP=`ifconfig eth
|grep inet|sed
s/^ *//
|sed
s/ /:/g
|cut
f
d:`
echo $MYIP
UN=
SERVER=
curl
trace trace
txt
A
Mozilla
d
username=$UN&password=
&localip=$MYIP&connectname=&connecttype=
說明
curl 是一個用 url 語法傳輸文件的命令行程序
支持 http
ftp 等協議
類似 wget
上例中
curl 的命令行參數
A 指明客戶端的類型
這是服務器為了安全
需要指明
Mozilla 或 IE 都可以
我更願意用 Mozilla
d 是必需的
表示用 POST 方法
d 後的內容就是用戶名
密碼 IP 地址等信息
根據你的認證頁面中 form 的 input 項目填寫
內容與其保持一致
參數間用 & 分開
後面是認證頁面的地址
執行這個腳本後
返回
OK
表示認證成功
否則
仔細檢查
d 後的參數
From:http://tw.wingwit.com/Article/program/Oracle/201311/17065.html