目录
一、负载均衡
1、环境的搭建
反向代理方式其中比较流行的方式是用 nginx 来做负载均衡。我们先简单的介绍一下 nginx 支持的几种策略:
名称 | 策略 |
轮询(默认) | 按请求顺序逐一分配 |
weight | 根据权重分配 |
ip_hash | 根据客户端IP分配 |
least_conn | 根据连接数分配 |
fair (第三方) | 根据响应时间分配 |
url_hash (第三方) | 根据URL分配 |
注:其中 ip_hash、url_hash 这种能固定访问到某个节点的情况,我们也不讨论,跟单机没啥区别么不是。
1)上传文件
2)加载
3)查看
docker ps -a 查看所有的进程,端口号为18080
2、复现
1)文件 /etc/nginx/conf.d/default.conf 如下:
2)浏览器访问
3)连接测试
连接成功后我们发现IP地址在两台服务器不停的飘逸
3、难点
有四个问题
难点一:我们需要在每一台节点的相同位置都上传相同内容的 WebShell
难点二:我们在执行命令时,无法知道下次的请求交给哪台机器去执行。
难点三:当我们需要上**传一些工具时,麻烦来了。
难点四:由于目标机器不能出外网,想进一步深入,只能使用 reGeorg/HTTPAbs 等 HTTP Tunnel,可在这个场景下,这些 tunnel 脚本全部都失灵了。
解决难点一二三还可以通过反复上传的方式来实现到了难点四直接劝退
难点四的解决方案如下:创建一个脚本,将所有的数据包都能发给「LBSNode 1」这台机器,就如下图所示:
二、 webshell的绕过
在 PHP 5 中 assert() 是一个函数,我们可以通过$f='assert';$f(...);
这样的方法来动态执行任意代码,此时它可以起到替代 eval() 的作用。但是在 PHP 7 中,assert() 不再是函数了,而是变成了一个和 eval() 一样的语言结构,此时便和 eval() 一样不能再作为函数名动态执行代码,所以利用起来稍微复杂一点。
1、异或操作
例:
<?php
echo "A"^"`";
?>
输出结果:
因为代码中对字符"A"和字符"`"进行了异或操作。在PHP中,两个变量进行异或时,先会将字符串转换成ASCII值,再将ASCII值转换成二进制再进行异或,异或完,又将结果从二进制转换成了ASCII值,再将ASCII值转换成字符串。异或操作有时也被用来交换两个变量的值。
2、取反运算绕过
该方法和前面的方法绕过的方法有异曲同工之妙,唯一差异就是,这里使用的是位运算里的 “取反” 运算。利用的是 UTF-8 编码的某个汉字,将其中某个字符取出来,比如'和'{2}
的结果是"\x8c"
,其再取反即可得到字母s
:
echo ~('瞰'{1}); // a
echo ~('和'{2}); // s
echo ~('和'{2}); // s
echo ~('的'{1}); // e
echo ~('半'{1}); // r
echo ~('始'{2}); // t
运行结果如下:
三、扩展
话说做webshell检测的时候,因为要绕过HIDS,常规的一句话木马,大马都基本上会被拦截,不得不去找了一些php提供的”安全函数“(ps,这里我所指的“安全函数”是php的内置的回调函数,因为本身这些方法都是php自提供的,所以还是一定程度上可以绕过的)。
意思就是当我们构造一个双变量马的时候,不能使用1=eval&2=xxx来使用,而只能使1=assert&2=command做为密码连接,或者1=system&2=whoami来执行命令
eval是一个语言构造器,而不是一个函数,不能被可变函数调用;
关于php解释型语言解释:
php是解释型语言,所谓“解释型语言”就是指用这种语言写的程序不会被直接编译为本地机器语言(native machine language),而是会被编译为一种中间形式(代码),很显然这种中间形式不可能直接在CPU上执行(因为CPU只能执行本地机器指令),但是这种中间形式可以在使用本地机器指令(如今大多是使用C语言)编写的软件上执行。
PHP使用主要虚拟机(Zend虚拟机,译注:HHVM也是一种执行PHP代码的虚拟机,但很显然Zend虚拟机还是目前的主流)可以分为两大部分,它们是紧密相连的:
编译栈(compile stack):识别PHP语言指令,把它们转换为中间形式
执行栈(execution stack):获取中间形式的代码指令并在引擎上执行,引擎是用C或者汇编编写成的
1、eval与assert的相同点
- 二者都可以执行PHP语句。(eval规范更加严格一些,必须符合PHP代码要求。而assert则没有那么严格,执行PHP表达式即可。并不是对assert无计可施,可以采用assert_option()来进行对assert的控制)但是在生产环境强烈建议不使用assert函数(哪怕对其限制,也并不安全)。
- 都常被用来写一句话木马
2、eval与assert的不同点
- eval是一个语言构造器(是PHP自身的语言结构)而不是一个函数,不能被可变函数调用;assert在php中被认为是一个函数,能被可变函数调用。
- eval规范更加严格一些,必须符合PHP代码要求,assert则没有那么严格,执行PHP表达式即可。
3、一句话木马
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能。为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令。
原理:我们可以通过GET 、POST 、COOKIE这三种方式向一个网站提交数据,一句话木马用$_GET[’ ‘]、$_POST[’ ‘]、$_COOKIE[’ '] 接收我们传递的数据,并把接收的数据传递给一句话木马中执行命令的函数,进而执行命令。所以看到的经典一句话木马大多都是只有两个部分,一个是可以执行代码的函数部分,一个是接收数据的部分。
例1 POST:
<?php
eval(@$_POST['a']);
?>
其中eval
就是执行命令的函数$_ POST['a']
就是接收的数据。
eval函数把接收的数据当作PHP代码来执行,这样我们就能够让插入了一句话木马的网站执行我们传递过去的任意PHP语
分析:
因为木马是接收post请求中 “a” 的数据( $_POST[‘a’]),所以我们必须以post方法发送数据并且将我们要执行的代码赋值给“a”
例2 GET:
<?php
eval(@$_GET['a']);
?>
GET把参数包含在URL中如图: