這篇文章給大家介紹SQL注入原理及代碼分析是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、達(dá)孜網(wǎng)絡(luò)推廣、微信小程序開發(fā)、達(dá)孜網(wǎng)絡(luò)營銷、達(dá)孜企業(yè)策劃、達(dá)孜品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供達(dá)孜建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
我們都知道,學(xué)安全,懂SQL注入是重中之重,因?yàn)榧词故乾F(xiàn)在,SQL注入漏洞依然存在,只是相對(duì)于之前現(xiàn)在挖SQL注入變的困難了。而且知識(shí)點(diǎn)比較多,所以在這里總結(jié)一下。通過構(gòu)造有缺陷的代碼,來理解常見的幾種SQL注入。下面只是講解幾種注入原理,沒有詳細(xì)的利用過程。
SQL注入漏洞的產(chǎn)生需要滿足兩個(gè)條件
參數(shù)用戶可控:前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的。
參數(shù)帶入數(shù)據(jù)庫查詢:傳入的參數(shù)拼接到SQL語句并帶入數(shù)據(jù)庫查詢。
所以在實(shí)際環(huán)境中開發(fā)者要秉持“外部參數(shù)皆不可信原則”進(jìn)行開發(fā)。
先看代碼
"; ?>
在union注入頁面中,程序獲取GET參數(shù)id,對(duì)用戶傳過來的id值沒有進(jìn)行過濾,直接拼接到SQL語句中,在數(shù)據(jù)庫中查詢id對(duì)應(yīng)的內(nèi)容,并將這一條查詢結(jié)果中的user和password 輸出到頁面。進(jìn)行union注入攻擊前提是頁面有回顯。
然后就是注入的常規(guī)思路,判斷類型,判斷字段數(shù),使用union查詢相關(guān)數(shù)據(jù)。
先看代碼
在布爾盲注頁面中,程序先獲取GET參數(shù)id,通過preg_match()函數(shù)判斷其中是否存在union sleep benchmark等危險(xiǎn)字符。然后將參數(shù)id拼接到SQL語句,從數(shù)據(jù)庫查詢,如果有結(jié)果,返回yes,否則返回no。所以訪問這個(gè)頁面,代碼根據(jù)查詢結(jié)果返回只返回yes和no,不返回?cái)?shù)據(jù)庫中的任何結(jié)果,所以上一種的union注入在這里行不通。嘗試?yán)貌紶柮ぷⅰ?br/>布爾盲注是指構(gòu)造SQL判斷語句,通過查看頁面的返回結(jié)果來推測哪些SQL判斷是成立的。例如,我們可以判斷數(shù)據(jù)庫名的長度構(gòu)造語句如下。
and length(database())>=1 #依次增加,查看返回結(jié)果
通過上面的語句我們可以猜到數(shù)據(jù)庫名長度為4。
接著使用逐字符判斷的方式獲取數(shù)據(jù)庫庫名,數(shù)據(jù)庫庫名范圍一般都是a~z,字母0~9。構(gòu)造語句如下。
and substr(database(),1,1)=要猜解的字母(轉(zhuǎn)換成16進(jìn)制)
substr是截取的意思,構(gòu)造語句的含義是,截取database()的值,從第一個(gè)開始,每次返回一個(gè)。這里要注意,要和limit語句區(qū)分開,limit從0開始排序,substr從1開始排序。因?yàn)槲抑罃?shù)據(jù)庫的第一個(gè)字母是d,所以直接換成d,轉(zhuǎn)換成16進(jìn)制就是0x64。結(jié)果如下。
在真實(shí)環(huán)境中,自己手工的話,工作量有點(diǎn)大,可以借助burp的爆破功能爆破要猜解的字母。
同樣,也可以利用substr()來猜解表名和字段。構(gòu)造語句
and substr((select table_name from information_schema.tables where table_schema=庫名 limit 0,1),1,1)=要猜解的字母(這里指表名)
用這樣的方法,可以猜解出所有的表名和字段,手工會(huì)累死,可以借助burp或者sqlmap。
先看代碼
查看代碼,在報(bào)錯(cuò)注入頁面中,程序獲取GET參數(shù)id后,將id拼接到SQL語句中查詢,如果執(zhí)行成功,就輸出ok,如果出錯(cuò),就通過echo mysqli_error($con)將錯(cuò)誤信息輸出到頁面。我們可以利用這種錯(cuò)誤回顯,通過updatexml()、floor()等函數(shù)將我們要查詢的內(nèi)容顯示到頁面上。
例如,我們通過updatexml()獲取user()的值,構(gòu)造如下語句。
and updatexml(1,concat(0x7e,(select user()),0x7e),1) #0x7e是~16進(jìn)制編碼
發(fā)現(xiàn)查詢出了user()的值
同樣,我們也可以查詢出database()的值
and updatexml(1,concat(0x7e,(select database()),0x7e),1) #0x7e是~16進(jìn)制編碼
查詢出了數(shù)據(jù)庫名
我們可以用這種方法查詢出剩下的所有表名和字段,只需要構(gòu)造相關(guān)的SQL語句就可以了。
先看代碼
no