程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql中的0引發的安全風險

mysql中的0引發的安全風險

編輯:MySQL綜合教程

menzhi007

mysql的比較運算,黑哥解釋的很清楚,感謝下

http://www.BkJia.com/database/201003/45294.html

當mysql中執行where條件時 0可以作為通配符,來查詢索引出數據。

mysql> select username from users where username=0 limit 1;
+----------+
| username |
+----------+
| admin    |
+----------+
1 row in set

早上又在同學機子上做了oracle和mssql 中的測試

比較不充分,比如應該拿字符串和數字比等等,大家自行測試下吧

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod


MSSQL中



最終我們只能在mysql中測試成功

實例程序中遇到的問題,當直接訪問控制器的的方法,尤其用戶名密碼未提交值,將默認提交“0”,最終將直接導致直接繞過驗證。

users.php Controllers中的代碼

/*修補後首頁登錄框*/
function ajax_login_back() {
   if($this->input->post(username)!="" && $this->input->post(password)!="") {//增加這句判斷是否為空
    echo $this->users_model->verify_user($this->input->post(username),$this->input->post(password));
   } else {
    redirect(articles,refresh);
   }
}
//漏洞代碼
function ajax_login() {
  echo $this->users_model->verify_user($this->input->post(username),$this->input->post(password));//漏洞代碼
}

users_model.php Models中的代碼

public function verify_user($username, $password) {
   $query = $this->db->where(username, $username);//
   //$query = $this->db->where(password is not null);
   $query = $this->db->where(password,$password);
   $query = $this->db->get(users, 1);
  
   if ($query->num_rows() == 1) {
    $row = $query->row_array();
    $data = array(
       uid => $row[uid],
       username => $row[username],
       level => $row[level],
       logged_in => TRUE
      );

    $this->session->set_userdata($data);
    return 1;
   } else {
    return NULL;
   }
}


前台 index.php Views中的代碼

<script type="text/javascript">

$.ui.dialog.defaults.bgiframe = true;

//$.post()方式:
$(document).ready(function () {

$(#loginsubmit).click(function (){
$.post(
   <?php echo site_url(users/ajax_login)?>,
    {
      username:$(#username).val(),
      password:$(#password).val()
    },
    function (data) {
   if(data==1) {
    location.reload();  
   } else {
    $(#dialog).dialog({
     autoOpen: true,
     width: 300,
     buttons: {
      "確定": function() {
       $(this).dialog("close");
       location.reload();
      },
      "取消": function() {
       $(this).dialog("close");
       location.reload();
      }
     }
    });
   }
    }
);
});
});

</script>

我們再來看看 mysql_driver.php 是如何定義的

function _execute($sql)
{ //echo $sql;輸出sql 語句測試
   $sql = $this->_prep_query($sql);
   return @mysql_query($sql, $this->conn_id);
}

默認執行的是如下語句


很明顯,直接執行了,基於框架的程序容易造成此類風險。

woyigui同學說的不加引號會報錯,這個應該是個合理的解釋吧。

最後再次感謝親愛的黑哥。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved