一.前言
前面我們講解了一下信息收集,本章節我們來講解一下sql注入的基本原理,我們拿之前搭建的測試網站pikachu來測試,對應工具包也已經放在了工具里面,大家可以自行去下載。
SQL注入攻擊漏洞的原因,是由于程序員在編寫Web程序時,沒有對客戶端(比如瀏覽器等)提交的參數進 行嚴格的過濾和判斷。用戶可以修改參數或數據,并傳遞至服務器端,導致服務端拼接了偽造的SQL查 詢語句,服務端連接數據庫,并將偽造的sql語句發送給數據庫服務端執行,數據庫將sql語句的執行結 果,返回給了服務端,服務端又將結果返回給了客戶端,從而獲取到敏感信息,甚至執行危險的代碼或 系統命令。簡單來說就是:注入產生的原因是接受相關參數未經處理直接帶入數據庫查詢操作。
二.簡單示例
正常查詢
構造sql注入語句,查詢表中所有數據
xxx' or 1=1 #
查詢結果:
看后臺代碼后分析
三.如何查找注入點位置
一句話簡單概括就是:前端頁面上所有提交數據的地方,不管是登錄、注冊、留言板、評論區、分頁等 等地方,只要是提交數據給后臺,后臺拿著該數據和數據庫交互了,那么這個地方就可能存在注入點。
四.通過瀏覽器直接注入測試
構造聯合查詢語句
正常語句:
????????select id,username from member where username='vince';\
構造語句:
????????select id,username from member where username='xxx' union select username,password from users #'
注意一點:union為聯合查詢,但是union后面的select查詢的字段數量,必須和union前面的select查詢 字段個數相同,這是union的特點,通過上面頁面上的回顯效果來看,我們暫且確定為兩個字段,但是這樣判 斷字段個數是不對的,后面我們再詳解。
五.通過burp注入測試
在burp中可以修改任意的請求參數,當然我們如果是get請求,我們就得先把內容進行一下url編碼,再發送過去,這里就不給大家詳細介紹url編碼了當然空格的話我們可以用+代替,之后再發送請求看效果:
那這樣的話,其實我們可以自己寫很多的sql注入語句,然后放到某個文件中,充當我們的字典,然后在burp中配置使用一下這個字典文件數據,進行多個sql注入語句的發送測試。
六.常用的簡單測試語句和注釋符號說明
sql語句的注釋符號也是sql注入語句的關鍵點:常用 # 、 -- 。
1、# 和 -- (有個空格)表示注釋,可以使它們后面的語句不被執行。在url中,如果是get請求(記住是get請求),也就是我們在瀏覽器中輸入的url ,解釋執行的時候,url中#號是用來指導瀏覽器動作的,對服務器 端無用。所以,HTTP請求中不包括#,因此使用#閉合無法注釋,會報錯;而使用-- (有個空格),在傳輸過程 中空格會被忽略,同樣導致無法注釋,所以在get請求傳參注入時才會使用--+的方式來閉合,因為+會被解釋 成空格。
2.當然,也可以使用--%20,把空格轉換為urlencode編碼格式,也不會報錯。同理把#變成%23,也不報錯。
3.如果是post請求,則可以直接使用#來進行閉合。常見的就是表單注入,如我們在后臺登錄框中進行注入。
4.為什么--后面必須要有空格,而#后面就不需要? 因為使用--注釋時,需要使用空格,才能形成有效的sql語句,而#后面可以有空格,也可以沒有,sql就是這么規定的,記住就行了。 因為不加空格,--直接和系統 自動生成的單引號連接在了一起,會被認為是一個關鍵詞,無法注釋掉系統自動生成的單引號。
簡單測試語句:
引號測試,加了引號如果報錯,證明存在注入點
????????單引號閉合數據:$query="select id,email from member where username='vince'"; 用 單引號測試,會報錯,雙引號測試查不到數據,不報錯
????????雙引號閉合數據:$query='select id,email from member where username="vince"'; 用 雙引號測試,會報錯,單引號測試查不到數據,不報錯
or 1=1 一個條件為真,即為真,真的效果就是查詢到表中所有數據
where id=1 and 1=1 兩個條件為真才為真,查詢結果和不加1=1一樣,and 1=2 一個條件為假,即為 假,查詢條件為假,什么數據也沒有,兩個結合起來可以判斷是否存在注入點。
union select 聯合查詢 # 關系型數據庫 redis非關系型的是不能用union select的
七.總結
本章節我們講解了一下sql注入的原理以及知識點,接下來就是講解一下sql注入的分類啦,內容肯定會有點多,期待大家的點贊關注加收藏。