SQL注入8之其他类型注入 – 作者:iamYit

免责声明

该文章仅用于信息防御技术的交流和学习,请勿用于其他用途; 在未得到网站授权前提下,禁止对政府、事业单位、企业或其他单位网站及系统进行渗透测试;技术是把双刃剑,请遵纪守法,做一名合格的白帽子安全专家,为国家的网络安全事业做出贡献

其他注入类型

二次注入

什么是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程序会对前端进行编码的数据进行解码操作。

二次编码注入

image-20210521200506995

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

image-20210521201059581

宽字节注入

需要清楚内容:

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

1)ASCII

2)Unicode

3)GBK

4)GB2312

5)UTF8MySQL中的字符集和URL编码?

什么是字符编码?

原因:计算机中的一切计算都是用二进制进行的,早期操作计算机需要学会二进制,学习和操作成本比较大,为了更容易的操作计算机,专家们想将人们容易理解的数字、字符、常用符号等引入计算机,这就需要设置一个固定的二进制来代表这些字符;​

需求:具体用哪个二进制表示哪些符号,当然每个团体都可以约定自己的一套标准,这个标准就叫字符编码。​

标准:如果大家想要互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是最早美国有关的标准化组织就出台了现在的ASCII编码(美国标准信息交换码),统一规定了上述常用符号用哪个二进制数来表示。

什么是字符编码集?

1、什么是字符编码集?

字符编码集(简称字符集),是各种符号(文字)与计算机二进制码之间对应关系的映射表

2、目前主流常见的字符编码是哪些?

1)ASCII
2)Unicode
3)GBK
4)GB2312
5)UTF8

常用编码介绍-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的转换。

MySQL中的编码规则

image-20210521205726468

image-20210521205807614

宽字节注入原理

注入原理

一个GBK汉字占两个字节,每个字节有自己的取值范围,如果设置GBK编码后,遇到连续两个字节,都符合GBK取值范围,会自动解析为一个汉字。​Addslashes函数防止sql注入,将传入参数值进行转义。例如将 ‘ 转义为 \ ‘,这样我们在注入的时候闭合单引号就会变成id=1 ’1\‘这样会导致闭合失败从而注入失败。

绕过方式

输入%df%27,本来会转义%27\’ ,但\遇上%df相当与%5c和%df相遇,两者会合起来被解析成一个汉字(運),这样变成id= ‘1運’,在mysql中效果等同于id= ‘1’,因而成功绕过。

image-20210521211127564

宽字节注入防御

addslashes()函数转义SQL语句中使用的字符串中的特殊字符。

1)单引号(‘)

2)双引号(“)

3)反斜杆(\)

mysql_real_escape_string()函数转义SQL语句中使用的字符串中的特殊字符。

下列字符受影响:

1)\x00

2)\n

3)\r

4)\

5)’

6)”

7)\x1a

(1)使用mysql_set_charset(GBK)指定字符集

(2)使用mysql_real_escape_string进行转义原理是,mysql_real_escape_string与addslashes的不同之处在于其会考虑当前设置的字符集,不会出现前面e5和5c拼接为一个宽字节的问题,但是这个“当前字符集”如何确定呢?就是使用mysql_set_charset进行指定。

上述两个条件是“与”运算的关系,少一条都不行。

堆叠注入

堆叠注入概念:在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,这样配置会引发编码转换从而导致的注入漏洞;

编码注入防御

1、从外部提交数据库要对数据校验,过滤。

2、对于使用gbk编码,使用mysql_set_sharset(‘gbk’)设置编码,然后使用mysql_real_escape_string()函数被参数过滤

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

JSON注入

什么是JSON?

JSON(JavaScript Object Notaton,JS对象简谱)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会指定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率。

什么是JSON注入?

JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证,过滤,如果应用程序使用未经验证的输入构造JSON,则可以更改JSON数据的语义,在对应理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析JSON数据是抛出异常

DNSLog注入

为什么要进行dnslog注入?

一般情况下,在我们无法通过联合查询直接获取数据的情况下,我们只能通过盲注,来一步步的获取数据,但是,使用盲注,手工测试是需要花费大量的时间的,可能会想到使用sqlmap直接去跑出数据,但在实际测试中,使用sqlmap跑盲注,有很大的几率,网站把ip封掉,这就影响了我们的测试进度,也许你也可以使用代理池​这个时候可以尝试利用DNSlog快速注入,可以实现快速实现注入效果(面试的时候问该问题比较多)。

什么是DNSlog

DNSlog就是日志,如何利用DNSlog进行注入并回显信息呢,就需要了解多级域名的概念。域名分级于域名解析过程(DNS)​因特网采用层次数状结构命名方法。域是名字空间中一个可被管理的划分(按机构组织划分),域可被划分为子域,子域可在被划分,即形成了顶级域名,二级域名,三级域名等,用点隔开。​如:tieba.baidu.com​它由三个标号组成,com即为顶级域名,baidu为二级域名,tieba即为三级域名,且域名不区分大小写

需要申请一个域名,如dnslog.cn​然后查询其子域名是,如security.dnslog.cn,查询域名服务器的时候,会记录本次查询的值,无论查询是否成功,这个过程日志会被记录下来,利用这个特征把要查询的数据库内容拼接到一级域名之前形成二级或者三级域名。​

通常用在哪些地方 推荐DNSlog平台
1、SQL注入中的盲注 http://www.dnslog.cn
2、无回显的命令执行 http://admin.dnslog.link
3、无回显的SSRF http://ceye.io

前提条件

secure_file_priv

dns带外查询属于MySQL注入,在MySQL中有个系统属性

secure_file_priv特性,有三种状态
》secure_file_priv为null表示不允许导入导出
》secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
》secure_file_priv没有设置时,则表示没有任何限制

LOAD_FILE()函数读取一个文件并将其内容作为字符串返回语法为:load_file(file_name),其中file_name是文件的完整路径此函数使用需要满足的条件文件必须位于服务器主机上,必须具有该FILE权限才能读取该文件,拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关,文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节。

UNC路径

什么是UNC路径?

UNC路径就是类似\\softer这样的形式的网络路径,它符合\\servername\sharename 格式,其中servername是服务器名,sharename是共享资源的名称。

目录或文件的UNC名称可以包括共享名称下的目录路径,格式为:\\ servername\sharename\directory\filename例如把自己电脑的文件共享,你会获得如下路径,这就是UNC路径image-20210521224339705

dnslog注入原理

image-20210521224523120

LDAP注入

概念:

LDAP 全英文:Lightweight Directory Access Protocol,翻译过来就是轻量级的目录访问协议。其实就是访问目录,浏览目录。有很多企业储存一些数据信息,例如部门信息,部门里的成员信息,公式的可用设备信息等,这些信息单独放在类似于网站的那种数据库中的话,会显得有点大材小用,而把它们放在目录中,文本中最合适,好比在文档中搜索指定的内容,在目录中搜索指定的文件一样。​LDAP也有自己指定的语法,也可理解为它是一个存储信息的数据库,为了搜索方便,很多网站提供了查询的接口,和普通的搜索框无异,对于指定的搜索内容,在没有严格过滤的情况下,便可以造成LDAP注入。​简单来说,可以理解为LDAP是某种搜索协议,就像我们熟知的数据库一样,我们利用SQL语句进行查询数据库中的数据。而LDAP也有一套自己的查询语句来进行查询

LDAP语法

了解LDAP语法之前,应该先了解下它的目录树结构,LDAP目录是以树状的层次结构来存储数据的,如下图所示image-20210524192221553

dn表示一条记录所处的位置,dc表示一条记录所属的区域,ou代表一条记录所属的组织,cn表示一条记录的名字,这些理解起来也很容易,LDAP就好比我们程序用的关系型数据库,关系型数据库我们一般用数据库名称、表名、行来定位一条数据记录,而LDAP首先要说明是哪一颗树(dc),然后是从树根搭到目标所经过的所有分叉(ou)最后就是目标的名字(cn)。

LDAP语法,也就是用指定的语法在LDAP目录结构中查找指定的数据

···································

LDAP注入防御

1、LDAP注入的防御跟SQL注入的防御其实差不多,主要就是要把用户输入的东西过滤好,基本就可以防御了。image-20210524193500432

2、客户端发送给服务器的参数中包含了特殊字符,服务器代码端需要对变量进行检查和净化处理。圆括号、星号、逻辑操作符、关系运操作符在应用层都必须过滤。无论什么时候,只要可能,构造LDAP搜索过滤器的值在发送给LDAP服务器查询之前都要用应用层有效地值列表来核。

来源:freebuf.com 2021-05-29 19:47:17 by: iamYit

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论