2025-04-22

menzhi007


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


/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同學說的不加引號會報錯,這個應該是個合理的解釋吧。


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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *