目錄
前言
一、SQL注入介紹
二、學習環境介紹
三、SQL注入原理
總結
前言
在網路安全領域中,sql注入是一個無法被忽視的關鍵點,曾經多少的網站都因此被攻破,直到現在很多網站依舊存在很多sql注入的漏洞和風險點,Sql注入的原理簡單,但變化和危害特別嚴重,屬于“上有政策,下有對策”的風險點,也是從事滲透攻防必不可少的一個知識點,本人因近期學習滲透測驗相關內容,特此記錄學習程序中的筆記,若你也是剛入門滲透安全,或許會有幫助,也希望可以一起交流,
一、SQL注入介紹
參考互聯網對sql注入的介紹:SQL注入在英文中稱為SQL Injection,是黑客對Web資料庫進行攻擊的常用手段之一,在這種攻擊方式中,惡意代碼被插入到查詢字串中,然后將該字串傳遞到資料庫服務器進行執行,根據資料庫回傳的結果,獲得某些資料并發起進一步攻擊,甚至獲取管理員帳號密碼、竊取或者篡改系統資料,
通俗地說,即是在所有可供用戶提交資料與資料庫內部互動的程序中均存在sql注入的風險,我們平時經常會碰到登錄界面的互動,當我們提交用戶名和密碼后,網站會將我們提交的資料作為sql查詢陳述句的引數部分拼接成完整的sql查詢陳述句執行,正常的情況下不會出現任何問題,但若有人惡意在輸入中提交資料庫的關鍵字語法,則資料庫會將本來的輸入誤以為是sql語法并執行,則會造成惡意的結果,下面會詳細介紹原理,
二、學習環境介紹
我本次所有的sql注入筆記都基于sqlilabs靶場進行演示,sqlilabs是一個印度程式員寫的,用來學習 sql 注入的一個游戲教程,sqlilabs需要apache+php+mysql的環境,我在虛擬機kali linux上使用phpstudy搭建了集成環境,為了方便,我在本機連接虛擬機kali linux部署的網站和資料庫進行操作演示,Sqlmap等軟體可以方便地,高效地完成sql注入,但是只會使用工具而不了解原理會讓我們無法拓展知識點,無法真正地學習sql注入,也無法在遇到問題時思考該如何克服當前障礙進行深一步的注入,因此我本次所有的筆記都基于原理出發,對于一些反復嘗試的盲注,會采用python撰寫腳本來完全地理解注入的整個程序,
三、SQL注入原理
首先讓我們來看一個實體,這是sqlilabs的less-11中post注入的實體,也是我們平時碰到比較多的登錄界面,其中一個正確的用戶名密碼對均為Dumb,當我們輸入后顯示登錄成功,
顯然這背后的sql邏輯代碼為:
SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1;
其中users表是該資料庫中存盤用戶登錄資訊的表,usernmae和password對應資料庫用戶名和密碼的欄位,而$uname和$passwd則是php網頁中傳入用戶名和密碼的兩個引數,對應于我們使用Dumb登錄時,mysql處理的陳述句就變為:
SELECT username, password FROM users WHERE username='Dumb' and password='Dumb' LIMIT 0,1;
這一句sql陳述句的含義為從users表中查詢用戶名和密碼都為Dumb的用戶(limit 0,1的含義則是控制查詢結果,回傳第一條記錄),并把他的username和password欄位值回傳,在使用navicat連接部署的sqlilabs資料庫查看后發現執行成功,回傳了Dumb的用戶名和密碼,

mysql查詢后回傳給php進行邏輯判斷,存在記錄,因此登錄成功,若用戶名或密碼不正確,則查詢不到記錄,因此無法登錄,這就是登錄界面的基本原理,在正常情況下不會出現任何問題,現在有一個計算機專業的同學張三,他只知道Dumb的用戶名,而不知道他的密碼,但是他想登錄Dumb的賬號,是不是沒有任何辦法了呢?可能有人會說用暴力破解,確實對于這個實體可以暴力破解,但是如果有驗證碼該怎么辦呢,是不是也沒有辦法了呢?此時張三靈機一動,不按套路出牌,他往用戶名輸入了這樣的一串字符“Dumb’ #”,而密碼隨便輸入了“123456”,這樣居然成功登錄了,回傳和前面一樣的界面!這就是最簡單的一個sql注入,讓我們來看看這里面發生了什么吧,當張三提交輸入后,sql陳述句變成了:
SELECT username, password FROM users WHERE username='Dumb’#' and password='123456' limit 0,1;
把這一句sql陳述句放到navicat中可以直觀的看出“#”起到了注釋的作用,將后面的陳述句全部注釋,而’將前面username欄位引數的區間閉合,因此構成了一個正確的sql陳述句,等同于:
SELECT username, password FROM users WHERE username='Dumb’
這一句sql陳述句的含義為從users表中查詢用戶名為Dumb的用戶,且回傳他的username和password欄位值,這樣屏蔽了對于密碼的判斷條件,因此成功登錄,這便是最簡單sql注入的原理了,那么讓我們思考一下,既然上面實體可以屏蔽后面多余的sql陳述句而重新構造一個新的且正確的sql陳述句,那么我們是不是可以不只局限于登錄?是否可以獲取其他資訊或者篡改服務器的其他資料呢?這些都是可以的,下圖展示了一個獲取資料庫名稱和mysql版本號的事例,從圖中可以看到當前資料庫名稱為“security”,當前mysql版本為“5.7.27”,其中用到的payload為v' union select DATABASE(), VERSION() #,其余的各種注入方式和型別都會在筆記中一一提到,

總結
Sql注入的方式和分類很多,例如:基于報錯資訊、基于前端回顯資訊、sql盲注、基于時間、union查詢、檔案匯入匯出注入、寬位元組注入、get、post和cookie注入、堆查詢注入等等,Sql注入方式層出不窮,防御方式也在不斷更新,而注入方式也在不斷探尋,因此只有理解原理,才能真正地利用sql注入進行滲透測驗,而目前已有的方式方法會在之后的筆記中記錄,
本人從事滲透行業,目前初學滲透,是一名小白,特此記錄一些學習筆記,肯定有很多理解不到位或錯誤的地方,歡迎大佬指導,感謝觀看,若對同樣學習的小伙伴們有幫助就最好了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297509.html
標籤:其他
上一篇:ctfshow web入門 命令執行后篇(web55-web188)
下一篇:OSPF的安全性設計
