webshell&一句话木马
webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。
而利用文件上传漏洞进行攻击时最常用的便是一句话木马,通过上传一句话木马文件配合菜刀、蚁剑等webshell连接工具等,获得目标服务器的读取权。
这些博客详细记录了常用的一句话木马以及相关介绍
pass1(前端验证)
由于本题是在前端js进行过滤,我们可以直接使用开发者工具删去检查代码就行了。
我们还可以使用bp抓包来上传:
首先将我们的文件后缀名改为不会被过滤的,再使用bp抓包
我们的文件在这,我们这是把后缀名改为php即可,我们又知道上传的绝对路径,因此可以直接用蚁剑连接。
pass2(数据包修改MIME)
我们只需要用bp抓包,把请求体的MIME类型修改成png的MIME类型也就是说image/png
便能上传成功。
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文件执行。
使用前提
- 要在apache下的
httpd.conf
文件更改。
启用.htaccess
,需要修改httpd.conf,启用AllowOverride All
,并可以用AllowOverride限制特定命令的使用。
打开httpd.conf文件用文本编辑器打开后,查找
1 | <FilesMatch "muma"> |
这些代码意味着会将名为muma的文件当成php脚本执行。
我们先上传这个.htaccess文件再上传muma.png并用蚁剑连接就行了。
pass5(.user.ini)
查看源码:
1 | if (isset($_POST['submit'])) { |
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就能上传成功。
要注意的是,上传的时候文件名给改了,我们可以在这查看改后的文件名
之后便能用蚁剑进行连接。
pass7(空格绕过)
由于源码中没有删除空格的代码,所以我们可以在后缀名的最后加上一个空格来绕过检查。(网上大都是这样的,不过我暂时没复现成功会上传出错,查资料说是php版本问题,要低于5.3.29,可是修改过后还是不行,之后再试试)
pass8(.绕过)
由于源码中没有删除.的代码,所以我们直接在文件名最后加上一个.来绕过检测这个也要注意php版本问题。
pass9(::$DATA绕过)
额外数据流
一般情况下我们打开一个文件看到的是一个文件的默认数据流,但是windows支持在文件内部创建额外的数据流以保存其他信息,这些额外数据流可以通过在文件名后加上**::$DATA**来访问,例如查看1.txt的额外数据流我们可以访问1.txt::$DATA。
但是windows的文件是不能出现:等特殊字符的,如果有系统会直接去掉,我们正好可以利用这个特性。
我们首先在上传一个木马并且用bp抓包,在bp中在文件名后面加上**::$DATA**,上传到靶机(windows)后,::$DATA被删除,我们便能用蚁剑直接进行连接。
pass10(. .绕过)
源码和第五关类似,由源码可知对文件名先删了个点再首尾去空,我们只要将文件名设置为.php. .,那么删完末尾还有个点,检测后缀名时会出错,与黑名单配对不上,故能绕过。