您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

mysql中的0引发的安全风险_MySQL

2024/3/26 5:26:25发布17次查看
bitscn.com
menzhi007
mysql的比较运算,黑哥解释的很清楚,感谢下
http:///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中的代码
$.ui.dialog.defaults.bgiframe = true;
//$.post()方式:
$(document).ready(function () {
$(#loginsubmit).click(function (){
$.post(
   ,
    {
      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();
      }
     }
    });
   }
    }
);
});
});
我们再来看看 mysql_driver.php 是如何定义的
function _execute($sql)
{ //echo $sql;输出sql 语句测试
   $sql = $this->_prep_query($sql);
   return @mysql_query($sql, $this->conn_id);
}
默认执行的是如下语句
很明显,直接执行了,基于框架的程序容易造成此类风险。
woyigui同学说的不加引号会报错,这个应该是个合理的解释吧。
最后再次感谢亲爱的黑哥。
bitscn.com
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product