熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

關於SQL注入的幾類錯誤和產生

2013-11-23 21:06:18  來源: MySQL 

  對於注入而言錯誤提示是極其重要所謂錯誤提示是指和正確頁面不同的結果反饋高手是很重視這個一點的這對於注入點的精准判斷至關重要本問討論下關於幾類錯誤和他產生的原理希望對讀者有所幫助

錯誤提示主要有邏輯錯誤和語法錯誤以及腳本運行錯誤三類

邏輯錯誤

簡單的例子是= =這兩個==頁面不同的原理是什麼?以$sql = “select * from news where id=$_GET[id]”為例

select * from news where id= and =產生的結果集為NULL然後程序取值得時候就會去出空值無法顯示當然有的程序發現SQL執行結果集為空就立即跳轉效果就不顯鳥值得注意的是有的如Oracle Postgresql的數據庫在結果集為空情況下會再頁面上表現字符型null字樣這算是個特點如果使用or條件比如
lian素材   wwwliancom
select * from news where id= or =

和and =得結果正好相反他的結果集十分龐大如果SQL語句如此再加上程序是循環讀取結果集(一些編程上的陋習)那麼會取出所有結果結果可能運行很慢在數據量巨大的oracle上容易出現這個例子會出現什麼呢一般程序取出結果集中的第一條結果那麼很可能已經不是id=的那條新聞了這就是由些小菜奇怪有時候or =頁面會發生變化的原因

歸根到底都是結果集不同造成的靈活掌握是關鍵這並非單純的經驗問題

語法錯誤

語法錯誤時比較熟悉的比如對於SQL ServerPgSQLSybase的注入錯誤提示都很重要因為利用它的特性來獲取信息很快速語法錯誤造成的結果可能是SQL錯誤而中斷腳本執行但是腳本或服務器設置屏蔽錯誤的情況下程序得到繼續執行但是結果集不存在連NULL都算不上反饋給攻擊者的很可能就是結果集為空的情況其實這是腳本的處理結果當然Oracle PgSQL表現null

運行錯誤不用說了典型的就是利用mysql注入benchmark讓腳本運行超時得到物理路徑以及利用超時來獲得不同的表征進行盲注入

邏輯錯誤和語法錯誤的結合

當表征極不明顯的時候利用類似iff這樣的函數進行正確與否的區分有時候會成救命稻草因為語法錯誤和邏輯錯誤的表征大多數情況都會有不同

iff(=‘no’)這個會產生結果 注意是數字而iff(=‘no’)這個會產生‘no’ 是字符那麼

id= and =iff(=‘no’)正確是必然成立的而id= and =iff(=‘no’)會因為類型不同發生語法錯誤不過可惜的是似乎支持iff函數的數據庫不多呵呵

現在講結果集在注入中的利用原理

從‘or’‘=’開始

這是學習SQL注入的初級課程登陸漏洞我簡略從SQL結果集上分析

$sql = “select top * from admin where username=‘$username’ and password=md(‘$password’)”;

顯而易見‘or’‘=’的加入使SQL語句返回了一條記錄這才使驗證通過

再看現在的驗證中的SQL

$sql = “select top * from admin where username=‘$username’”;

結果集不為空才根據抽取的記錄集中的密碼值與用戶提交的密碼MD值進行比對來進行驗證這樣你突然發現‘or’‘=’的計策失敗鳥但是後台明明有注入這就是驗證方法造成的跟進這個驗證過程‘or’‘=’的確產生了一個結果集(admin表中的第一行記錄)但是遺憾的事後來的密碼比對沒法通過驗證無法成功

思路很簡單網上有案例我重在原理利用union來產生想要的結果集比如‘and(=)union select top username得md值‘id from admin where username=’admin

這樣產生了admin的記錄信息但是記錄集中的密碼那個位置的值被替換成了的md這樣使用admin 通過驗證並且繼承他的權利

更有甚者全部用‘xxx’的方法來盲狙這就很“過分”鳥不過在sql sybase這些嚴格要求類型匹配的數據庫來說這樣不能撼動“管理員登陸”的因為執行時發生了語法錯誤結果集為NULL另外以前 ewebeditor注入漏洞來上傳馬也是這個union操作結果集來達到目的的經典案例
 


From:http://tw.wingwit.com/Article/program/MySQL/201311/29580.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.