SQL注入--宽字节注入

PHP测试代码:php


<?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 “<br /> username:”.$date[‘username’]; //打印输出     echo “<br /> password:”.$date[‘password’];   }else {     echo “Error:ID NULL”;   } }
?>
<?php

// 面向过程写法 // $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 “<br />username:”.$date[‘username’]; // echo “<br />password:”.$date[‘password’]; // //var_dump($date); ?>

  

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

image12

这种形式下,若是数据库使用的是GB23十二、GBK、GB18030等宽字节的编码时,就会形成宽字节注入sql

 

当咱们输入%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

修复:测试

mysql_real_escape_string转义fetch

参数化查询(预编译)编码

pdo查询url

相关文章
相关标签/搜索