제약 기반 SQL 공격

5557 단어 WEB 안전
머리말
다행히도 현재 개발 자가 사 이 트 를 구축 할 때 안전 문 제 를 중시 하기 시작 했다.대부분의 개발 자 들 은 SQL 주입 구멍 의 존 재 를 의식 하고 있 습 니 다. 본 고 는 독자 와 함께 SQL 데이터 베이스 와 관련 된 다른 구멍 을 연구 하고 싶 습 니 다. 그 위 해 는 SQL 주입 과 막상막하 이지 만 흔 하지 않 습 니 다.그 다음 에 저 는 독자 에 게 이런 공격 기법 과 해당 하 는 방어 전략 을 상세 하 게 보 여 드 리 겠 습 니 다.
SQL 주입 공격
배경 설명
최근 에 저 는 재 미 있 는 코드 세 션 을 만 났 습 니 다. 개발 자 는 데이터 뱅 크 의 안전 한 접근 을 확보 하기 위해 여러 가지 방법 을 시도 해 보 았 습 니 다.새 사용자 가 등록 을 시도 할 때 다음 코드 를 실행 합 니 다.
  <?php
// Checking whether a user with the same username exists
$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$query = "SELECT *
          FROM users
          WHERE username='$username'";
$res = mysql_query($query, $database);
if($res) {
  if(mysql_num_rows($res) > 0) {
    // User exists, exit gracefully
    .
    .
  }
  else {
    // If not, only then insert a new entry
    $query = "INSERT INTO users(username, password)
              VALUES ('$username','$password')";
    .
    .
  }
}

  <?php
$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$query = "SELECT username FROM users
          WHERE username='$username'
              AND password='$password' ";
$res = mysql_query($query, $database);
if($res) {
  if(mysql_num_rows($res) > 0){
      $row = mysql_fetch_assoc($res);
      return $row['username'];
  }
}
return Null;

:

  • ? —

  • (’) ? —

, !

, 。

  1. SQL , 。 “vampire” “vampire ”, ( WHERE INSERT ) , “vampire” 。

        SELECT * FROM users WHERE username='vampire     ';
    

    , LIKE 。 , , “ ” 。 ,SQL , 。

  2. INSERT ,SQL varchar(n) 。 , “n” , “n” 。 “5” , “vampire” , 5 , “vampi”。

  3. , 。

      vampire@linux:~$ mysql -u root -p
    mysql> CREATE DATABASE testing;
    Query OK, 1 row affected (0.03 sec)
    mysql> USE testing;
    Database changed
    

    users, username password , 25 。 , username “vampire”, password “my_password”。

      mysql> CREATE TABLE users (
        ->   username varchar(25),
        ->   password varchar(25)
        -> );
    Query OK, 0 rows affected (0.09 sec)
    mysql> INSERT INTO users
        -> VALUES('vampire', 'my_password');
    Query OK, 1 row affected (0.11 sec)
    mysql> SELECT * FROM users;
    +----------+-------------+
    | username | password    |
    +----------+-------------+
    | vampire  | my_password |
    +----------+-------------+
    1 row in set (0.00 sec)
    

    , :

      mysql> SELECT * FROM users
        -> WHERE username='vampire       ';
    +----------+-------------+
    | username | password    |
    +----------+-------------+
    | vampire  | my_password |
    +----------+-------------+
    1 row in set (0.00 sec)
    

    PHP 。 ( “vampire”), “vampire[ ]1” 。 , 25 vampire , 。

      mysql> SELECT * FROM users
        -> WHERE username='vampire                   1';
    Empty set (0.00 sec)
    

    , SELECT ,SQL 25 。 , , 。 , INSERT , 25 。

      mysql>   INSERT INTO users(username, password)
        -> VALUES ('vampire                   1', 'random_pass');
    Query OK, 1 row affected, 1 warning (0.05 sec)
    mysql> SELECT * FROM users
        -> WHERE username='vampire';
    +---------------------------+-------------+
    | username                  | password    |
    +---------------------------+-------------+
    | vampire                   | my_password |
    | vampire                   | random_pass |
    +---------------------------+-------------+
    2 rows in set (0.00 sec)
    

    , “vampire” , 。 , “vampire” 18 。 , “vampire” “random_pass” , SELECT , 。 , 。 MySQL SQLite 。 。

    , , 。 :

    1. UNIQUE 。 , , 。 ’username’ UNIQUE , 。 , INSERT 。

    2. ’id’ 。 id

    3. , ( )

    * : dhavalkapil,FB , FreeBuf(FreeBuf.COM)

좋은 웹페이지 즐겨찾기