mysql sql宽字节注入_SQL注入--宽字节注入

PHP测试代码:

// 面向对象写法

$id=addslashes($_GET[‘id’]); //获取id并转义预定义字符

// /$id=$_GET[‘id’];

$mysqli=new mysqli(‘localhost’,’root’,’root’,’test’); //连接数据库 指定数据库

if ($mysqli->connect_errno) { //判断错误信息

die(‘Connect Eroor:’).$mysqli->connect_error(); //断开连接 返回错误

}else {

if ($id) {

$sql=”SELECT * FROM mysqli_test WHERE id=’$id'”; //查询语句

echo $sql;

$mysqli->query(‘set names gbk’);

$result=$mysqli->query($sql); //执行一个查询

//var_dump($result);

$date=$result->fetch_assoc(); //获得一个结果集

//var_dump($date);

echo “
username:”.$date[‘username’]; //打印输出

echo “
password:”.$date[‘password’];

}else {

echo “Error:ID NULL”;

}

}

?>

// 面向过程写法

// $con=mysql_connect(‘localhost’,’root’,’root’) or die(‘Connect Error:’.mysql_error()); //连接数据库

// mysql_select_db(‘test’,$con);//设置数据库

// $id=addslashes($_GET[‘id’]);

// $sql=”SELECT * FROM mysqli_test WHERE id=’$id'”;

// echo $sql;

// $result=mysql_query($sql);

// $date=mysql_fetch_assoc($result);

// echo “
username:”.$date[‘username’];

// echo “
password:”.$date[‘password’];

// //var_dump($date);

?>

当PHP开启magic_quotes_gpc   (魔术引号),或者使用addslashes、mysql_real_escape_string等函数进行过滤时,如果查询语句中存在单引号,我们尝试闭合单引号就会被过滤掉,如图,通过添加\(转义符)将单引号转义

image12-1-300x111.png

这种形式下,如果数据库使用的是GB2312、GBK、GB18030等宽字节的编码时,就会造成宽字节注入

当我们输入%df’时经过addslashes转义变成 %dF%5C%27 在通过GBK编码后变成 運’

在这里我们发现他多出来了一个单引号正好闭合了我们查询语句中的单引号

构造语句:http://127.0.0.1/sqltest.php?id=1%df’and 1=2 union select 1,user(),database() — a(这里要注意 在mysql注释符后边要加一个空格符,由于浏览器在会删去url末尾中的空格符 所以我们在后边加一个字符串 中间加个空格)

image21-300x251.png

修复:

mysql_real_escape_string转义

参数化查询(预编译)

pdo查询

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值