1.数据库设置宽字节

数据库配置文件 config.php

  1. <?php
  2. $address='localhost';
  3. $user='root';
  4. $pass='root';
  5. $dbname='test';
  6. $con = mysqli_connect($address,$user,$pass,$dbname);
  7. if(!$con){
  8. echo mysqli_connect_error();
  9. }
  10. mysqli_query($con,"SET NAMES 'gbk'");
  11. ?>

存在漏洞的文件

  1. <?php
  2. include_once 'config.php';
  3. $username=$_GET['username'];
  4. $username=addslashes($username);
  5. if (empty($username)) {
  6. exit();
  7. }
  8. $sql="SELECT say from admin where name='$username'";
  9. $query=mysqli_query($con,$sql);
  10. $result=mysqli_fetch_array($query);
  11. echo '他说他的年龄是:'.$result[0];
  12. echo '<br>';
  13. echo $sql;
  14. echo mysqli_error($con);
  15. ?>

一般测 测不出注入
image.png
但是数据库设置了GBK 可以逃逸 因为addslashes函数 给单引号前面添加一个斜杠 \ (%5c)
%df%5c 在一起就变成了个汉字
image.png
image.png
导致逃逸 拼接了SQL语句造成了SQL注入。

类似存在漏洞的配置还有:
SET NAMES
character_set_clinet=gbk
mysql_set_character(‘gbk’)

2.urldecode 编码 导致SQL注入

  1. <?php
  2. include_once 'config.php';
  3. $username=$_GET['username'];
  4. $username=addslashes($username);
  5. if (empty($username)) {
  6. exit();
  7. }
  8. $username=urldecode($username);
  9. $sql="SELECT say from admin where name='$username'";
  10. $query=mysqli_query($con,$sql);
  11. $result=mysqli_fetch_array($query);
  12. echo '他说他的年龄是:'.$result[0];
  13. echo '<br>';
  14. echo $sql;
  15. echo mysqli_error($con);
  16. ?>

可以看到username变量是经过 addslashes 过滤 不会存在SQL注入 但是下面经过一次url解码 导致了用户输入的内容不在addslashes函数处理范围内 导致拼接存在了SQL注入 通常代码审计中会出现多半是二次SQL注入。 image.png