武漢大學教務系統入侵&竊取數據全過程記錄

 
[武漢大學教務系統入侵&竊取數據全過程記錄]
[PHP驗證碼識別(OCR)技術科普貼]
[論教務系統修改默認密碼的重要性]
[這麼做死真的不會死嗎?] 

2014.8.15
玩着我本身寫的微信訂閱號("月翼科技"),忽然想到傳說中的(由於我只據說過,沒用過額)神器"武大助手"貌似能夠查成績,百度了下,它是抓取的教務系統裏面的數據,但是教務系統不是有驗證碼的嗎,即便有了帳號密碼,過不了驗證碼仍是沒辦法抓取數據的啊。那麼,它是怎麼解決這個問題的呢?
圖片
看了下教務系統的登陸頁面,額,每次刷新驗證碼服務器從新分配Session,客戶端這邊只存了一個SessionID的Cookies(如上圖)。
也就是說,瀏覽這個頁面的時候,客戶端除了驗證碼這張圖,根本沒有得到任何關於驗證碼的內容的信息。
這是目前我知道的最標準最科學的作法了,貌似無懈可擊啊。
難道是由於驗證碼太簡單,武大助手他萌能夠用第三方的類庫破解掉?
果斷百度,結果發現有能夠識別數字的類庫Valite,可是對驗證碼自己要求很高(清晰而且黑白分明),有能夠識別字母和數字的第三方類庫Tesseract,貌似還開源……可是下載下來發現,安裝以後還須要複雜的教學過程……
總之,搜索PHP+驗證碼識別,基本找不到好的教程或者源碼什麼的,簡直無奈。
圖片
媽蛋,做爲一名ITer,太依賴第三方類庫果斷不是好習慣,沒有類庫就本身寫!
參照那個識別數字驗證碼的思路,首先……
把圖片每個像素分開成一個矩陣(或者叫,2維數組?)。
分析每個點的RGB值,觀察驗證碼的放大圖,很明顯,字的部分,R(Red紅色)的值比較高。
因而把字的那部分像素點給予不一樣的值以示區分。
最後的效果相似下圖:
圖片
好吧,如今程序是能"分析"這張圖了,可是程序要怎麼"理解"它呢?
按照百度到的姿式,咱們須要對這張"圖"進行一些處理,首先,把能排除掉的沒用的"噪點"去掉:
圖片
Then:
圖片
因而如今,這張"圖"看起來就好辨認多了。
固然不是每次的圖都這麼清晰的,好比有這樣的:
圖片
因而,我想到,能夠把除去"噪點"的過程再來一遍,這樣:
圖片
接下來,"除去"點的過程完成,開始"補充"一些點,讓字母看起來更"連貫"一些:
圖片
驗證碼裏面有4個字母,很明顯我須要把它萌分開,因而豎着切幾刀:
圖片
額,不過有時候會切錯位置,額,好比這樣:
圖片
通過一番努力(死了N個腦細胞),總算不會切錯了,而後橫着再切:
圖片
2014.8.16
到這裏的時候,我忽然識別驗證碼貌似也沒辣麼難嘛。
如上圖,其實相同的字母切出來以後,它的長度和寬度,以及裏面的黑白位置基本是同樣的。
因而,果斷把字母的長寬和排列位置存下來(如上圖,N個txt文件)。
圖片
如上圖,根據長度和寬度,基本就能夠肯定多是哪幾個字母了。
可是當我收集了愈來愈多的字母長寬的時候,狀況變成了這樣:
圖片
固然,運氣好的時候,能夠是下面這樣的:
圖片
不過光靠運氣的話,識別成功率也過低了,果真仍是要比對字母的矩陣(二維數組)的類似度來判斷。
(在這裏寫了N層的循環,發現智商徹底不夠用了。)
圖片
隨着存字母形狀的txt文件愈來愈多,果斷仍是模糊匹配用到的更多:
圖片
接着,不斷進行識別測試,終於讓我發現了一個喪心病狂的例子(3個字母粘連在了一塊兒):
圖片
(臥槽,不帶這樣的!)
(因而從新回去改切字母的代碼,媽蛋,終於,就算4個字母都連在了一塊兒都能給準確的切開了。)
突發奇想,其實在最開始的時候能夠給驗證碼加一個"黑色"的邊框,這樣邊緣位置的"白色"點也能夠在"降噪"過程當中被當作"噪點"去掉了。
圖片
雖然各類奇葩的驗證碼都有,不過也有下面這樣的,就靠這種徹底規範的驗證碼給我信心了:
圖片
隨着收集的字母"樣式"的txt文件愈來愈多,發現了最好識別的兩個字母:O和C,簡直徹底對稱,並且試驗了不少次,O和C就米有別的樣子的,只有這樣的:
圖片
一共測試了200+的驗證碼,不斷測試,找出錯誤,保存TXT,修正代碼……
圖片
代碼Part1(根據REB顏色分析圖片):
圖片
代碼Part2(根據TXT文件保存的字母信息進行模糊匹配):
圖片
以前都是把驗證碼圖片下載到本地而後識別的,如今果斷改爲即時獲取,即時識別。
識別成功截圖:
圖片
識別失敗截圖:
圖片
統計時間(識別的速度仍是挺好的,相對於獲取一張驗證碼的時間,識別的時間簡直能夠忽略不計):
圖片
開始在教務系統上驗證效果(很明顯問題不大):
圖片
2014.8.17
接下來,開始作和"武大助手"相似的事情,抓取我本身的帳號的數據:
圖片
表示作這個系統的人的代碼命名習慣很是好(最喜歡這種人了),很明顯方便了他萌開發的過程(固然也方便了我啊)。
成績和課表的位置很容易就找到了。
=。=
圖片
因而,愉快地開始試驗抓取數據了:
圖片
And:
圖片
And:
圖片
表示抓取數據的時間貌似就略長一些了:
圖片
Now,寫一個猜密碼的php,配合我以前的用.NET寫的一個攻擊老師做業網站的程序,開始暴力猜密碼,Yeah。
(話說PHP實際是單線程的,這是它相對ASP.NET和JSP的一個缺陷吧,並且PHP理論上說,最好是限制執行時間的,so,不適合直接寫DDOS攻擊程序。)
(果斷多會幾門語言,玩技術會更Happy=。=) 
圖片
猜密碼,Yeah。(好喜歡~\(≧▽≦)/~)
表示其實教務系統的密碼沒有很難猜的,我是從19930101一直猜到19971231的,最多也就試366*5=1830而已。
對於機器來講,循環嘗試1830次……so easy嘛。
圖片
本身寫的能夠用命令行的攻擊程序:
(參數意思是從2013302580001一直試到2013302580315,開5個線程試。)
圖片
Like this:
圖片
後來發現太慢了,額,因而:
圖片
由於驗證碼其實不是很大(1-2KB的樣紙),因此,貌似不是很佔網速: 圖片
因而,額,下圖是個程序bug,額,已經猜出來密碼的帳號,程序還在不停試密碼,額,果斷修正代碼。
圖片
實驗結果:30個線程,1小時,猜出了大約30個帳號的密碼。
圖片
2014.8.18
昨晚用了大約6-7個小時的時間,額,猜出了一堆密碼,下圖:
(Fail的表明試了1830個密碼還試不粗來的,額,有多是驗證碼識別錯了,不過更大的多是:這些孩紙早就機智地改了密碼了!!!23333)
圖片
把txt整合到php文件裏面去,方便上傳到個人SAE服務器(貌似也能提升一些效率吧)。
圖片
改一下代碼,果斷仍是下面這樣的更有效率:
圖片
把php文件壓縮一下,果斷上傳到個人SAE的服務器,嗯。
圖片
And:
圖片
用SAE去教務系統抓驗證碼會不會快一點?我也不造。
不過醬紫,至少符合所謂"負載均衡"吧(還能夠叫小夥們萌協助我)……
(個人新浪的豆豆還沒花超過50個呢,看看醬紫能燒掉多點豆=。=)
圖片
開始佈置數據庫,準備抓取大量的數據了:
圖片
晚上7點,額,關掉猜密碼程序,數了下,一共Get了全院119個學號的密碼,果斷開始存數據……
最終一共得到分數記錄項2655條,下學期的選課記錄項1452條。
圖片
話說此次是時間很少,要否則能夠掃徹底院的數據的,有空也能夠掃一下全校的。~\(≧▽≦)/~
用已有的數據算了下平均分,額,發現最高的課程是軍事理論(92.8),最低的大約是數字邏輯(60.1),額,還好我當初嫌它太偏硬件,沒選,我仍是挺機智的。
話說比較奇怪的是,C++程序設計(實驗)平均分是78.6,可是C++程序設計的平均分竟然只有60.1(比數字邏輯高0.06,額)。
萬惡的大學物理B(上),平均分是66.9,額。
 大學英語2的平均分只有75.2,意思是有一大半的人下學期都不能考4級咩?
好了,下面切回正題,武大助手(後來想到還有課程格子)是怎麼導入教務系統的信息的呢?
圖片

圖片
其實,他們是這麼作的:
圖片

圖片 臥槽啊!我早該想到的!驗證碼固然是發給用戶本身去識別啊!!! 好吧,這已經不重要了。 =。= [PS:這篇文章有木有點冷笑話的感受?] 
相關文章
相關標籤/搜索