page counter next up previous contents
Next: Let's Encrypt Up: SQL Injection 注入 Previous: SQL injection 實例   Contents   DYWANG_HOME

實機操作練習題

  1. 前置處理
    1. 遠端登入 kvm6 虛擬機。
    2. 以 root 身份登入 mysql。
    3. 在資料庫 dbi 進行以下資料表的處理,如果資料庫 dbi 不存在,請自行產生。
  2. Sql injection 查詢
    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 範例程式,其中 ........ 依要求填入 mysql 語法。
      <?php
      $dbhost = 'localhost:3306';
      $dbuser = 'root';
      $dbpass = '123qwe';
      $conn = mysql_connect($dbhost, $dbuser, $dbpass) or mysql_error().PHP_EOL;
      $sql = "select ........ ;" ;
      mysql_select_db('dbi');
      $retval = mysql_query( $sql, $conn );
      while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
              echo "{$row[0]}\t{$row[1]}";
      }
      ?>
      
    4. 使用 GET 變數$_GET['plang'] 由網址加問號取得內容,如以下範例變數 plang=python。
      http://kvm6.deyu.wang/sqlinj1.php?plang='python'
      
    5. sqlinj1a.php:刻意不用單引號或雙引號括起查詢變數 $_GET['plang'],使得其可以進行 sql injection。
    6. sqlinj1b.php:承上題 sqlinj1a.php,將查詢變數 $_GET['plang'] 以單引號括起來,以避免 sql injection。
  3. 限制輸入字元
    1. pmatch1a.php:承上題 sqlinj1a.php,先使用 preg_match 函數限制變數 $_GET['plang'] 只能非空白字元,否則印出 "Not Match"。
    2. pmatch1b.php:承上題 sqlinj1a.php,先使用 preg_match 函數限制變數 $_GET['plang'] 必須是小寫英文字母,否則印出 "Not Match"。
    3. pmatch1c.php:承上題 sqlinj1b.php,先使用 preg_match 函數限制變數 $_GET['plang'] 必須是 1 到 6 個小寫英文字母,否則印出 "Not Match"。
  4. addslashes
    1. slashe1.php:承上題 sqlinj1a.php,先使用 addslashes 函數將變數 $_GET['plang'] 中的單引號、雙引號、倒斜線等符號,加上倒斜線跳脫其功能,並使用 echo 在 mysql 查詢命令之前印出變數 $_GET['plang'] 內容。
    2. 修改 slashe1.php 讓其對於沒加單引號的查詢,可以正常工作。


De-Yu Wang 2020-05-19