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






