首先的話,我們來仔細搞清楚這個攻擊的流程,第一步就是了解一下,什么是sql?又什么是sql注入、sql注入的流程和步驟。
1、首先什么是sql,
Sql是一種數據庫查詢和程序設計的語言,這里的數據庫是指存放網站的一些信息數據,常見的數據庫有:MySQL、access、mssql(sql server)、oracle數據庫等等,這些數據庫被大多數的中小型企業使用,專門存放用戶的一些網站信息和數據信息,通過一些sql語言中一些的命令去增加、刪除、改寫、查詢這些數據。這個就是sql。
2、什么是sql注入?
一般來說,黑客通過把惡意的sql語句插入到網站的表單提交或者輸入域名請求的查詢語句,最終達到欺騙網站的服務器執行惡意的sql語句,通過這些sql語句來獲取黑客他們自己想要的一些數據信息和用戶信息,也就是說如果存在sql注入,那么就可以執行sql語句的所有命令
1)sql注入形成的原因
數據庫的屬于與網站的代碼未嚴格分離,當一個黑客提交的參數數據未做充分的檢查和防御的話,那么黑客的就會輸入惡意的sql命令,改變了原有的sql命令的語義,就會把黑客執行的語句帶入到數據庫被執行
2)Sql注入的危害。
這些危害不單單只限于數據庫的用戶信息泄露,通過sql注入也可以惡意的篡改網頁,也可以寫入的網站后門。數據庫服務器被估計,數據庫的系統管理員賬號也會被篡改,服務器被遠程控制,也會破壞硬盤數據、使系統癱瘓。
3、sql注入的流程和步驟
首先的話,上面講到了增加、刪除、改寫、查詢這些數據,簡稱為:增刪改查。
我們先了解一下什么是提交方式:提交方式是為滿足不同的需要,與服務器資源進行交互、訪問等等
我們常見的提交方式就是GET和POST
首先是GET,get提交方式,比如說你要查詢一個數據,那么查詢的代碼就會出現在鏈接當中,可以看見我們id=1,1就是我們搜索的內容,出現了鏈接當中,這種就是get
第二個是Post提交方式是看不見的,需要我們利用工具去看見,我們要用到hackbar這款瀏覽器插件
可以就可以這樣去提交,在這里我搜索了2,那么顯示的數據也就不同,這個就是數據庫的查詢功能,那么的話,get提交比post的提交更具有危害性。
介紹了提交方式,接下來就是我們的sql注入
Sql注入的原理就是客戶端提交的數據和命令被帶入到數據庫被執行,從而被黑客惡意的利用,
首先這里是一個正常的頁面,提交的方式是post,那么我們如何去判斷是否存在sql注入?
判斷sql注入我們就要用到一些判斷語句
And 1=1 and 1=2 or 1=1 or 1=2 xor 1=1 xor 1=2
首先是and 1=1和and 1=2 ,and 1=1在網站id=1的后輸入比較以post方式提交,那么的話返回的頁面是正常,因為and是與的意思,1等于1嗎??1肯定等于1,那么這里返回的頁面是正常的,當然,最重要的是,這里的sql語句被帶入到數據庫被執行,所以可以判定這里存sql注入。
執行了and 1=2之后,頁面出現了報錯,因為1不等于2,所以這里的頁面出現了報錯,什么數據也沒查詢出來,那么我們可以判定我們輸入的語句被帶入到數據庫被執行,所以他這個地方存sql注入
然后就是or 1=1 or 1=2, 到了or 1=2這里,返回的頁面就是正常的,因為前面是真,也就是數據存在的,后面的1=2不成立就是假,所以就是真假為真,真真為假, 假假為真,其實最重要的因素還是sql語句被帶入到數據庫被執行了。
那么我們如何去利用sql注入獲取我們想要的信息?
判定完是否存在sql語句后,我們這里整理出sql注入的步驟,1、判斷是否存在sql注入 2、查詢 怎么查詢有幾個列名?我們就要使用到order by 3、顯示可注入的位置 4、顯示數據庫名、顯示數據庫的某個表名、顯示數據庫的某個表名的某個列名、最后顯示數據。
那我們前面判斷了是否存在sql注入,那么我們就可以用order by 來猜列數
首先輸入order by 4 他這里報錯了,提示我們沒有4個列數
輸入order by 3的話,他這里就返回了正常的頁面,說明列數有3個
知道了列數有3個之后,我們就需要顯示字段位了,也就是可以注入的位置
那么我們執行了and 1=2 union select 1,2,3 就成功顯示了字段位,為什么要前面加了and 1=2?這是因為要讓前面報錯,后面的union select查詢語句才能被執行,最終顯示出了注入攻擊的位置
顯示出了2和3的位置,也就是說2和3是可注入和查詢的位置,那么的話,我們這里要用到機個內置的函數 database()(顯示出當前的數據庫名)、user()(當前用戶名) version()(mysql數據庫版本信息)、@@datadir 讀取數據庫路徑、@@basedirmysql安裝路徑、table_name顯示表名、column_name顯示列名
知道了上面的幾個數據庫函數后,我們前面講到sql注入的步驟,第一步就是獲取當前網站的數據庫名,因為數據庫有很多不同的數據庫和名字。也有很多不同的網站、
顯示當前的數據庫名
我們把2替換成了database()函數,知道了當前網站的數據庫為security,那么我們接下來是猜security的表名。
猜表名的話,我們就需要以下語句
information_schema是mysql自帶的數據庫,點號代表下一級的意思,就查出了一個表名
如果要查當前網站的表名,我們就得加一個where table_schema='數據庫名'
于是就查詢出了當前的數據庫的其中一個表名
那么如果要列出所有的表名,我們這里要用到group_concat()函數,他這個函數代表所有的意思,列出了數據庫中的所有表名,一共有四個
那么問題來了,如果說我們要從中獲取數據,我們應該從哪個表名開始?一方面是從users表名,因為user的中文意思是用戶,那么他這里就有可能存用戶的信息,第二個是admin,admin是后臺的意思,那么的話,我們就可以先從這些表開始去弄列名
首先我們選取了users表名,我們要列出所有的列名的話,我們就需要改一下語句,把table改為column
可以看見我把table改為了column,然后后面用table_name=’表名’指定我們要查詢這個表名中的所有列,于是網站就顯示出了id、username、password三個列名
知道了列名之后,接著就是顯示列名里面的數據,顯示數據就不用那么麻煩了,只要知道列名和用from指定表名,那么頁面就會顯示出用戶的郵箱和賬號密碼了
好,那么這個就是一方面sql注入的基礎。
最后喜歡我文章的朋友請加圈子關注我們,私信關鍵詞:加群。
就會自動分享給你群號。歡迎大家加入我們的安全大家庭。提高大家的安全意識,提升大家的網絡安全技能一直是我們的初衷和愿景,讓我們共同成為守護信息世界的“SaFeMAN”。
還有可以關注我們微信公眾號,在公眾號上輸入安界網,就可以關注到我們。