1. 程式人生 > >asp+access sql手工注入步驟

asp+access sql手工注入步驟

理論介紹

資料庫結構

access資料庫

 表

     列

         單元資料


例項

網站域名:http://127.0.0.1:81/0/0/

檔案目錄:Production

網站檔案:PRODUCT_DETAIL.asp

檔案引數名:id

檔案引數值:1513

sql查詢實現原理

#include的功能和c語言差不多,asp是一種指令碼語言,.asp檔案類似於.cpp檔案。不過在asp當中,沒有.h和.cpp之分,都是asp。

疑問0:不知道這樣的理解對不對,求解?

conn.execute(sql)是對前面包含的conn.asp檔案裡面的功能的呼叫,功能是連線資料庫。

這裡看到sql語句的意思是在product表中查詢id=接收的值(這裡是1513)那一行的資料

已解決 疑問1:一個asp裡會不會有多個查詢語句?

答:會,比如http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513&f=125


這裡看到conn.asp連線的是#data.mdb

access只有一個數據庫,但可能有多個數據庫檔案

所以,PRODUCT_DETAIL.asp的意思就是說:在連線的資料庫(這裡是#data.mdb,裡面有很多表)中,去查詢product這個表裡id為傳入值(這裡是1513)那一行的資料。

已解決 疑問3:正常情況是select 列名 from 表名 where  id=xxx得到單元資料,而這裡是select * from product where id=,* 的意思是不是指選擇的是所有的列?然後在頁面上顯示的是那一行所有的資料?答:是。


實戰開始

sql注入原理未對語句進行過濾

尋找網站方法   搜尋欄輸入inurl:asp?id=

 http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513

檢驗是否有注入漏洞

先在id=1513後面加上and 1=1,理想情況是返回正常的頁面。然後在id=1513後面加上and 1=2(2 、 3 、4……什麼亂七八糟的都可以,只要不等於1 就行),變成http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513 and 1=2。這裡1=2明顯邏輯錯誤,前面用的又是且連線詞,所以這個世界上永遠找不到id=1513 and 1=2,頁面找不到這個東西,所以會報錯。一旦報錯,說明他就執行了這條命令,說明沒有過濾語句,說明有注入漏洞。這裡把id=1513改成id=1513‘(什麼亂七八糟的都行,只要id裡沒這個引數就行)也能達到目的,因為id的引數裡沒有1513’這一項。

如果這裡是id=abc的話,這裡的引數就是字元型了,而不是1513那樣的數字型。對於字元型引數,查詢的時候系統會自動在引數前後加上 ‘   ’,如果我們還是在後面寫and 1=2的話,就變成了http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id='abc and 1=2',這樣和原sql語句不符合,應該寫成http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=abc' and '1'='2。

猜欄位(欄位=列):

在id=1513後面加上order by 數字,如http://127.0.0.1:81/0/0/Production/PRODUCT_DETAIL.asp?id=1513 order by 10

原理:order by xxx是指 對sql語句中帶入查詢的表(這裡是product)中的xxx個列進行排序,如果xxx小於表中的列數,那肯定是可以排序成功的,如果xxx超過了表中的列數,那哪來那麼多列給你排呢?根本就不存在啊。所以xxx<=表中列數的時候頁面正常(因為它能正常執行排序操作);如果xxx>列數,那麼就會報錯。由此,我們可以得到sql語句中代入查詢的那個表的列數。

疑問4:字典序?這裡是排10列的序,那麼這10列是哪10列?前10列嗎?如果疑問1成立,那麼這裡order是對哪一個表排序?怎麼指定?

已解決:order by 是怎麼排序的?答:預設升序,後面可以加升序降序限制條件,order by 10 desc為降序,order by 10 asc為降序

猜表名

先檢測有沒有admin這個表,用union select * from admin,這裡頁面返回正常,說明有admin這個表。欄位猜出來是22,於是構造猜表名的語句 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 from admin,爆出顯位(即能夠顯示資料的位置,這裡是3和15)。

疑問5:這裡的22列是product表裡的列數,這和admin有什麼關係呢?兩個完全沒聯絡的表啊?為什麼這樣就能查到顯位?顯位和隱位是什麼東西?為什麼存在顯位隱位之分?union查詢到底是怎麼實現的?

猜列名

得到顯位後,我們構造以下猜列名語句union select1,2,username,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin,這裡都說了是猜,username和password是我們猜的列名,因為一般的管理員賬戶表裡都使用者名稱和密碼所在的列名都是這兩個。如果管理員改了的話就gg了,嘗試在網站其他地方看看有沒有什麼字首或者統一格式,比如我遇到過adminname和adminpassword,或者直接丟到工具裡去跑。

然後得到單元資料。

希望如果有大神能看到求回答一下這些問題,感激不盡!