next up previous contents
Next: Export 匯出 Up: SQL Injection 注入 Previous: 限制輸入字元   Contents   DYWANG_HOME

實機操作練習題

  1. 前置處理
    1. 遠端登入 kvm8 虛擬機。
    2. 以 root 身份登入 mariadb。
    3. 在資料庫 dbi 進行以下資料表的處理,如果資料庫 dbi 不存在,請自行產生。
  2. 建立資料表
    1. 資料表 sqlinj1,包含下列欄位,設定 iid 為 primary key。
      1. iid int not null auto_increment,
      2. plang varchar(40) not null
    2. 資料表 sqlinj1 依序新增 c,ruby,perl,python 四筆資料。
  3. PHP 程式範例
    1. 使用以下 php 範例程式,其中 ........ 依要求填入 mysql 語法。
      <?php
      $dbhost = 'localhost:3306';
      $dbuser = 'root';
      $dbpass = '123qwe';
      $conn = mysqli_connect($dbhost, $dbuser, $dbpass) 
      	or die(mysqli_connect_error().PHP_EOL);
      mysqli_select_db( $conn, 'dbi' )
      	or die('Error: '.mysqli_error($conn).PHP_EOL);
      $sql = "SELECT * FROM ......";
      $retval = mysqli_query( $conn,$sql )
      	or die('Error: '.mysqli_error($conn).PHP_EOL);
      while($row = mysqli_fetch_array($retval, MYSQLI_NUM)) {
          echo "{$row[0]}\t{$row[1]}\n";
      }
      mysqli_free_result($retval);
      mysqli_close($conn); 
      ?>
      
    2. 使用 GET 變數$_GET['plang'] 由網址加問號取得內容,如以下範例變數 plang=python。
      http://kvm8.deyu.wang/sqlinj1.php?plang='python'
      
    3. 測試範例中 python 要不要加雙引號或單引號,要看 php 程式的 mysql 查詢時,變數是否用雙引號或單引號括起來。
  4. 於 /var/www/html/ 目錄下,撰寫以下 PHP 程式:
    1. sqlinj1a.php:刻意不用單引號或雙引號括起查詢變數 $_GET['plang']
    2. sqlinj1b.php:承上題 sqlinj1a.php,將查詢變數 $_GET['plang'] 以單引號括起來。
  5. 於 /var/www/html/ 目錄下,完成以下 curl 做 sql injection 查詢:
    1. sqlinj1a.inj:用 curl 連線 sqlinj1a.php 變數 plang='a' or 1,看看是否可以做 sql injection,查到所有資料,將完整的查詢命命寫入 salinj1a.inj,並設定成可執行,注意變數中的空白要用 %20 取代。
    2. sqlinj1b.inj:用 curl 連線 sqlinj1b.php 變數 plang=a' or 'a'='a,看看是否可以做 sql injection,查到所有資料,將完整的查詢命命寫入 salinj1b.inj,並設定成可執行,注意變數中的空白要用 %20 取代。
  6. addslashes
    1. slashe1.php:承上題 sqlinj1a.php,先使用 addslashes 函式將變數 $_GET['plang'] 中的單引號、雙引號、倒斜線等符號,加上倒斜線跳脫其功能,並使用 echo "$plang\n"mysqli_query 查詢命令之前印出變數 $plang 內容。
    2. 修改 slashe1.php 讓其對於沒加單引號的查詢,可以正常工作。
  7. 限制輸入字元
    1. pmatch1a.php:承上題 sqlinj1a.php,先使用 preg_match 函式限制變數 $_GET['plang'] 只能非空白字元,否則印出 "Not Match"。
    2. pmatch1b.php:承上題 sqlinj1a.php,先使用 preg_match 函式限制變數 $_GET['plang'] 必須是小寫英文字母,否則印出 "Not Match"。
      注意:因為 sqling1a.php 必須自行加雙引號或單引號,所以 preg_match 查詢 pattern 前後也必須加雙引號或單引號。
    3. pmatch1c.php:承上題 sqlinj1b.php,先使用 preg_match 函式限制變數 $_GET['plang'] 必須是 1 到 6 個小寫英文字母,否則印出 "Not Match"。


De-Yu Wang 2020-04-07