那些年幹過的事(二)—成績查詢網站爆庫及防護

背景:

某考試系統公佈了考試成績,很多朋友參加了這個考試,當時手上沒有他們的考試號等信息,又比較好奇大家的成績,一時興起就想看看有沒有方法在不知道考試號的情況下查詢成績。

目的:

獲得大家的考試成績。

條件:

網站採用php開發,數據庫類型未知,表結構未知

工具及手段:

google、UE、Sqlyog、SQL注入、Eclipse

前期準備:

在網站提供的查詢界面中,通過在各個輸入框輸入特殊字符單引號發現,輸入框都做了js校驗,不能使用特殊字符,想繞過js校驗太簡單了,url傳參數或者自己構造一個html頁面,我選擇是使用html頁面,將成績查詢頁面另存爲html,用ue編輯html,將無關的階段全部刪除,最重要的刪除js校驗部分,這樣就構造了一個沒有校驗的html頁面,然後用瀏覽器訪問頁面,輸出單引號等特殊字符,試試看效果,不錯果然是我們想要的結果,出現了sql的錯誤語句。

方法步驟:

通過觀察返回的結果,我們可以知道網站採用的是mysql數據庫,成績存在與一個叫做fenshu的表中,我們可以針對頁面上qname字段構造sql,對應到後臺爲username字段,後臺執行的sql語句形如:select * from fenshu where time='2010年' and class=44 and username='12' and code='11' order by id,按照查詢的話應該提供待查詢人的姓名、考試號才能顯示成績,但我們可以對username進行注入同時可以將後面的語句註釋掉(用--註釋,/*不起作用),讓其執行的sql爲:

select * from fenshu where time='2010年' and class=44 and username='12'-- - and code='11' order by id(在頁面qname輸入框中只需要輸入12'-- -就可以),這樣界面中就可以顯示我們要查詢人12的成績了,但只提供姓名的話如果有重名的成績就不準確了,我們可以將所有重名人的成績都拿出來,就是在sql中加入limit語句,qname輸入框中內容變爲12' limit 0,1-- -

12' limit 1,1-- -

12' limit 2,1-- -

等等,以此類推,直到頁面提示錯誤表示這個名字沒有那麼人重名。如果我們只是想獲取幾個人的成績的話,直接通過構造sql注入獲取就可以得到成績了,這個方法就足夠了。

技能提升:

在拿到幾個人的成績後,我有了新的想法,想知道每個人的名次,在想是不是可以通過這個方法將系統中所有的成績信息都爆出來,然後將全部信息在本地建立一個數據庫,這樣就可以方便的做排名統計了。

如果要爆全部數據,靠人工肯定是不行的了,需要藉助程序去運行,還好本人有java開發基礎,立馬打開eclipse準備寫代碼,代碼的主要步驟爲:

1、構造sql

要爆全部數據就不能指定用戶名了,需要將qname的值設爲'or 1=1 limit i,1 -- -,其中i爲變量,需要從0開始循環,至於循環到多少爲止,這個就要靠猜測和嘗試了,不過程序運行的很快,時間不是問題,我們可以每次爆1000個,直到爆完爲止;

2、發送http請求及解析返回值

將構造的url請求通過程序發送到指定網站,並對返回值進行解析,返回的結果爲html頁面,我們需要在程序中對html頁面進行逐行解讀,識別我們的關鍵信息,通過字符分隔獲得人名、考試號、成績的等內容;

3、信息本地入庫

在本地建立mysql數據庫,按照需要建立表,將程序解析後的內容插入到本地數據庫中。待全部數據都導入本地之後,就可以進行各種排名查詢了。

技能再提升:

有些系統不會直接返回sql錯誤信息,我們就需要通過別的方式或者表結構了,在此給大家簡單說說,構造如下sql:

='' union select table_name,table_schema,3,4,5 from information_schema.tables where table_schema=database() limit 6,1 --

通過變更limit後的數字,可以將目標網站數據庫中的所有表名爆出來。

='' union select column_name,3,4,5,6 from information_schema.columns where table_name='fenshu' limit 1,1 --

通過變更limit後面的數字,可以將目標表的所有字段名爆出來。

解決辦法:

加強url參數特殊字符過濾,增加數據庫執行語句的預編譯和過濾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章