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同學說的不加引號會報錯,這個應該是個合理的解釋吧。
最後再次感謝親愛的黑哥。