簡(jiǎn)單聊聊SQL注入的原理以及一般步驟
原理
SQL注入是一種攻擊方式,在這種攻擊方式中,惡意代碼被插入到字符串中,然后該字符串傳遞到SQL Server的實(shí)例以進(jìn)行分析和執(zhí)行。任何構(gòu)成SQL語句的過程都應(yīng)進(jìn)行注入檢查,因?yàn)镾QL Server將執(zhí)行其接收到的所有語法有效的查詢。
(摘自微軟 SQL注入,但要注意的是,SQL注入并不限于SQL Server,幾乎任何數(shù)據(jù)庫引擎都存在這個(gè)問題)
一般利用步驟
1.判斷注入點(diǎn)
判斷注入點(diǎn)有方面的含義,一是找到可能存在注入的位置,二十判斷該處能否進(jìn)行注入。在靶場(chǎng)環(huán)境下,我們已經(jīng)知道,GET的參數(shù)id是與數(shù)據(jù)庫進(jìn)行交互的點(diǎn),接下來判斷能夠進(jìn)行注入。
id為1,成功查詢,回顯正常
id為1',數(shù)據(jù)庫報(bào)錯(cuò),由報(bào)錯(cuò)信息猜測(cè)閉合方式為單引號(hào)
id為1' --+,成功查詢,回顯正常,印證猜測(cè),
id分別為1' and 1=1 --+和1' and 1=2--+,通過回顯情況,進(jìn)一步判斷能否注入
1=1為永真,當(dāng)1成功查詢,若1=1也成功查詢,則頁面返回正常,1=2為永假,因此若1=2得到執(zhí)行,則頁面必返回不正常。通過對(duì)比二者返回結(jié)果,可知改點(diǎn)能否進(jìn)行注入。
2.判斷查詢字段數(shù)
為了將我們想要的結(jié)果能夠顯示在頁面上,我們需要用到聯(lián)合查詢,聯(lián)合查詢的條件之一是必須保證前后查詢語句的字段數(shù)相等,因此,我們需要判斷查詢的字段數(shù)。
一般采用order by或union select如下:
order by 大于3的數(shù)時(shí)頁面返回不正常,小于等于3時(shí)返回正常,得知原查詢語句的字段數(shù)為3?;?/p>
當(dāng)我們聯(lián)合查詢4列時(shí),得到了查詢語句由不同的列的錯(cuò)誤,查詢3列時(shí):
成功查詢,得原查詢語句只有三列。
3.查數(shù)據(jù)庫名、版本號(hào)、用戶名等信息
union聯(lián)合查詢的規(guī)則是當(dāng)前一個(gè)查詢失敗時(shí)執(zhí)行第二個(gè)查詢,前面我們知道了查詢有三個(gè)字段,接下來將傳入id為0,判斷是三個(gè)字段的回顯位置。
再由數(shù)據(jù)庫內(nèi)置的version()
、database()
、user()
查詢出版本號(hào)、數(shù)據(jù)庫當(dāng)前名和當(dāng)前用戶。
4.查詢表名
前面我們查詢得知,當(dāng)前數(shù)據(jù)庫版本為5.5.53,在MySQL5.5后版本都內(nèi)置了數(shù)據(jù)庫information_schema。它存儲(chǔ)了數(shù)據(jù)庫中所有的表名、字段名等信息。從而可以構(gòu)造查詢語句,獲取表名。
payload:?id=0' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3--+
這里的group_concat()
為SQL語句內(nèi)置的聚合函數(shù),用來將查詢的結(jié)果作為一個(gè)字符串輸出。
(使用payload:?id=0' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+
)
5.查詢字段名
知道了所有的表名,接下來選擇一個(gè)表,查詢其中所有的字段名。
payload:?id=0' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3--+
6.查詢記錄內(nèi)容
有了表名和字段名,便可以爆出數(shù)據(jù)庫中的記錄了。
payload:?id=0' union select 1,group_concat(username),group_concat(password) from users --+
以上是一般SQL注入的流程,當(dāng)然還有一些像報(bào)錯(cuò)注入,請(qǐng)求頭注入、select into outfile 寫入一句話木馬等姿勢(shì)未介紹。后續(xù)學(xué)習(xí)過程中再逐漸補(bǔ)充。
總結(jié)
到此這篇關(guān)于SQL注入的原理以及一般步驟的文章就介紹到這了,更多相關(guān)SQL注入的原理及步驟內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
圖文詳解如何在navicat中導(dǎo)入excel表格數(shù)據(jù)
Navicat可以方便的操作各種數(shù)據(jù)庫,也提供了豐富的導(dǎo)入導(dǎo)出功能,下面這篇文章主要給大家介紹了關(guān)于如何在navicat中導(dǎo)入excel表格數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-02-02DataGrip 數(shù)據(jù)導(dǎo)出與導(dǎo)入的實(shí)現(xiàn)示例
DataGrip 是一款類似于Workbench的數(shù)據(jù)庫設(shè)計(jì)工具。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09ORACLE 系統(tǒng)函數(shù)大全SQLSERVER系統(tǒng)函數(shù)的異同
下面是Oracle支持的字符函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù)。2009-07-07sql server中datetime字段去除時(shí)間代碼收藏
sql下把datetime字段的時(shí)間去除的方法整理收集2008-04-04postgresql 按小時(shí)分表(含觸發(fā)器)的實(shí)現(xiàn)方式
這篇文章主要介紹了postgresql 按小時(shí)分表(含觸發(fā)器)的實(shí)現(xiàn)方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01