1.数据库设置宽字节
数据库配置文件 config.php
<?php$address='localhost';$user='root';$pass='root';$dbname='test';$con = mysqli_connect($address,$user,$pass,$dbname);if(!$con){echo mysqli_connect_error();}mysqli_query($con,"SET NAMES 'gbk'");?>
存在漏洞的文件
<?phpinclude_once 'config.php';$username=$_GET['username'];$username=addslashes($username);if (empty($username)) {exit();}$sql="SELECT say from admin where name='$username'";$query=mysqli_query($con,$sql);$result=mysqli_fetch_array($query);echo '他说他的年龄是:'.$result[0];echo '<br>';echo $sql;echo mysqli_error($con);?>
一般测 测不出注入
但是数据库设置了GBK 可以逃逸 因为addslashes函数 给单引号前面添加一个斜杠 \ (%5c)
%df%5c 在一起就变成了个汉字

导致逃逸 拼接了SQL语句造成了SQL注入。
类似存在漏洞的配置还有:
SET NAMES
character_set_clinet=gbk
mysql_set_character(‘gbk’)
2.urldecode 编码 导致SQL注入
<?phpinclude_once 'config.php';$username=$_GET['username'];$username=addslashes($username);if (empty($username)) {exit();}$username=urldecode($username);$sql="SELECT say from admin where name='$username'";$query=mysqli_query($con,$sql);$result=mysqli_fetch_array($query);echo '他说他的年龄是:'.$result[0];echo '<br>';echo $sql;echo mysqli_error($con);?>
可以看到username变量是经过 addslashes 过滤 不会存在SQL注入 但是下面经过一次url解码 导致了用户输入的内容不在addslashes函数处理范围内 导致拼接存在了SQL注入 通常代码审计中会出现多半是二次SQL注入。 
