僅用於滲透測試教學,禁止用於不當目的
什麼是SQL注入
SQL注入是Web滲透測試中的一種攻擊手段,主要針對目標數據庫。sql注入就是指:Web應用程序對用戶輸入數據的合法性沒有做判斷,前端輸入後端的參數是攻擊者可控的,並且能夠將參數帶入數據庫進行查詢,攻擊者可以通過構造不同的SQL語句來實現對數據庫的任意操作。
一般情況下,開發人員可以使用動態SQL語句創建通用、靈活的應用。
動態SQL語句是在執行過程中構造的,它根據不同的條件產生不同的SQL語句。當開發人員在運行過程中需要根據不同的查詢標準決定提取什麼字段(如select語句),或者根據不同的條件選擇不同的查詢表時,動態地構造SQL語句會非常有用!
下面以PHP語句為例:
<code>$query = "SELECT * FROM users WHERE id = $_GET['id']"/<code>
由於上面的嘗試ID可控,且是帶入數據庫進行查詢的,所以攻擊者可以任意拼接SQL語句進行攻擊。
當然,SQL注入按照不同的分類方法可以分為報錯注入、盲注、Union注入等。
SQL注入原理
要想產生SQL注入漏洞,必須滿足兩個條件:
- 參數用戶可控:前端傳給後端的參數內容是用戶可以隨時改變可控的
- 參數帶入數據庫查詢:傳入的參數拼接到SQL語句中,而且直接帶入數據庫查詢,和數據庫進行交互!
當傳入的ID參數為1'時,數據庫要執行的代碼就是:
<code>select * from users where id = 1'/<code>
這明顯不符合數據庫的語法規範,所以會報錯。當傳入的ID參數為and 1=1時,執行的SQL語句如下:
<code>select * from users where id = 1 and 1=1/<code>
因為後添加的and 1=1,1=1永遠是真(對的),而且where語句中的id=1也為真,所以頁面返回的情況會和id=1的頁面一模一樣。如果你將傳入的參數ID為and 1=2時,由於後面的1=2不成立,結果會返回假(錯的),頁面就會顯示不同的結果!
由此可以判斷ID參數存在SQL注入漏洞,攻擊者可以進一步拼接SQL語句進行攻擊,致使數據庫信息洩露,甚至進一步拿取服務器權限!
請記住,在實際web網站滲透的過程中,凡是滿足上面兩個條件就會存在SQL注入漏洞,因此所有的開發者都會盡量迫使外部輸入的參數不能直接和數據庫進行交互,否則就會引起數據庫被黑的隱患!
MySQL數據庫重要基礎!
MySql是常用的數據庫版本之一!我們先來學習下MySQL的SQL注入知識點:
1、在所有的MySQL5.0版本之後,MySQL默認在數據庫中存放一個"information_schema"的數據庫。在該庫中,大家一定要記住三個表名:
<code>a、SCHEMATA
b、TABLES
c、COLUMNS/<code>
- SCHEMATA
該表中存儲該用戶創建的所有數據庫的庫名
,這個表下有個字段SCHEMA_NAME,這個字段記錄了所有的數據庫名。運行win7靶機的WAMP服務器,這個服務器已經安裝好了mysql數據庫,然後打開phpmyadmin頁面,如圖!
- TABLES
該表儲存了用戶創建的所有數據庫庫名、表名
。在該表中的字段TABLE_SCHEMA記錄的是所有的庫名,而字段TABLE_NAME記錄的是所有的表名。- COLUMNS
這個表中存儲了所有的數據庫的庫、表、字段。這個表中的三個字段TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME剛好記錄數據庫所有的庫名、表名、字段名!
2、常用的MySQL查詢語句如下。
在不知道任何條件時:
<code>select 要查詢的字段名 from 庫名.表名/<code>
知道一個已知條件時:
<code>select 要查詢的字段名 from 庫名.表名 where 已知條件的字段名='已知條件的值'/<code>
知道兩個已知條件時:
<code>select 要查詢的字段名 from 庫名.表名 where 已知條件1的字段名='已知條件1的值' AND 已知條件2的字段名='已知條件2的值'
比如第一個:/<code>
3、mysql數據庫的limit用法
Limit的使用格式為limit m,n,m是指記錄開始的位置,從0開始,表示第一條記錄;n是指提取一共n條記錄。簡單說limit 0,5,就是從第一條開始,一共提取5條!
比如不使用limit查詢,結果會是:
你會發現顯示所有信息!
如果使用limit用法,將會如下圖:
你會發現顯示前兩條信息!
4、學會使用MySQL數據的終端
啟動後,就會看到如圖所示,默認沒有密碼,回車即可登錄!
你發現,首先使用use security這個數據庫;然後select * from users;,意思是從當前的security數據庫中選擇表users,當然你也可以使用其他的數據庫,比如mysql、platform,這要看你的MySQL數據庫中有哪些數據庫名稱。然後例舉該表下的所有字段id、username、password!
5、需要記住的幾個mysql數據庫的函數
<code>database():當前網站使用的數據庫名稱
version():當前MySQL的版本
user():當前MySQL的用戶!/<code>
使用例子:
<code>select datebase();/<code>
上圖的意思是,首先沒有進入任何一個數據庫名稱中,使用database();,發現是null,當然啊!你還沒有選擇一個數據庫進入!接下來我們使用了"test"數據庫,就發現database()顯示了當前使用的數據庫名稱是test!
繼續查詢下函數user():
<code>select user();/<code>
發現連接該mysql數據庫的用戶是root用戶!
推薦一款數據庫管理連接軟件
前面我們使用過phpmyadmin網頁數據庫管理平臺,實在不便,接下來我們也使用了mysql的黑白管理終端。那麼現在我們使用一款可視化非常好的數據庫管理軟件,也就是說讓你更加容易控制你的MySQL數據庫——Navicat for Mysql!加入我的 即可獲取下載、安裝、使用等教學視頻。
直接默認安裝即可,詳細參照視頻安裝!
這裡的Navicat for Mysql就是mysql數據庫的管理軟件(類似以一個操作界面),非常方便!
連接成功,我們就可以進行查詢使用,比如,我們來查詢security數據庫下users這個表中的字段username、password:
這裡還使用函數user()查詢了當前數據庫登錄的用戶。
下面顯示是root,本地登錄!
以後,只要操作數據庫,只要win7靶機的wamp開啟了,或者你獲得了目標服務器的數據庫,就能使用Navicat for Mysql來操作!
關於更多web滲透實戰技術,可以點擊 ,進入我專欄進行學習。歡迎關注、點贊、評論!
閱讀更多 小白嘿客 的文章