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'");
?>
存在漏洞的文件
<?php
include_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注入
<?php
include_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注入。