亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

SQL Server注入錯誤介紹及產生原理

添加時間:2014-4-18 16:57:22  添加: 思海網絡 

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

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

  1.邏輯錯誤

  簡單的例子是1=1 1=2這兩個,1=1與1=2頁面不同的原理是什么?以$sql = "select * from news where id=$_GET[id]"為例。

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

  select * from news where id=1 or 1=1

 

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

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

  2.語法錯誤

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

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

  3.邏輯錯誤和語法錯誤的結合。

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

  iff(1=1,1,'no')這個會產生結果1 注意是數字,而iff(1=2,1,'no')這個會產生'no' 是字符。那么

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

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

  1.從'or''='開始

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

  $sql = "select top 1 * from admin where username='$username' and password=md5('$password')";

 

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

  2.再看現在的驗證中的SQL

  $sql = "select top 1 * from admin where username='$username'";

 

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

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

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

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

關鍵字:SQL Server、數據庫、服務器

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站