【轉載】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. 判斷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'
返回失敗
資料庫是不會存在username
為NULL
的欄位的,所以第一句返回的是失敗,第三句中,因為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位表示尾數 浮點數,比如