【PHP代码审计】GET型SQL注入审计

一、seay源代码审计系统

先看下seay源代码审计系统怎么说

image-20240723231808213

只给了一个可能存在的任意文件写入漏洞,并没有给sql 相关漏洞,这是因为seay审计系统对有引号包含的sql 语句是不会做出嫌疑的。但如果是未有引号的第二关,则会爆出漏洞

image-20240723233039769

继续往下,看第一关的文件写入内容

image-20240723232235588

那这个地方确实存在任意文件写入,但是写入的文件类型是写死的,因此,即便写入webshell,也无法直接的getshell,需要结合其他的如解析漏洞、文件包含达到getshell;当然,我们的重点不在这里,后面也会忽略这里。

二、GET型SQL注入审计

审源代码

image-20240723234000503

很明显,在拼接SQL语句之前,没有对输入的参数$id做过滤,也没有对单双引号做过滤,导致SQL语句拼接,造成注入。

三、加固操作

1、PHP5.4版本以下

除了手工添加过滤之外,可以开启全局配置magic_quotes_gpc

image-20240723235248379

当开启之后,会自动将GET、POST、COOKIE变量中的单引号、双引号、反斜杠以及空字符(NULL)的前面再加上一个反斜杠

前后对比,一样的SQL语句:

image-20240723235451003

在这种情况下,是不存在SQL注入的,当然,如果这里是数字型的话,还是会存在漏洞,因为数字型不需要引号。比如第二关的情况,对比如下:

image-20240723235707002

但此时也是会存在其他漏洞,如下:

  1. 使用的GBK编码,也还是会存在漏洞,也就是宽字节注入,那么留在后面讲解这个。
  2. 在PHP5 中该设置并不会过滤$_SERVER变量,导致很多类似client-ip、referer 一类的漏洞依然能够利用

2、PHP5.4以上

1、方法一:addslashes函数

因为上面的magic_quotes_gpc配置在PHP 5.4之后被取消,5.4之后的配置文件是没有这个选项的,因此需要手动添加过滤。其中addslashes函数是专门用于转义的函数,不仅在SQL注入,在XSS中也经常的会遇到这个函数。如下:

1
2
3
$id=$_GET['id'];
$id = addslashes($id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

那么,将会阻止引号的带入,从而有效的防御SQL注入

image-20240724000713694

2、方法二:mysqli_real_escape_string 函数

另外,在SQL查询中,也会经常性的遇到mysqli_real_escape_string函数,是专门用于SQL查询中进行转义的函数,防御SQL注入也是非常有效,用法跟magic_quotes_gpc 几乎一样,只是多了一个数据库连接变量

1
2
3
$id=$_GET['id'];
$id = mysqli_real_escape_string($con1,$id);
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

3、预编译

这个大家肯定耳熟能详了,这里就简单的演示下写法,不具体展开

1
2
3
4
5
$stmt = $con1->prepare("SELECT * FROM users WHERE id=? LIMIT 0,1");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array(MYSQLI_BOTH);

当然这样子已经改变了原来的写法