SQL注入-基础防御

1.魔术引号

魔术引号(Magic Quote)是一个自动将进入PHP脚本的数据进行转移的过程。

在magic_quotes_gpc=On的情况下,如果输入的数据有:单引号()、双引号(”)、反斜线()与NUL(NULL字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

魔术引号:在php.ini文件内找到

magic_quotes_gpc = on开启
将其改为
magic_quotes_gpc =Off 关闭

我们先将magic_quotes_gpc给改为on来进行测试一下,注意更改完配置之后要将apache和mysql重新给启动一下。接着输入正确的查询语句发现页面报错,根据报错信息可以看到,传递到服务器的路径发生了变化,变成了'\'d:/d.txt\',单引号前加了斜杠,使我们没法正确找到文件的位置

2.内置函数

魔术引号是php中自带的过滤函数,我们同时可以进行一些人为操作进行防御,比如用一些内置函数,不管是用java还是用php语言写的,都是带有一些内置函数可以进行判断,从而进行过滤的目的。 

  • is_int()
  • addslashes()
  • mysql_real_escape_string0
  • mysql_escape_string0
     

我们还是以sqli-less为例,我们要先知道这个网站是get传输,所谓的get型传输指的就是数据是通过url发送到后台的,那么数据传递到后台后,原本程序员在写网页的时候,就是认为url主要就是传输id的,正儿八经传个1,2,3这些,没想到会添加sql语句,下图是less-2的源代码

我们修改一下源代码,做一些数据型的判断,例如修改成,先判断传输的信息是不是个数字,如果是则返回yes,不是则no,这时候就要用到is_int函数。我们将源代码修改成下图,发现网页就无法正常输出

但当我们正常输入id=1时也发现页面无法正常显示,这时候就要考虑网页是否认为这个传参是以int型传输,还是string型进行传输的,我们将源代码增加一条echo gettype($id)判断在页面中的id是什么类型,如下图。发现是一个string型(字符串)。

这时候如果想让页面正常显示,也不想删除过滤,那我们只需要对id这个参数进行强制类型转换,这样页面就能正常显示。

3.自定义关键字

我们如果要查询数据就肯定要执行sql语句,这就意味着语句中肯定包含某些关键字,例如select *from user where id=1中select就是一个关键字,同样的,进行插入时就会有insert,update等,所谓的关键字过滤就是对这些后面的语句进行过滤。

str_replace()函数         下列语句就代表将字符串”Hello world“ 中的”world“ 替换成”shanghai“

<?php
echo str_replace( "world" , "shanghai" , "Hello world ! ");
?>

我们在less-2中往源代码中加入str_replace这个函数,例如我们将select过滤成yr,然后执行简单的查询语句,发现页面报错,查看报错信息,发现是select被过滤成了yr

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,2,3

4.其他安全防护软件

以上这些自带的基础过滤实际上都是挺简单的,用一些特定绕过方式都能进行绕过,说如同虚设也不过,真正有挑战性的是其他这种想WAF,宝塔安全防护软件进行的保护才是比较棘手的,但本章讲的主要是一些基础的防御手段,主要是要清楚防御的思路和流程

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值