1. 程式人生 > >【轉載】SQL注入各型別 講解及利用 (一)

【轉載】SQL注入各型別 講解及利用 (一)

為了方便個人學習,轉載自 

簡介:

SQL注入漏洞產生的原因

SQL Injection
程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患
使用者可以提交一段資料庫查詢程式碼,根據程式返回的結果,獲得某些他想得知的資料進行資料庫操作

SQL語句

Structured Query Language
結構化的查詢語言,是關係型資料庫通訊的標準語言。
查詢:SELECT statement FROM table WHERE condition
刪除記錄:DELETE FROM table WHERE condition
更新記錄:UPDATE table SET field=value WHERE condtion

新增記錄:INSERT INTO table field VALUES(values)

SQL注入攻擊流程

  1. 判斷注入點

  2. 判斷注入點型別

  3. 判斷資料庫型別

  4. 獲取資料庫資料庫,提權

1. 判斷SQL注入點

找注入點是最關鍵,也最基礎的一個環節

本質原理是:
找一個需要後臺處理後
提交給資料庫的點
所有的輸入只要和資料庫進行互動的,都有可能觸發SQL注入
一般為三大類

Get引數觸發SQL注入
POST引數觸發SQL注入
Cookie觸發SQL注入

例如:
在常規的連結的引數中(連結?引數) 找形如?id=num的,搜尋框 的 ,

而驗證是否存在注入點的方法有很多種
最常規,也最簡單的方法,引入單引號判斷是否存在注入點

http://host/test.php?id=100’

返回錯誤說明有可能注入

http://host/test.php?id=100 and 1=1 返回正常

http://host/test.php?id=100 and 1=2返回錯誤

如果滿足上面三點,是注入點的可能性就很高了

找到注入點之後就是

2.判斷注入型別

0x01 數字型注入點

測試方法:

http://host/test.php?id=100 and 1=1 返回成功

http://host/test.php?id=100 and 1=2 返回失敗

為什麼第一個會返回成功,而第二個是返回失敗呢?

原因如下:

假設我們網站的SQL查詢的語句是這樣的
SELECT * FROM news WHERE id=$id
這裡的$id是使用者提交的

當我們輸入的是
100 and 1=1
語句就變成了這樣
SELECT * FROM news WHERE id=100 and 1=1

這個SQL語句and左邊是返回成功的,因為我們是在有這個id的情況下後面加上我們的注入語句,如果這個id不存在,那就沒法測試了

而在and右邊,1=1也是恆成立的,所以整個語句返回的是成功

當然,如果後面改成了1=2的話,因為1=2是不成立的,and語句的判斷邏輯是隻要有一個不成立,就返回失敗,所以1=2最後會返回的是失敗

0x02 字元型注入點
測試方法:

http://host/test.php?name=man' and '1'='1 返回成功

http://host/test.php?name=man' and '1'='2返回失敗

這裡就使上面的數字型變為了字元型

原因如下:

還是假設我們網站的SQL語句是這樣的
SELECT * FROM news WHERE name='$name'
當我們構造輸入為下面這個的時候
man' and '1'='1
語句就變成了
SELECT * FROM news WHERE name='man' and '1'='1'

發現什麼了沒?這個SQL已經閉合了

還是一樣的,這裡and的左邊是一定成立的,而and右邊也是一樣的成立,所以and邏輯之後,整個語句返回成功
同理可知如果後面是1'='2就會返回失敗,當然,這裡不一定非要是1或者2,因為是字元型,所以我們可以輸入任何字元

比如這樣

http://host/test.php?name=man' and 'a'='a 返回成功
http://host/test.php?name=man' and 'a'='b返回失敗


0x03 搜尋型注入點 — 目前常見的

測試方法

http://host//test.php?keyword=python%' and 1=1 and '%'='

http://host//test.php?keyword=python%' and 1=2 and '%'='

假設我們的SQL查詢語句是這樣的

SELECT * FROM news WHERE keyword like '%$keyword%'

這裡的$keyword是使用者的輸入

當我們輸入以下語句的時候
pt%' and 1=1 and '%'='
最終我們得到的語句是這樣的
SELECT * FROM news WHERE keyword like '%pt%' and 1=1 and '%'='%'
這個語句又一次的閉合了

這裡我們再分析以下,因為是and邏輯,只要有一個錯誤,就返回錯誤

我們可以把這個語句分為三段

SELECT * FROM news WHERE keyword like '%python%'

and 1=1

and '%'='%'

第一行的語句肯定是成功(再強調一遍,我們要在存在的查詢上構造SQL注入)

第二句也是,第三句也是,因為自己肯定等於自己啊

但是如果我們把第二句換成1=2,那麼這個語句肯定就會返回失敗了,就是這個原理

0x04 內聯式SQL注入 –常用

內聯注入是指查詢注入SQL程式碼後,原來的查詢仍然全部執行

假設我們的網站SQL查詢語句是這樣的

SELECT * FROM admin WHER username='$name' AND password ='$passwd'

這一看就是個登入頁面的程式碼

假如我們構造如下語句提交到登入框中的username

' or ''='

或者提交到password框裡面,這兩種提交方法是不一樣的,我們下面就來分析一下這兩個提交方法

提交到username我們的語句就會成為這樣

SELECT * FROM admin WHER username='' or ''='' AND password ='fuzz'

fuzz是我們隨便輸入的字串

而提交到password則會是這樣的

SELECT * FROM admin WHER username='fuzz' AND password ='' or ''=''

注:
SQL語句中,AND的優先順序是大於OR
先計算AND,然後計算OR,所以這裡我們的語句會被OR分為兩段SQL語句

這是username框的

SELECT * FROM admin WHER username=''

or

''='' AND password ='fuzz'

或者password框的是這樣

SELECT * FROM admin WHER username='fuzz' AND password =''

or

''=''

我們首先用第一個來分析

首先計算AND之後

SELECT * FROM admin WHER username=''返回失敗

or

''='' AND password ='fuzz'返回失敗

資料庫是不會存在usernameNULL的欄位的,所以第一句返回的是失敗,第三句中,因為password是我們隨便輸入的,99.99%是不會存在這個密碼的,於是AND之後,我們的第三句也是失敗的,所以整個語句返回失敗的

但是我們的password情況就不一樣了

SELECT * FROM admin WHER username='fuzz' AND password =''

or

''=''

這裡我們第一句是返回失敗的,但是我們的第二句''=''是返回成功的,OR邏輯是有一個是成功就返回成功,於是我們的整個語句就會返回成功

返回成功之後我們就會繞過登入表單直接登入系統了


0x05 終止式SQL注入 —常用

終止式SQL語句注入是指攻擊者在注入SQL程式碼時,通過註釋剩下的查詢來成功結束該語句

於是被註釋的查詢不會被執行,我們還是拿上面那個例子舉例

我們上面已經知道,在username框內填入

' or ''='

程式是不會返回成功的,我們就沒有辦法在username做文章了嗎?

錯了,我們還有終止式

還是上面那個SQL查詢語句

SELECT * FROM admin WHER username='$name' AND password ='$passwd'

這裡我們構造如下username輸入

' or ''='' --

之後我們就可以得到如下的查詢語句

SELECT * FROM admin WHER username='' or ''='' --' AND password ='fuzz'

這裡的fuzz是我們隨便輸入的,--是註釋符

這樣,我們的語句就可以分為三個部分了

SELECT * FROM admin WHER username=''

or ''='' 返回成功

--' AND password ='fuzz'

第一句肯定是返回失敗的,但是我們第二句會返回成功

後面已經被我們註釋掉了,是不會執行的,所以我們還是可以通過在username做這個手腳來繞過登入

下面是我們常見的一些終止方式

終止字串:

-- , #, %23, %00, /*

終止方法:

-- , ‘-- , ‘)-- , ) -- , ‘)) --, ))--

相關推薦

轉載SQL注入型別 講解利用 ()

為了方便個人學習,轉載自 簡介:SQL注入漏洞產生的原因SQL Injection程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患 使用者可以提交一段資料庫查詢程式碼,根據程式返回的結果,獲得某些他想得知的資料或進行資料庫操作S

轉載SQL執行計劃

會有 tab serve per nvarchar 消耗cpu 允許 如果 實現 要理解執行計劃,怎麽也得先理解,那各種各樣的名詞吧。鑒於自己還不是很了解。本文打算作為只寫懂的,不懂的懂了才寫。   在開頭要先說明,第一次看執行計劃要註意,SQL Server的執行計劃是從

轉載Linux下資料夾的含義和用途 Linux下資料夾的含義和用途

原文地址:https://www.cnblogs.com/lanqingzhou/p/8037269.html Linux下各資料夾的含義和用途 Linux根目錄”/“下各個系統資料夾的含義和用途 1、/boot 該目錄預設下存放的是Linux的啟動檔案和核心。 2、/initrd 它的英文

SQL注入漏洞全接觸--入門篇

隨著B/S模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫程式碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫

轉載Sql server 2005使用OSQL連接出錯

Sql server 2005使用OSQL連接出錯 錯誤資訊: [SQL Native Client] 命名管道提供程式:無法開啟與 Sql Server 的連線[2]. 資訊如下圖: 解決方法: 設定Tcp/IP屬性,將IP1,IP2,IPALL的TCP動態埠設為“1433”,

轉載SQL語句用一個表的數據更新另一個表

upd 擴展 serve new 定義函數 strong 特定 自定義函數 哪些 在Sqlserver的維護更新操作中,有時候涉及到Update操作,其中有一種情況是根據特定的條件,以一個表中的數據更新另一個表的數據,此時涉及到兩個表之間的關系以及操作,此處介紹2種更新方法

轉載linux下的samba安裝配置

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

轉載 Idea-Maven的配置使用預設倉庫修改

轉載出處-https://www.cnblogs.com/Silencepeng/p/7444012.html 保留參考使用,如果侵權請告知刪除 一、下載maven的包 http://www.apache.org/ 1.在網頁中開啟上面的網址,進入下面的頁面 2.拖動滾動條

轉載微信小程式-開發入門(

微信小程式已經火了一段時間了,之前一直也在關注,就這半年的發展來看,相對原生APP大部分公司還是不願意將主營業務放到微信平臺上,以免受制於騰訊,不過就小程式的應用場景(用完即走和二維碼分發等)還是很值得我們學習的,技術上面如果瞭解React的話,會發現他們在元件化上面有很多雷同之處。說白了,小程式就是基於微信

轉載容斥原理的證明應用

翻譯:[email protected] 對容斥原理的描述 容斥原理是一種重要的組合數學方法,可以讓你求解任意大小的集合,或者計算複合事件的概率。 描述        容斥原理可以描述如下:          要計算幾個集合並集的大小,我們要先將所有單個集

演算法紅黑樹的講解插入刪除演算法實現原理

【轉】【經典】 導讀:    linux核心中的使用者態地址空間管理使用了紅黑樹(red-black tree)這種資料結構,我想一定有許多人在這種資料結構上感到困惑,我也曾經為此查閱了許多資料以便了解紅黑樹的原理。最近我在一個外國網站上看到一篇 講解紅黑樹的文章,覺得相當不錯,不敢獨享,於是翻譯成中文供

轉載常用資料增強方法總結實現

【參考資料】論文:ImageNet Classification with Deep Convolutional Neural Networks【常用方法】1、Color Jittering:對顏色的資料增強:影象亮度、飽和度、對比度變化(此處對色彩抖動的理解不知是否得當);

轉載plsql返回記錄集的方法利用table()函式—之二

今天在開發的時候,要找出兩個表中的不同記錄。我一般是用exists的,但看到也可以這樣SELECT T5,T6,T7,T8 FROM TAB02 WHERE      T5||T6||T7 NOT IN      (SELECT T1||T2||T3 FROM TAB01)把幾個欄位合併成一個欄位,雖然很SB

轉載java文件路徑問題getResource和getClassLoader().getResource的區別

場景 article 文件 存在 info com rate () 分享圖片 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u012572955/article/details/52880520我們經常在java的io操作

轉--v$session & v$process字段的說明轉載

lte 個數 是個 join 系統進程 com to_char sel info Oracle 動態性能表 v$session & v$process 整理自google出來的網絡資源。google是個好東東。沒有google我會心神不寧。 v$sessi

轉載快速冪講解

這一 lan nbsp 進制 pre 去掉 實現 clas done 轉載自:cxcxcxc 快速冪講解   快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。   首先

Mysql C語言API編程入門講解轉載

nbsp ogr http cati 存取 編程入門 開發 實現 調用 軟件開發中我們經常要訪問數據庫,存取數據,之前已經有網友提出讓雞啄米講講數據庫編程的知識,本文就詳細講解如何使用Mysql的C語言API進行數據庫編程。鞍山皮膚病專科醫院www.0412pfk.

轉載解決SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的訪問的方法

com .html style color statement 轉載 ons server http 1、開啟Ad Hoc Distributed Queries組件,在sql查詢編輯器中執行如下語句: exec sp_configure ‘show advanced

轉載postgresql儲存過程中返回型別

前言 假如需要在pg上面寫儲存過程,那麼返回型別必定是一個疑問點。 一般而言,對於一個查詢語句,為了可以統一動態返回各種資料,我們是不會蠢到每一個儲存過程都額外編寫一個返回型別 譬如: (id,name,password) 之類的,所以在寫的時候肯定會考慮 setof record這個動

轉載JS Number型別數字位數IEEE754標準

JS的基礎型別Number,遵循 IEEE 754 規範,採用雙精度儲存(double precision),佔用 64 bit。如圖   意義 1位用來表示符號位 11位用來表示指數 52位表示尾數   浮點數,比如