webshell&一句话木马

webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。

而利用文件上传漏洞进行攻击时最常用的便是一句话木马,通过上传一句话木马文件配合菜刀、蚁剑等webshell连接工具等,获得目标服务器的读取权。

这些博客详细记录了常用的一句话木马以及相关介绍

常用的一句话木马

Web安全-一句话木马

pass1(前端验证)

由于本题是在前端js进行过滤,我们可以直接使用开发者工具删去检查代码就行了。

我们还可以使用bp抓包来上传:

首先将我们的文件后缀名改为不会被过滤的,再使用bp抓包

b206a2afa85059b9c8d35cbbb6642117

我们的文件在这,我们这是把后缀名改为php即可,我们又知道上传的绝对路径,因此可以直接用蚁剑连接。

pass2(数据包修改MIME)

我们只需要用bp抓包,把请求体的MIME类型修改成png的MIME类型也就是说image/png

1f5a8d5e3b200a81d39c173c304964bc

便能上传成功。

pass3(过滤了.asp|.aspx|.php|.jsp)

除了这几种还有别的类型。

  • ASP:asa/cer/cdx
  • ASPX:ashx/asmx/ascx
  • PHP:php4/php5/phtml/php3/pht
  • JSP:jspx/jspf

我们只要上传别的就行。

pass4(.htaccess)

本关把所有基本都给过滤了,我们只借助.htaccess来进行上传。

.htaccess 是一个配置文件,用于在Apache HTTP服务器中运行时对网站目录的访问权限和配置进行细粒度控制。它是一个分布式配置文件,意味着它可以在网站的主目录或任何子目录中存在,并对该目录及其所有子目录产生影响。

其中,.htaccess文件中内容SetHandler application/x-httpd-php用来设置当前目录所有文件都使用PHP解析,无论上传任何文件,只要符合php语言代码规范,就会被当做php文件执行。

使用前提

  1. 要在apache下的httpd.conf文件更改。
    启用.htaccess,需要修改httpd.conf,启用AllowOverride All ,并可以用AllowOverride限制特定命令的使用。
    打开httpd.conf文件用文本编辑器打开后,查找
1
2
3
<FilesMatch "muma">
SetHandler application/x-httpd-php
</FilesMatch>

这些代码意味着会将名为muma的文件当成php脚本执行。

我们先上传这个.htaccess文件再上传muma.png并用蚁剑连接就行了。

pass5(.user.ini)

查看源码:

1
2
3
4
5
6
7
8
9
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = deldot($file_name);//删除文件名末尾的点
$file_ext = strrchr($file_name, '.');
$file_ext = strtolower($file_ext); //转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
$file_ext = trim($file_ext); //首尾去空
1
$file_name = trim($_FILES['upload_file']['name']);
  • 从通过HTTP POST上传的文件中获取文件名,并使用 trim() 函数去除文件名两端的空白字符。
1
$file_name = deldot($file_name);//删除文件名末尾的点
  • 调用 deldot() 函数(这个函数在提供的代码片段中没有定义,但它应该是一个自定义函数,用于删除文件名末尾的点)。这通常是为了防止某些操作系统(如Windows)中隐藏文件名的点。
1
$file_ext = strrchr($file_name, '.');
  • 使用 strrchr() 函数查找文件名中最后一个点的位置,并返回从点开始到字符串末尾的部分,即文件扩展名。
1
$file_ext = strtolower($file_ext); //转换为小写
  • 将文件扩展名转换为小写,以确保与 $deny_ext 数组中的扩展名进行比较时大小写不敏感。
1
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  • 使用 str_ireplace() 函数去除文件扩展名中的字符串 ::$DATA。这可能是一种针对Windows系统的特定文件名攻击的防护措施。
1
$file_ext = trim($file_ext); //首尾去空
  • 使用 trim() 函数去除文件扩展名两端的空白字符。

我们可以用修改配置文件来上传,.user.ini实际上就是可以用户自定义的php.ini,不过只能自定义除了PHP_INI_SYSTEM之外的模式具体可以看官网(PHP: php.ini 配置选项列表 - Manual

原理

这里我们利用PHP_INI_PERDIR中的auto_prepend_file和auto_append_file,前者是在加载第一个PHP代码之前先预加载该配置所指示的php文件,后者则是之后。这样就能让所有php文件自动包含某个文件,前提是上传的目录下要有一个正常的php文件。

我们首先上传一个.user.ini的文件,里面的设置为auto_prepend_file=muma.png。这里的muma.png里即是我们的一句话木马。我们之后再把muma.png上传,便使得一句话木马能被成功利用。

pass6(大小写)

本题没有对大小写进行检查,直接改为.PHp就能上传成功。

要注意的是,上传的时候文件名给改了,我们可以在这查看改后的文件名

c2fo6hak5a22e_a3bf6c5be61f466ca27559897b985bc4

1740121002657(1)

之后便能用蚁剑进行连接。

pass7(空格绕过)

由于源码中没有删除空格的代码,所以我们可以在后缀名的最后加上一个空格来绕过检查。(网上大都是这样的,不过我暂时没复现成功会上传出错,查资料说是php版本问题,要低于5.3.29,可是修改过后还是不行,之后再试试)

pass8(.绕过)

由于源码中没有删除.的代码,所以我们直接在文件名最后加上一个.来绕过检测这个也要注意php版本问题。

pass9(::$DATA绕过)

额外数据流

一般情况下我们打开一个文件看到的是一个文件的默认数据流,但是windows支持在文件内部创建额外的数据流以保存其他信息,这些额外数据流可以通过在文件名后加上**::$DATA**来访问,例如查看1.txt的额外数据流我们可以访问1.txt::$DATA。

但是windows的文件是不能出现:等特殊字符的,如果有系统会直接去掉,我们正好可以利用这个特性。

我们首先在上传一个木马并且用bp抓包,在bp中在文件名后面加上**::$DATA**,上传到靶机(windows)后,::$DATA被删除,我们便能用蚁剑直接进行连接。

pass10(. .绕过)

源码和第五关类似,由源码可知对文件名先删了个点再首尾去空,我们只要将文件名设置为.php. .,那么删完末尾还有个点,检测后缀名时会出错,与黑名单配对不上,故能绕过。