当前位置: 首页 > news >正文

portswigger 目录遍历文件上传

目录

<1> 目录遍历

什么是目录遍历?

通过目录遍历读取任意文件

(1) 去除了多余 URL 解码的遍历序列

 (2) 非递归剥离的遍历序列

如何防止目录遍历攻击

<2> 文件上传漏洞

什么是文件上传漏洞?

漏洞影响

Web 服务器如何处理对静态文件的请求?

(1)通过content-type限制绕过上传webshell

(2)通过路径遍历上传 Web shell

 限制点介绍:防止在用户可访问的目录中执行文件

(3) 通过扩展黑名单绕过 Web shell 上传

限制点介绍:黑名单过滤

覆盖服务器配置 介绍:

(4) 通过混淆文件扩展名上传 Web shell

(5) 通过多语言 Web shell 上传远程执行代码

限制点:有缺陷的文件内容验证

(6) 通过竞争条件上传 Web shell

条件竞争漏洞介绍

利用文件上传竞争条件

基于 URL 的文件上传中的竞争条件

(7) 无需远程执行代码即可利用文件上传漏洞

上传恶意客户端脚本

利用上传文件解析中的漏洞

(8) 使用 PUT 上传文件

(9) 如何防止文件上传漏洞


<1> 目录遍历

什么是目录遍历?

目录遍历(也称为文件路径遍历)是一种网络安全漏洞,允许攻击者读取运行应用程序的服务器上的任意文件。 这可能包括应用程序代码和数据、后端系统的凭据以及敏感的操作系统文件。 在某些情况下,攻击者可能能够写入服务器上的任意文件,允许他们修改应用程序数据或行为,并最终完全控制服务器

通过目录遍历读取任意文件

考虑一个显示待售商品图像的购物应用程序。 图像通过一些 HTML 加载,如下所示:

<img src="/loadImage?filename=218.png">

loadImageURL 需要一个 filename参数并返回指定文件的内容。 图像文件本身存储在磁盘中的位置 /var/www/images/. 要返回图像,应用程序将请求的文件名附加到此基本目录并使用文件系统 API 来读取文件的内容。 在上述情况下,应用程序从以下文件路径读取:

/var/www/images/218.png

该应用程序没有针对目录遍历攻击实施任何防御措施,因此攻击者可以请求以下 URL 从服务器的文件系统中检索任意文件:

https://insecure-website.com/loadImage?filename=../../../etc/passwd

这会导致应用程序从以下文件路径读取:

/var/www/images/../../../etc/passwd

序列 ../在文件路径中有效,意味着在目录结构中升级一级。 连续三个 ../序列从 /var/www/images/到文件系统根目录,因此实际读取的文件是:

/etc/passwd

在基于 Unix 的操作系统上,这是一个标准文件,其中包含在服务器上注册的用户的详细信息。

在 Windows 上,两者 ../..\是有效的目录遍历序列,检索标准操作系统文件的等效攻击是:

https://insecure-website.com/loadImage?filename=..\..\..\windows\win.ini

(1) 去除了多余 URL 解码的遍历序列

在某些情况下,例如在 URL 路径或 filenamea的参数 multipart/form-data请求时,Web 服务器可能会在将您的输入传递给应用程序之前剥离任何目录遍历序列。 您有时可以通过 URL 编码,甚至双重 URL 编码绕过这种清理, ../字符,导致 %2e%2e%2f或者 %252e%252e%252f分别。 各种非标准编码,如 ..%c0%af或者 ..%ef%bc%8f,也可以解决问题

 (2) 非递归剥离的遍历序列

可以使用嵌套遍历序列,例如 ....//或者 ....\/,当内部序列被剥离时,它将恢复为简单的遍历序列

payload:?filename=....//....//....//etc/passwd

如何防止目录遍历攻击

防止文件路径遍历漏洞的最有效方法是完全避免将用户提供的输入传递给文件系统 API。 可以重写许多执行此操作的应用程序功能,以更安全的方式提供相同的行为。

如果认为将用户提供的输入传递给文件系统 API 是不可避免的,则应结合使用两层防御来防止攻击:

  • 应用程序应在处理用户输入之前对其进行验证。 理想情况下,验证应与允许值的白名单进行比较。 如果所需功能无法做到这一点,则验证应验证输入是否仅包含允许的内容,例如纯字母数字字符。
  • 验证提供的输入后,应用程序应将输入附加到基本目录并使用平台文件系统 API 来规范化路径。 它应该验证规范化路径是否以预期的基本目录开头。

下面是一个简单的 Java 代码示例,用于根据用户输入验证文件的规范路径:

File file = new File(BASE_DIRECTORY, userInput); if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) { // process file }

<2> 文件上传漏洞

什么是文件上传漏洞?

文件上传漏洞是指 Web 服务器允许用户在没有充分验证文件名称、类型、内容或大小等内容的情况下将文件上传到其文件系统。 未能正确执行这些限制可能意味着即使是基本的图像上传功能也可用于上传任意且具有潜在危险的文件。 这甚至可以包括启用远程代码执行的服务器端脚本文件。

在某些情况下,上传文件的行为本身就足以造成损害。 其他攻击可能涉及对文件的后续 HTTP 请求,通常是为了触发服务器执行该文件

漏洞影响

在最坏的情况下,文件的类型没有正确验证,服务器配置允许某些类型的文件(例如 .php.jsp) 作为代码执行。 在这种情况下,攻击者可能会上传一个充当 Web shell 的服务器端代码文件,从而有效地授予他们对服务器的完全控制权。

如果文件名没有得到正确验证,这可能允许攻击者通过上传同名文件来覆盖关键文件。 如果服务器也容易受到目录遍历的攻击,这可能意味着攻击者甚至可以将文件上传到意外位置。

未能确保文件大小在预期阈值范围内还可能导致某种形式的拒绝服务 (DoS) 攻击,攻击者借此填满可用的磁盘空间

Web 服务器如何处理对静态文件的请求?

在我们研究如何利用文件上传漏洞之前,您必须对服务器如何处理静态文件请求有一个基本的了解。

从历史上看,网站几乎完全由静态文件组成,这些文件会在用户请求时提供给用户。 因此,每个请求的路径可以与服务器文件系统上的目录和文件的层次结构 1:1 映射。 如今,网站越来越动态,请求的路径通常与文件系统没有直接关系。 尽管如此,Web 服务器仍会处理对一些静态文件的请求,包括样式表、图像等。

处理这些静态文件的过程仍然大致相同。 在某些时候,服务器会解析请求中的路径以识别文件扩展名。 然后它使用它来确定所请求文件的类型,通常通过将其与扩展名和 MIME 类型之间的预配置映射列表进行比较。 接下来会发生什么取决于文件类型和服务器的配置。

  • 如果此文件类型是不可执行的,例如图像或静态 HTML 页面,则服务器可能只是在 HTTP 响应中将文件的内容发送给客户端。
  • 如果文件类型是可执行的,例如 PHP 文件, 并且 服务器被配置为执行这种类型的文件,它会在运行脚本之前根据 HTTP 请求中的标头和参数分配变量。 然后可以将结果输出以 HTTP 响应的形式发送到客户端。
  • 如果文件类型是可执行的,但服务器 没有 配置为执行这种类型的文件,它通常会响应错误。 但是,在某些情况下,文件的内容可能仍以纯文本形式提供给客户端。 这种错误配置有时会被利用来泄露源代码和其他敏感信息

(1)通过content-type限制绕过上传webshell

提交 HTML 表单时,浏览器通常以 POST请求内容类型 application/x-www-form-url-encoded. 这适用于发送您的姓名、地址等简单文本,但不适用于发送大量二进制数据,例如整个图像文件或 PDF 文档。 在这种情况下,内容类型 multipart/form-data是首选方法

网站可能尝试验证文件上传的一种方法是检查此输入特定 Content-Type标头与预期的 MIME 类型匹配。 例如,如果服务器只需要图像文件,它可能只允许像这样的类型 image/jpegimage/png. 当此标头的值被服务器隐式信任时,可能会出现问题。 如果不执行进一步的验证来检查文件的内容是否实际匹配假定的 MIME 类型.

我们上传文件,burp抓包 更改Content-Type 为允许的类型即可成功上传我们的恶意文件

(2)通过路径遍历上传 Web shell

登录账户 wiener:peter

在上传头像处上传我们的php webshell文件,去读取/home/carlos/secret。发现并没有作限制

之后我们去访问我们上传的webshell,发现服务器没有执行脚本并返回输出,而是将 PHP 文件的内容作为纯文本返回。

再次回到 Repeater 中,转到包含 POST /my-account/avatar请求(上传文件的包)并找到与PHP 文件相关的请求正文部分。 在里面 Content-Disposition标题,更改 filename包括目录遍历序列的内容

响应说 The file avatars/exploit.php has been uploaded.这表明服务器正在从文件名中剥离目录遍历序列。

通过 URL 编码正斜杠 ( /) 字符 %2f

观察响应现在说 The file avatars/../exploit.php has been uploaded.这表明文件名正在由服务器进行 URL 解码。

这时我们访问/files/avatars/../exploit.php

php代码被成功执行,得到了 /home/carlos/secret 的内容

这表明该文件已上传到文件系统层次结构中的更高目录( /files),然后由服务器执行。这意味着您也可以使用 GET /files/exploit.php

 限制点介绍:防止在用户可访问的目录中执行文件

首先防止危险文件类型被上传显然更好,但第二道防线是阻止服务器执行任何通过网络溜走的脚本。

作为预防措施,服务器通常只运行其 MIME 类型已明确配置为执行的脚本。 否则,它们可能只是返回某种错误消息,或者在某些情况下,将文件内容作为纯文本提供:

这种行为本身可能很有趣,因为它可能会提供一种泄漏源代码的方法,但它会使任何创建 Web shell 的尝试无效。

这种配置通常在目录之间有所不同。 用户提供的文件上传到的目录可能比文件系统上假定最终用户无法访问的其他位置具有更严格的控制。 如果您能找到一种方法将脚本上传到不应该包含用户提供的文件的不同目录,那么服务器最终可能会执行您的脚本

也就是上面我们利用的目录遍历,将文件上传到了avatars上一级,/files下

小tip:Web 服务器经常使用 filename字段 multipart/form-data请求确定文件应保存的名称和位置

除此之外,还应该注意,即使您可以将所有请求发送到同一个域名,这通常指向某种反向代理服务器,例如负载均衡器。 您的请求通常由幕后的其他服务器处理,这些服务器的配置也可能不同

(3) 通过扩展黑名单绕过 Web shell 上传

    此lab包含易受攻击的图片上传功能。 某些文件扩展名被列入黑名单,但由于此黑名单的配置存在根本缺陷,可以绕过这种防御

hint: 你需要上传两个不同的文件来解决这个实验

尝试上传一个php文件

Sorry, php files are not allowed 响应表明上传的文件不允许带有php

我们再转到 POST /my-account/avatar 请求并找到与 PHP 文件相关的正文部分。 进行以下更改:

  • 更改的值 filename参数为 .htaccess.
  • 更改的值 Content-Type标题到 text/plain. (不改应该也没事)
  • 将文件的内容(您的 PHP 有效负载)替换为以下 Apache 指令:

    AddType application/x-httpd-php .l33t

    映射了一个任意扩展( .l33t) 到可执行的 MIME 类型 application/x-httpd-php. 由于服务器使用 mod_php模块,它已经知道如何处理这个问题

 

 之后更改我们原先的php文件后缀为.133t

 切换到另一个包含 GET /files/avatars/<YOUR-IMAGE> 请求的repeater。 在路径中,将您的图像文件的名称替换为abcde.l33t 并发送请求。 观察响应中返回了 Carlos 的秘密。 由于我们的恶意 .htaccess 文件,.l33t 文件就像 .php 文件一样被执行。

 在响应中得到了/home/carlos/secret 的内容

限制点介绍:黑名单过滤

防止用户上传恶意脚本的一种更明显的方法是将潜在危险的文件扩展名列入黑名单,例如 .php. 黑名单的做法本质上是有缺陷的,因为很难明确阻止每个可能用于执行代码的文件扩展名。 这种黑名单有时可以通过使用鲜为人知的替代文件扩展名来绕过,这些文件扩展名可能仍然是可执行的,例如 .php5, .shtml,.phtml 黑名单安全性不如白名单

覆盖服务器配置 介绍:

正如我们在上一节中所讨论的,服务器通常不会执行文件,除非它们已被配置为这样做。 例如,在 Apache 服务器执行客户端请求的 PHP 文件之前,开发人员可能必须将以下指令添加到他们的 /etc/apache2/apache2.conf文件:

LoadModule php_module /usr/lib/apache2/modules/libphp.so

AddType application/x-httpd-php .php

许多服务器还允许开发人员在各个目录中创建特殊的配置文件,以便覆盖或添加一个或多个全局设置。 例如,Apache 服务器将从一个名为 .htaccess

在文件里写入:

<FilesMatch "123.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

或者 AddType application/x-httpd-php .jpg

即可 允许123.jpg的内容作为php代码执行

同样,开发人员可以在 IIS 服务器上使用 web.config文件。 这可能包括如下指令,在这种情况下允许将 JSON 文件提供给用户:

<staticContent>

<mimeMap fileExtension=".json" mimeType="application/json" />

</staticContent>

Web 服务器在存在时使用这些类型的配置文件,但通常不允许您使用 HTTP 请求访问它们。 但是,您可能偶尔会发现无法阻止您上传自己的恶意配置文件的服务器。 在这种情况下,即使您需要的文件扩展名被列入黑名单,您也可以欺骗服务器将任意自定义文件扩展名映射到可执行的 MIME 类型

(4) 通过混淆文件扩展名上传 Web shell

     此lab包含易受攻击的图片上传功能。 某些文件扩展名被列入黑名单,但可以使用经典的混淆技术绕过这种防御

响应说只允许上传 JPG&PNG

我们可以在filename参数的 .php后加上NULL(%00)空字节来截断

 观察响应发现 成功上传了abced.php  表明空字节和.jpg 扩展名已被删除。

之后我们发送get请求访问我们的恶意文件,执行后查看响应 得到了/home/carlos/secret 的内容

 

绕过点介绍:混淆文件扩展名

即使是最详尽的黑名单也可能被经典的混淆技术绕过。 假设验证代码区分大小写并且无法识别 exploit.pHp实际上是一个 .php文件。 如果随后将文件扩展名映射到 MIME 类型的代码 区分大小写,则这种差异允许您将恶意 PHP 文件偷偷通过验证,最终可能由服务器执行。

您还可以使用以下技术获得类似的结果:

  • 提供多个扩展。 根据用于解析文件名的算法,以下文件可能被解释为 PHP 文件或 JPG 图像: exploit.php.jpg
  • 添加尾随字符。 一些组件会去除或忽略尾随空格、点等: exploit.php.
  • 尝试对点、正斜杠和反斜杠使用 URL 编码(或双 URL 编码)。 如果在验证文件扩展名时该值没有被解码,但后来在服务器端被解码,这也可以让您上传否则会被阻止的恶意文件: exploit%2Ephp
  • 在文件扩展名前添加分号或 URL 编码的空字节字符。 如果验证是用 PHP 或 Java 等高级语言编写的,但服务器使用 C/C++ 中的低级函数处理文件,例如,这可能会导致文件名结尾出现差异: exploit.asp;.jpg或者 exploit.asp%00.jpg
  • 尝试使用多字节 unicode 字符,在 unicode 转换或规范化后可能会转换为空字节和点。 像这样的序列 xC0 x2E, xC4 xAE或者 xC0 xAE可以翻译成 x2E如果文件名被解析为 UTF-8 字符串,但在用于路径之前转换为 ASCII 字符。

其他防御措施包括剥离或替换危险的扩展名以防止文件被执行。 如果不递归地应用此转换,您可以定位禁止的字符串,以便删除它仍然留下有效的文件扩展名。 例如,考虑一下如果你剥离.php从以下文件名会发生什么:

exploit.p.phphp

剥离黄色的 .php 之后会变为exploit.php

(5) 通过多语言 Web shell 上传远程执行代码

    此lab包含易受攻击的图片上传功能。 尽管它会检查文件的内容以验证它是否为正版图像,但仍然可以上传和执行服务器端代码

 更改后缀为.jpg上传但 响应说 file is not a valid image 修改Content-Type亦如此

我们往文件内容中 写入GIF89a(图片头标志) 成功上传

 之后我们发送get请求访问我们的恶意文件,执行后查看响应 得到了/home/carlos/secret 的内容

限制点:有缺陷的文件内容验证

更安全的服务器会尝试验证文件的内容是否与预期的内容实际匹配,而不是暗中信任 Content-Type在请求中指定

在图像上传功能的情况下,服务器可能会尝试验证图像的某些内在属性,例如其尺寸。 例如,如果您尝试上传 PHP 脚本,则它根本没有任何维度。 因此,服务器可以推断它不可能是图像,并相应地拒绝上传。

同样,某些文件类型可能总是在其页眉或页脚中包含特定的字节序列。 这些可以用作指纹或签名来确定内容是否与预期的类型匹配。 例如,JPEG 文件总是以字节开头 FF D8 FF. (文件头)

这是一种更可靠的文件类型验证方法,但即使这样也不是万无一失的。 使用 ExifTool 等特殊工具,可以轻松创建包含元数据中恶意代码的多语言 JPEG 文件.

(6) 通过竞争条件上传 Web shell

    此lab包含易受攻击的图片上传功能。 尽管它对上传的任何文件执行强大的验证,但可以通过在处理它们的方式中利用竞争条件来完全绕过此验证

我们试着上传我们的exploit.php ,error,响应只允许上传 JPG&PNG files.

 访问我们上传的exploit.php 404 因为被删除了。 下面用到了,我们去下载Turbo extension插件

然后回到 http history

Copy and paste the following script template into Turbo Intruder's Python editor:

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)

    request1 = '''<YOUR-POST-REQUEST>'''

    request2 = '''<YOUR-GET-REQUEST>'''

    # the 'gate' argument blocks the final byte of each request until openGate is invoked
    engine.queue(request1, gate='race1')
    for x in range(5):
        engine.queue(request2, gate='race1')

    # wait until every 'race1' tagged request is ready
    # then send the final byte of each request
    # (this method is non-blocking, just like queue)
    engine.openGate('race1')

    engine.complete(timeout=60)


def handleResponse(req, interesting):
    table.add(req)

把post上传文件的包放到request1

 get访问我们的exploit.php放到request2

 完备之后我们 attack 在响应200中得到secret

 

条件竞争漏洞介绍

条件竞争漏洞是一种服务器端的漏洞,是由于开发者设计应用程序并发处理时操作逻辑不合理而造成。当应用面临高并发的请求时未能同步好所有请求,导致请求与请求之间产生等待时出现逻辑缺陷

利用文件上传竞争条件

现代框架更能抵御此类攻击。 他们通常不会将文件直接上传到文件系统上的预期目的地。 相反,他们采取了预防措施,例如首先上传到临时的沙盒目录并随机命名以避免覆盖现有文件。 然后,他们对这个临时文件执行验证,只有在认为安全的情况下才将其传输到目的地。

也就是说,开发人员有时会独立于任何框架来实现自己的文件上传处理。 做好这件事不仅相当复杂,而且还可能引入危险的竞争条件,使攻击者能够完全绕过最强大的验证。

例如,一些网站直接将文件上传到主文件系统,如果没有通过验证,则再次将其删除。 这种行为在依赖防病毒软件等检查恶意软件的网站中很常见。 这可能只需要几毫秒,但在文件存在于服务器上的短时间内,攻击者仍有可能执行它。

这些漏洞通常非常微妙,因此在黑盒测试期间很难检测到,除非您能找到泄漏相关源代码的方法。

基于 URL 的文件上传中的竞争条件

在允许您通过提供 URL 来上传文件的函数中可能会出现类似的竞争条件。 在这种情况下,服务器必须通过 Internet 获取文件并创建本地副本,然后才能执行任何验证。

由于文件是使用 HTTP 加载的,因此开发人员无法使用其框架的内置机制来安全地验证文件。 相反,他们可以手动创建自己的流程来临时存储和验证文件,这可能不太安全。

例如,如果文件被加载到具有随机名称的临时目录中,理论上,攻击者应该不可能利用任何竞争条件。 如果他们不知道目录的名称,他们将无法请求文件以触发其执行。 另一方面,如果随机目录名称是使用 PHP 之类的伪随机函数生成的 uniqid(),它可能会被暴力破解。

为了使此类攻击更容易,您可以尝试延长处理文件所需的时间,从而延长暴力破解目录名称的窗口。 一种方法是上传更大的文件。 如果它以块的形式进行处理,您可以通过在开始时创建一个带有有效负载的恶意文件,然后是大量的任意填充字节来利用这一点。

(7) 无需远程执行代码即可利用文件上传漏洞

在我们目前看到的示例中,我们已经能够上传服务器端脚本以进行远程代码执行。 这是不安全的文件上传功能最严重的后果,但这些漏洞仍然可以通过其他方式被利用。

上传恶意客户端脚本

尽管您可能无法在服务器上执行脚本,但您仍然可以上传脚本以进行客户端攻击。 例如,如果您可以上传 HTML 文件或 SVG 图像,您可能会使用 <script>标签来创建 存储的 XSS 有效负载。

如果上传的文件随后出现在其他用户访问的页面上,则他们的浏览器将在尝试呈现页面时执行脚本。 请注意,由于 同源策略 限制,这些类型的攻击只有在上传的文件是从您上传文件的同一源提供时才会起作用。

利用上传文件解析中的漏洞

如果上传的文件看起来既安全又安全,最后的手段是尝试利用特定于解析或处理不同文件格式的漏洞。 例如,您知道服务器解析基于 XML 的文件,例如 Microsoft Office .doc或者 .xls文件,这可能是 XXE 注入 攻击的潜在载体。

(8) 使用 PUT 上传文件

值得注意的是,某些 Web 服务器可能配置为支持 PUT要求。 如果没有适当的防御措施,这可以提供上传恶意文件的替代方法,即使上传功能无法通过 Web 界面使用。

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

(9) 如何防止文件上传漏洞

允许用户上传文件是司空见惯的事,只要您采取正确的预防措施,就不一定会有危险。 一般来说,保护您自己的网站免受这些漏洞影响的最有效方法是实施以下所有做法:

  • 根据允许扩展名的白名单而不是禁止扩展名的黑名单检查文件扩展名。 猜测您可能希望允许哪些扩展比猜测攻击者可能尝试上传哪些扩展要容易得多。
  • 确保文件名不包含任何可能被解释为目录或遍历序列的子字符串 ( ../).
  • 重命名上传的文件以避免可能导致现有文件被覆盖的冲突。
  • 在完全验证之前不要将文件上传到服务器的永久文件系统。
  • 尽可能使用已建立的框架来预处理文件上传,而不是尝试编写自己的验证机制。

相关文章:

  • 【微信小程序入门到精通】— swiper 超详细的属性值讲解!确定不来看看?
  • [单片机框架][device层] fuelgauge 电量计
  • 基于linux的web服务器(问题)
  • 【leetcode top100】两数相加。无重复字符的最长子串,盛水最多的容器,三数之和
  • PIE-Engine 教程:水稻面积提取1(宿迁市)
  • CMSC5707-高级人工智能之语音识别
  • AES(对称加密)学习记录
  • 【技术推荐】WebLogic 反序列化漏洞深入分析
  • 提高 IDC 网络带宽利用率
  • JavaWeb综合案例(黑马程序员2021年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)
  • 卫星通信系统按照工作轨道分类
  • JDBC在idea上的配置
  • Kotlin协程:MutableStateFlow的实现原理
  • ElasticSearch入门笔记
  • Pytorch 自动求导的设计与实现
  • 【技术性】Search知识
  • 4. 路由到控制器 - Laravel从零开始教程
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • js写一个简单的选项卡
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL-事务管理(基础)
  • Web标准制定过程
  • 测试开发系类之接口自动化测试
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 动态规划入门(以爬楼梯为例)
  • 分享一份非常强势的Android面试题
  • 汉诺塔算法
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 技术:超级实用的电脑小技巧
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 推荐一个React的管理后台框架
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​批处理文件中的errorlevel用法
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #laravel 通过手动安装依赖PHPExcel#
  • #pragma once
  • (js)循环条件满足时终止循环
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net Redis的秒杀Dome和异步执行
  • .net 调用php,php 调用.net com组件 --
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET框架设计—常被忽视的C#设计技巧
  • .php文件都打不开,打不开php文件怎么办
  • @Bean, @Component, @Configuration简析
  • @Validated和@Valid校验参数区别
  • [1181]linux两台服务器之间传输文件和文件夹
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Android 13]Input系列--获取触摸窗口