靶场科普 | SQL注入之编码注入

发表时间:2022-08-01 11:24

本文由“东塔网络安全学院”总结归纳


靶场介绍:

SQL注入之编码注入

今天,给大家介绍一下“东塔攻防世界”其中的一个靶场:“SQL注入之编码注入”。


一、实验介绍

1.SQL注入

SQL注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据。

2.编码注入

程序在进行一些操作之前,经常会进行一些编码处理,而做编码的函数也是存在问题的,通过输入转码函数不兼容的特殊字符,可以导致输出的字符变成有害的数据。常见的编码注入有mysql 宽字节以及urldecode/rawurldecode 函数导致的。


1) 宽字节注入
在进行php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致一个编码转换的注入问题,也就是熟悉的宽字节注入,当存在宽字节注入时,%df 可把程序中过滤的\ (%5c)吃掉。例如:/1.php?id=1存在宽字节注入时,则: /1.php?id=-1’and 1=1 单引号会被转义成 \’但是提交:/1.php?id=-1%df’and 1=1 时,%df和\ 反斜杠(%5c) 组合 %df%5c 编码后是一个汉字,这时候单引号依然存在,则会闭合成功,形成注入漏洞。
形成原因:由于设置Mysql 服务器客户端数据编码是GBK ,set character_set_client=gbk执行语句时进行GBK 转码时形成攻击,通常都设置方法是:SET NAMES ‘gbk’,等同于:
SET
character_set_connection=’gbk’,
character_set_results=’gbk’,
character_set_client=’gbk’

此编码设计也存在漏洞,建议使用官方给的mysql_set_charset方式来设置编码,在调用SET NAMES 之后还记录了当前的编码,留着给后边mysql_real_escape_string处理字符时使用,后边合理的使用mysql_real_escape_string还是可以防御此漏洞的。

2) 二次urldecode 注入

现在通常Web应用程序大多都会进行参数过滤,来防止注入。如果某处使用了urldecode或者 rawurldecode 函数,则会导致二次解码生成单引号二引发注入,即二次注入。


二、实验目的

1.掌握sql注入的原理以及利用过程

2.掌握编码的原理以及注入的方式


三、实验步骤

按照解题思路进行实践


四、防御方法

1.在执行查询之前先执行SET NAMES ‘gbk’,character_set_client=binary 设置character_set_client 为 binary

2.使用mysql_set_charset(‘gbk’) 设置编码,然后使用mysql_real_escape_string() 函数被参数过滤

3.使用pdo方式,在Php 5.3.6及以下版本中需要设置setAttribute(PDO:ATTR_EMULATE_PREPARES,false); 来禁用preparcd statements 的仿真效果。

4.Web应用程序通常使用addslashes() 、mysql_real_escape_string()、mysql_escape_string()函数或者开启GPC来防止注入,也就是给单引号(‘’)、双引号(“”)、反斜杠(\)和NULL加上反斜杠转义。