SQL注入之其他注入类型

什么是URL编码?

URL编码是一种浏览器用来打包表单输入的编码规则。
        任何特殊的字符(不是简单的七位ASCII,如汉字和一些字符)将以百分符%用十六进制编码,当然也包括像 = ,&; 等符号,和 % 这些特殊的字符,其实URL编码就是一个字符ASCII码的十六进制,需要在前面加上‘%’。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。汉字看“胡”的ascii码是-17670,十六进制是BAFA,URL编码是“%BA%FA”。
        浏览器会对请求的URL中非ASCII码字符进行编码。这里不是指对整个URL进行编码,而是仅仅对非ASCII码字符部分进行编码。

为什么要进行URL编码?

通常如果一样东西需要编码,说明这样东西并不适合传输。对于URL来说,编码主要是为了避免引发歧义与混乱。 ​ 例如,URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/?name=abc&123如果你的value字符串中包含了=或者&,那么势必会造成接收url服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

URL传输过程中的编码问题

HTTP请求过程经历的几个环节: 浏览器【get/post】1=====>服务器2=====>浏览器显示3

1 浏览器会把URL经过编码后发送给服务器,不同的浏览器对URL的编码规则不同。对于GET方式提交的数据,浏览器会自动进行URL编码;对于POST方式提交的数据,其编码方式可以由开发者指定。 2 服务器根据其自身的配置文件对URL进行编码(解码成Unicode),然后将显示内容编码。 3 浏览器按照指定的编码显示该网页。此外,在客户端也就是浏览器上运行的前端程序也会根据web服务的需要对要传输的数据进行一些编码操作,而在服务端除了服务器中间件会自动对URL进行解码,后端的web程序会对前端进行编码的数据进行解码操作。

二次编码注入

后端程序的编码函数,如urldecode()等,与PHP本身处理编码时,两者配合失误,使得攻击者可以构造数据消灭 。

宽字节注入

需要清楚内容:

什么是字符编码? 什么是字符集? 常见字符集有哪些?

1)ASCII 2)Unicode 3)GBK 4)GB2312 5)UTF8 MySQL中的字符集和URL编码?

什么是字符编码?

原因:计算机中的一切计算都是用二进制进行的,早期操作计算机需要学会二进制,学习和操作成本比较大,为了更容易的操作计算机,专家们想将人们容易理解的数字、字符、常用符号等引入计算机,这就需要设置一个固定的二进制来代表这些字符。
需求:具体用哪个二进制表示哪些符号,当然每个团体都可以约定自己的一套标准,这个标准就叫字符编码。 ​
标准:如果大家想要互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是最早美国有关的标准化组织就出台了现在的ASCII编码(美国标准信息交换码),统一规定了上述常用符号用哪个二进制数来表示。

常用编码介绍-ASCII编码

ASCII码全称是“美国信息交换标准代码”,是一套用于显示英语和西欧语种的编码体系。它包含常用的英文字母、数字及一些特殊字符和控制符等共计128个字符,这128个符号只用了一个字节的后面7位,最前面的以为统一规定为0。是最通用的单子编码系统,即一个字符对应一个唯一的ASCII码。
​随着个人计算机在全球的普及,很明显单字节的字符编码根本不能满足各个国家、各个语种的编码和显示需求,这个时候就需要针对不同语种定制不同的编码规范。BGK、GB2312以及UTF-8就是在这种条件下诞生的。

常用编码介绍-Unicode编码

诉求:世界上有多种编码方法,同一个二进制数字可以被解释成不同的符号。因此,在打开一个文本文件的时候,就必须知道它的编码方式,用错误的编码方式打开,就会出现乱码。
​假如,有一种编码,将世界上所有的符号都纳入其中,形成一种集合,每一种符号都给予独一无二的编码,那么乱码问题就不会存在了。因此,产生了Unicode编码,这是一种所有符号的编码。Unicode显然是一个巨大的集合,现在的规模可以容纳100多万个符号,没个符号的编码都不一样。

缺陷:在Unicode庞大的字符集的优势下,还存在一个问题,比如一个汉字,“严”的Unicode是十六进制4e25,转成二进制足足有15位,也就是,这个符号需要2个字节,表示其他字符还存在3个字节或者更多。计算机怎么区别三个字节表示的是同一个符号而不是分开表示三个呢?如果Unicode统一规定,每个符号用3个字节表示,但是某些字母显然不需要3个,那么就浪费了空间,文本文件大小超出了很多,这显然是不合理的,知道UTF8字符编码出现了。

常见编码介绍-UTF8编码

UTF8(8-bit Unicode Transformation Format)随着互联网的发展,强烈要求出现一种统一的编码方式。UTF8是Unicode的实现方式之一,也是最为常见的实现方式。UTF8的最大特点是,它是一种变长编码,可以是用1-4个字节表示一个符号,根据不同的符号来变化字节长度,用在网页上可以统一页面显示中文简体繁体及其他语言。
UTF8编码规则只有两条:
​    1)对于单字节的符号,字节的第一位设为0,后面的7位为这个符号的Unicode码。对于英文字母,UTF8编码和ASCII编码是相同的。
    2)对于非单字节(假设字节长度为N)的符号,第一个字节的前N位都设为1,第N+1设为0,后面字节的前2位一律设为10,剩下的没有提及的二进制,全部为这个符号的Unicode码。
UTF8规定1个英文字符用1个字节表示,1个中文字符用3个字节表示**

常见编码介绍-GBK编码

BGK2312编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆和新加坡等地也采用此编码,1980年发布,支持汉字6763个和非汉字图形字符682个,每个汉字及符号以两个字节来表示。
GBK编码于1995年12月1日制定。采用两个字节编码方案,共收录汉字和图形符号21886个,它几乎完美支持汉字,因此经常会遇见GBK与Unicode的转换。

宽字节注入原理

注入原理:一个GBK汉字占两个字节,每个字节有自己的取值范围,如果设置GBK编码后,遇到连续两个字节,都符合GBK取值范围,会自动解析为一个汉字。 ​ Addslashes函数防止sql注入,将传入参数值进行转义。例如将 ' 转义为 \ ',这样我们在注入的时候闭合单引号就会变成id=1 ’1\‘这样会导致闭合失败从而注入失败。
绕过方式:输入%df%27,本来会转义%27\’ ,但\遇上%df相当与%5c和%df相遇,两者会合起来被解析成一个汉字(運),这样变成id= ‘1運’,在mysql中效果等同于id= ‘1’,因而成功绕过。

堆叠注入

堆叠注入概念:在SQL中,分号(;)是用来表示一条sql语句的结束,试想一下我们在;结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就构造了堆叠注入。
和联合注入区别:而 union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
利用:存在堆叠注入时可直接在?id=-1;后面直接插入sql语句
例子:?id=-1;insert into users(id,username,password) values(66,'test','test')--+

编码注入

什么是编码注入:当在和数据库输入进行交互的时候,没有对用户输入的字符进行安全校验容易产生SQL注入,而编码是数据库中的编码方式,当进行操作之前,会对输入的内容进行一些编码处理。而做编码的函数也是存在问题的,通过输入转码函数不兼容的特殊字符,可以导致输出的字符变成有害的数据。
常见的编码有url encode,base64,php serialize,unicode escape,html encode等等。
​例如说PHP的编码为UTF-8而MySQL的编码设置为了SET NAMES ‘gbk’ 或是SET character_set_client = gbk,这样配置会引发编码转换从而导致的注入漏洞。

JSON注入

什么是JSON?JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会指定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。
什么是JSON注入?JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证,过滤,如果应用程序使用未经验证的输入构造JSON,则可以更改JSON数据的语义,在对应理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析JSON数据是抛出异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值