mysql危险吗_mysql中的0引发的安全风险_MySQL

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

1405L93U2A60-2BF.jpg

1405L93UA620-3a96.jpg

MSSQL中

1405L93V0-422V.jpg

1405L93V31250-56227.jpg

最终我们只能在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();

}

}

});

}

}

);

});

});

script>

我们再来看看 mysql_driver.php 是如何定义的

function _execute($sql)

{ //echo $sql;输出sql 语句测试

$sql = $this->_prep_query($sql);

return @mysql_query($sql, $this->conn_id);

}

默认执行的是如下语句

1405L93VA620-64111.jpg

很明显,直接执行了,基于框架的程序容易造成此类风险。

woyigui同学说的不加引号会报错,这个应该是个合理的解释吧。

最后再次感谢亲爱的黑哥。bitsCN.com

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值