初學Web安全之sql注入(一)
sql注入產生原因
sql注入漏洞的產生需要滿足以下兩個條件:
- 引數用戶可控
- 傳入的引數拼接到sql陳述句并且帶入到資料庫查詢
一般來說,用戶登錄網頁所使用的sql陳述句為:
select * from user where username='admin' and password='password';
而如果程式員設計網頁之初沒有對用戶的輸入進行過濾,使得用戶的輸入可以帶入到資料庫,那么這時候就可以產生sql注入,最簡單的一種,就是構造萬能密碼,這里拿dvwa來測驗一下:
打開dvwa,修改等級為low,選擇sql注入:

輸入如下:
' or '1'='1'#

輸入結果如圖:

那么原理是什么呢?首先我們查看源代碼:

其中sql陳述句為:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
再看看我們前面輸入的:
’ or ‘1’=‘1’#
將它帶入到sql陳述句中,就變成了:
SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1'#';
這里利用了or陳述句,只要有一個true那么陳述句就回傳true,這時候陳述句就會被帶到資料庫中,查詢出全部的"first_name"和"last_name" (第一個引號與前面的引號形成了閉合,變為’’,后面的#為注釋符,將后面的單引號注釋掉)
sql注入方法
sql注入有get型,post型和cookie型,因為筆者是初學者,所以先從get型開始,正常的注入步驟如下:
判斷有無注入點
回顯正常——聯合查詢,回顯報錯——報錯注入
聯合查詢步驟:
判斷字符型還是數字型
如果是字符型,判斷閉合情況
判斷欄位數
判斷顯示位
查看資料庫版本(因為MYSQL4.0和MYSQL5.0版本注入方法不一樣,不過現在普遍是5.0以上版本)
獲取全部資料庫名字(可用可不用,看情況而定)
獲取當前資料庫下所有的表名
判斷關鍵表列名
獲取資料
拿sqli-lab來測驗一下,這里使用的是mysql資料庫,打開sqli-lab的第一關:
(可以在url輸入,這里筆者使用的是hackbar插件)
輸入單引號報錯,判斷有注入點:

洗掉單引號,輸入單引號,沒報錯,判斷是字符型,閉合是單引號(原理后面再細說):

利用order by判斷欄位數,輸入order by 3不報錯,輸入order by 4報錯,說明欄位是是3,注意,因為是字符型,所以最后面要加注釋符注釋掉引號:


接著判斷顯示位,使用union拼接select 1,2,3,發現頁面并無變化,判斷有可能是前面的id=1占用了顯示位,改為id=-1,發現2和3顯示出來了,說明2,3是顯示位:


接著便是查看資料庫版本了,順帶查看了下當前資料庫名字(因為后面所使用是同個資料庫,所以這個步驟在后面文章里會省略):

獲取全部資料庫名字(這個步驟只是演示一下,在后面也會省略):

獲取當前資料庫下所有的表名,判斷管理員賬號密碼存放在users表里:

判斷關鍵表列名為username和password:

最后一步,獲取資料:

至此,第一關完成,
那么現在來解釋下判斷數字型和字符型還有閉合的原理:
- 數字型的sql陳述句:
select * from user where id=1;
- 字符型的sql陳述句:
select * from user where id='1';
select * from user where id="1";
拿數字型來說,你不管在后面加單引號還是雙引號,都會導致陳述句錯誤而報錯,那么兩種引號都報錯,我們就可以判定為數字型;
字符型的話,拿單引號型別來說,加入單引號之后:
id='1''
會導致陳述句后面多出來一個單引號,使得陳述句錯誤,如果加入雙引號:
id='1"'
雙引號被單引號包裹著,那么會將雙引號也認為是一個字符,所以并不會報錯,從而可以判斷出是單引號閉合,雙引號型別也是同理,只是引號相反而已,
總結:兩種引號都報錯為字符型,單引號報錯雙引號不報錯為單引號閉合,雙引號報錯單引號不報錯為雙引號閉合,字符型最后要加注釋符注釋掉閉合后多余出來的引號,
筆者這里的注入是針對MYSQL資料庫的,所以需要了解MYSQL的相關知識:
mysql5.0版本之后,默認有一個“information_schema”資料庫,里面有三張表:
SCHEMATA: 存放了所有資料庫資訊
關鍵欄位:schema_name——資料庫名字
TABLES:存放所有資料表資訊
關鍵欄位:table_schema——資料庫名字
-------------- table_name ——資料表名字
COLUMNS:存放所有列的資訊
關鍵欄位:table_schema——資料庫名字
-------------- table_name——資料表名字
-------------- column_name——列名
理解了這些,相信上面的sql陳述句也就明白了>_<
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224197.html
標籤:其他
下一篇:Mybatis或Mybatis-Plus框架的xml檔案中特殊符號的使用(<、<= 、>、 >=、&、‘、“ )
