【PHP代码审计】SQL注入审计(一)
【PHP代码审计】GET型SQL注入审计
一、seay源代码审计系统
先看下seay源代码审计系统怎么说
只给了一个可能存在的任意文件写入漏洞,并没有给sql 相关漏洞,这是因为seay审计系统对有引号包含的sql 语句是不会做出嫌疑的。但如果是未有引号的第二关,则会爆出漏洞
继续往下,看第一关的文件写入内容
那这个地方确实存在任意文件写入,但是写入的文件类型是写死的,因此,即便写入webshell,也无法直接的getshell,需要结合其他的如解析漏洞、文件包含达到getshell;当然,我们的重点不在这里,后面也会忽略这里。
二、GET型SQL注入审计
审源代码
很明显,在拼接SQL语句之前,没有对输入的参数$id
做过滤,也没有对单双引号做过滤,导致SQL语句拼接,造成注入。
三、加固操作
1、PHP5.4版本以下
除了手工添加过滤之外,可以开启全局配置magic_quotes_gpc
当开启之后,会自动将GET、POST、COOKIE变量中的单引号、双引号、反斜杠以及空字符(NULL)的前面再加上一个反斜杠
前后对比,一样的SQL语句:
在这种情况下,是不存在SQL注入的,当然,如果这里是数字型的话,还是会存在漏洞,因为数字型不需要引号。比如第二关的情况,对比如下:
但此时也是会存在其他漏洞,如下:
- 使用的GBK编码,也还是会存在漏洞,也就是宽字节注入,那么留在后面讲解这个。
- 在PHP5 中该设置并不会过滤$_SERVER变量,导致很多类似client-ip、referer 一类的漏洞依然能够利用
2、PHP5.4以上
1、方法一:addslashes函数
因为上面的magic_quotes_gpc
配置在PHP 5.4之后被取消,5.4之后的配置文件是没有这个选项的,因此需要手动添加过滤。其中addslashes
函数是专门用于转义的函数,不仅在SQL注入,在XSS中也经常的会遇到这个函数。如下:
1 | $id=$_GET['id']; |
那么,将会阻止引号的带入,从而有效的防御SQL注入
2、方法二:mysqli_real_escape_string 函数
另外,在SQL查询中,也会经常性的遇到mysqli_real_escape_string
函数,是专门用于SQL查询中进行转义的函数,防御SQL注入也是非常有效,用法跟magic_quotes_gpc 几乎一样,只是多了一个数据库连接变量
1 | $id=$_GET['id']; |
3、预编译
这个大家肯定耳熟能详了,这里就简单的演示下写法,不具体展开
1 | $stmt = $con1->prepare("SELECT * FROM users WHERE id=? LIMIT 0,1"); |
当然这样子已经改变了原来的写法