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

DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

目录

  • Insecure CAPTCHA(不安全验证)
    • low
      • 源码审计
    • medium
      • 源码审计
    • high
      • 源码审计
    • impossible
      • 源码审计

Insecure CAPTCHA(不安全验证)

Insecure CAPTCHA(不安全验证)漏洞指的是在实现 CAPTCHA(完全自动化公共图灵测试区分计算机和人类)机制时,未能有效保护用户输入的验证信息,从而使得攻击者能够绕过或破解该验证机制。这类漏洞通常出现在网络应用程序中,目的是防止自动化脚本(如机器人)对网站进行滥用,CAPTCHA全称为Completely Automated Public Turing Test to Tell Computers and Humans Apart,中文名字是全自动区分计算机和人类的图灵测试

low

正常修改会报错

重新修改密码并抓包发送到重放器

step=1修改为step=2,发包

修改成功

源码审计

并没有什么过滤,设置了step=2才能修改,使用**mysqli_real_escape_string**可能SQL注入;使用了不安全的md5加密算法

<?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) { // Step 1: 用户提交了第一个表单,并且是第一步$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 通过第三方服务检查CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html     .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 如果匹配,让用户确认更改$html .= "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre><form action=\"#\" method=\"POST\"><input type=\"hidden\" name=\"step\" value=\"2\" /><input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" /><input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" /><input type=\"submit\" name=\"Change\" value=\"Change\" /></form>";} else {// 两次输入的密码不匹配$html     .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) { // Step 2: 用户提交确认后的表单,进行更改操作$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new  = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确认两个密码匹配if ($pass_new == $pass_conf) {// 对特殊字符进行转义,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 将密码进行md5加密(注:md5已不再安全,实际应用中应使用更安全的加密方式)$pass_new = md5($pass_new);// 更新数据库中当前用户的密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 给用户反馈密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false; // 提示错误,不隐藏表单}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

medium

同样修改后抓包

这里查看源码可以发现设置了passed_captcha验证

step=1修改为step=2,并且添加passed_captcha=true

修改成功

源码审计

与low级别差不多,多了一个设置passed_captcha=true才能正常修改

?phpif (isset($_POST['Change']) && ($_POST['step'] == '1')) {// 第一步:用户提交了表单且处于步骤1$hide_form = true; // 标识隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 从第三方验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// CAPTCHA验证未通过if (!$resp) {$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false; // 如果错误,不隐藏表单return;} else {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 密码匹配,显示下一步$html .= "<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre><form action=\"#\" method=\"POST\"><input type=\"hidden\" name=\"step\" value=\"2\" /><input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" /><input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" /><input type=\"hidden\" name=\"passed_captcha\" value=\"true\" /><input type=\"submit\" name=\"Change\" value=\"Change\" /></form>";} else {// 两次输入的密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false; // 不隐藏表单,提示用户重新输入}}
}
if (isset($_POST['Change']) && ($_POST['step'] == '2')) {// 第二步:用户提交确认后的表单$hide_form = true; // 隐藏CAPTCHA表单// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 确保用户完成了第一步if (!$_POST['passed_captcha']) {$html .= "<pre><br />You have not passed the CAPTCHA.</pre>";$hide_form = false;return;}// 检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 匹配进行密码更新// 转义特殊字符,防止SQL注入$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:md5不够安全,实际应用中应使用更好的加密方法)$pass_new = md5($pass_new);// 更新数据库中的用户密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 反馈用户密码已更改$html .= "<pre>Password Changed.</pre>";} else {// 两次输入的密码不匹配$html .= "<pre>Passwords did not match.</pre>";$hide_form = false;}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>

high

定位登录框,发现这么一处注释

 **DEV NOTE**   Response: 'hidd3n_valu3'   &&   User-Agent: 'reCAPTCHA'   **/DEV NOTE** 

结合源码得知需要g-recaptcha-response=hidd3n_valu3 并且 User-Agent: ‘reCAPTCHA’

同样修改后抓包

发送包并修改参数

修改成功

源码审计

设置了请求头:reCAPTCHA ; g-recaptcha-response = hidd3n_valu3,以及token使会话更有安全性,还利用CSRF令牌使的更安全

<?phpif (isset($_POST['Change'])) {// 用户提交了表单,隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码和确认密码$pass_new = $_POST['password_new'];$pass_conf = $_POST['password_conf'];// 验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 检查CAPTCHA验证是否通过或符合内置绕过条件if ($resp || ($_POST['g-recaptcha-response'] == 'hidd3n_valu3'&& $_SERVER['HTTP_USER_AGENT'] == 'reCAPTCHA')) {// CAPTCHA验证通过,检查两次输入的密码是否匹配if ($pass_new == $pass_conf) {// 转义输入以防止SQL注入攻击$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");// 使用md5加密密码(注意:不推荐在生产环境中使用)$pass_new = md5($pass_new);// 更新数据库用户密码$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "' LIMIT 1;";$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert) or die('<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>');// 返回用户的反馈信息$html .= "<pre>Password Changed.</pre>";} else {// 如果密码不匹配$html .= "<pre>Both passwords must match.</pre>";$hide_form = false;}} else {// CAPTCHA输入错误时的响应$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;return;}// 关闭数据库连接((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>

impossible

源码审计

结合反CSRF令牌和CAPTCHA,提高安全性;并且使用PDO和参数绑定防止SQL注入。

<?php
if (isset($_POST['Change'])) {// 检查反CSRF令牌,确保请求的合法性checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');// 隐藏CAPTCHA表单$hide_form = true;// 获取用户输入的新密码,并移除转义字符$pass_new = $_POST['password_new'];$pass_new = stripslashes($pass_new);$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new) : "");$pass_new = md5($pass_new); // 对新密码进行MD5加密// 获取用户输入的确认密码,并移除转义字符$pass_conf = $_POST['password_conf'];$pass_conf = stripslashes($pass_conf);$pass_conf = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_conf) : "");$pass_conf = md5($pass_conf); // 对确认密码进行MD5加密// 获取用户输入的当前密码,并移除转义字符$pass_curr = $_POST['password_current'];$pass_curr = stripslashes($pass_curr);$pass_curr = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_curr) : "");$pass_curr = md5($pass_curr); // 对当前密码进行MD5加密// 使用第三方功能验证CAPTCHA$resp = recaptcha_check_answer($_DVWA['recaptcha_private_key'],$_POST['g-recaptcha-response']);// 如果CAPTCHA验证失败if (!$resp) {// 反馈信息:CAPTCHA错误$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";$hide_form = false;} else {// 检查当前密码是否正确$data = $db->prepare('SELECT password FROM users WHERE user = (:user) AND password = (:password) LIMIT 1;');$data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);$data->bindParam(':password', $pass_curr, PDO::PARAM_STR);$data->execute();// 检查新密码是否匹配,且当前密码是否正确if (($pass_new == $pass_conf) && ($data->rowCount() == 1)) {// 更新数据库中的用户密码$data = $db->prepare('UPDATE users SET password = (:password) WHERE user = (:user);');$data->bindParam(':password', $pass_new, PDO::PARAM_STR);$data->bindParam(':user', dvwaCurrentUser(), PDO::PARAM_STR);$data->execute();// 用户反馈:成功$html .= "<pre>Password Changed.</pre>";} else {// 用户反馈:失败$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}}
}// 生成反CSRF攻击的令牌
generateSessionToken();
?>
     $data->execute();// 用户反馈:成功$html .= "<pre>Password Changed.</pre>";} else {// 用户反馈:失败$html .= "<pre>Either your current password is incorrect or the new passwords did not match.<br />Please try again.</pre>";$hide_form = false;}
}

}

// 生成反CSRF攻击的令牌
generateSessionToken();
?>


相关文章:

DVWA靶场Insecure CAPTCHA(不安全验证)漏洞所有级别通关教程及源码审计

目录 Insecure CAPTCHA(不安全验证)low源码审计 medium源码审计 high源码审计 impossible源码审计 Insecure CAPTCHA(不安全验证) Insecure CAPTCHA&#xff08;不安全验证&#xff09;漏洞指的是在实现 CAPTCHA&#xff08;完全自动化公共图灵测试区分计算机和人类&#xff0…...

JavaScript HTML DOM 实例

JavaScript HTML DOM 实例 JavaScript 的 HTML DOM(文档对象模型)允许您通过脚本来控制 HTML 页面。DOM 是 HTML 文档的编程接口,它将 Web 页面与编程语言连接起来,使得开发者可以改变页面中的内容、结构和样式。在这篇文章中,我们将通过一系列实例来探讨如何使用 JavaSc…...

软件架构和软件体系结构的关系

软件架构&#xff08;Software Architecture&#xff09;和软件体系结构&#xff08;Software System Architecture&#xff09;这两个术语在日常使用中经常被交替使用&#xff0c;但它们在严格意义上有所区别&#xff1a; 1. **软件架构**&#xff1a; - 软件架构主要关注软件…...

C++并发:在线程间共享数据

1 线程间共享数据的问题 1.1 条件竞争 条件竞争&#xff1a;在并发编程中&#xff1a;操作由两个或多个线程负责&#xff0c;它们争先让线程执行各自的操作&#xff0c;而结果取决于它们执行的相对次序&#xff0c;这样的情况就是条件竞争。 诱发恶性条件竞争的典型场景是&am…...

GaussDB逻辑解码技术原理深度解析

GaussDB逻辑解码技术原理深度解析 一、背景介绍 在数字化转型的大潮中&#xff0c;异构数据库之间的数据同步需求日益增长。异构数据库同步指的是将不同类型、不同结构的数据库之间的数据进行同步处理&#xff0c;以确保数据在不同数据库之间的一致性。华为云提供的DRS服务&a…...

JAVA构造方法练习

要求在Student类中&#xff0c;&#xff08;task1&#xff09;添加一个有name和ID两个参数的构造方法&#xff0c;对成员变量name和ID进行初始化&#xff0c;&#xff08;task2&#xff09;实例化一个Student对象&#xff0c;学生姓名&#xff1a;Yaoming&#xff0c;ID&#x…...

Pytorch 三小时极限入门教程

一、引言 在当今的人工智能领域&#xff0c;深度学习占据了举足轻重的地位。而 Pytorch 作为一款广受欢迎的深度学习框架&#xff0c;以其简洁、灵活的特性&#xff0c;吸引了大量开发者投身其中。无论是科研人员探索前沿的神经网络架构&#xff0c;还是工程师将深度学习技术落…...

Rockect基于Dledger的Broker主从同步原理

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; RocketMQ原理简述&#xff08;二&#xff09;-CSDN博客 2.Broker的高可用 如果…...

面向对象分析与设计Python版 面向对象的核心特征

文章目录 一、封装二、继承三、多态四、聚合/组合五、接口/实现六、抽象 一、封装 封装 Encapsulation 封装是隐藏对象实现细节的过程内部状态通常不能被其他对象访问对象的数据只能通过接口去访问封装使得对象可以被看成一个“黑盒子”它保护对象的内部状态不被其他对象破坏…...

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件&#xff0c;这些组件可以组合成独特的解决方案。在选择密钥管理系统&#xff08;KMS&#xff09;时&#xff0c;您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...

RSA密码的安全性分析(简化版本)

RSA的安全性是基于分解大整数的困难性假定&#xff0c;之所以认为是假定是因为至今还未能证明大整数就是NP问题&#xff0c;也许有尚未发现的多项式时间分解算法。随着人类计算能力的不断提高&#xff0c;原来被认为是不可能分解的大数已经被成功分解。对于大整数的威胁除了人类…...

嵌入式linux系统中CMake的基本用法

第一:CMake的基本使用 在上篇文章中,我们聊了聊 Makefile。虽然它是 C/C++ 项目编译的“老司机”,但写起来真的是让人头大。尤其是当项目文件一多,手写依赖就像在搬砖,费时又费力。 那么问题来了,难道我们就没有更优雅的工具了吗?答案是:有! 这时候,CMake 就像一个…...

若依修改超级管理员admin的密码

通过接口方式或者页面 /system/user/resetPwd 需改其他用户的密码 修改其他用户的加密的密码&#xff0c;然后通过数据库将admin更新为这个密码就修改好了...

matlab中高精度计算函数vpa与非厄米矩阵本征值的求解

clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…...

王佩丰24节Excel学习笔记——第二十四讲:宏表函数

【以 Excel2010 系列学习&#xff0c;用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 宏表函数不能直接使用。get.cell(参数一&#xff0c;参数二)&#xff0c;参数一要参考类型表。 获得单元格的公式有很多种方法&#xff0c; 如&#xff1a;宏写法&#xff1a;get.cel…...

Navicat 17 for Mac 数据库管理软件

Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕。2. 应用程序/启动台显示Navicat图标&#xff0c;表示安装成功。 二、运行测试运行后提示&#xff1a;“Navicat Premium.pp”已损坏&#x…...

现代光学基础2

yt2 目录 激光器概述红宝石激光器 工作原理主要特点举例说明 固体激光器 分类与特点钛-蓝宝石激光器锁模技术 光纤激光器 优势与应用掺铒光纤放大器&#xff08;EDFA&#xff09;隔离器与法拉第效应 气体激光器 常见类型工作原理举例说明 半导体激光器 现状与优势工作原理应用…...

Git 入门(一)

git 工作流如下&#xff1a; 命令如下&#xff1a; clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库checkout &#xff08;检出&#xff09;:从本地仓库中检出一个仓库分支然后进行修订add&#xff08;添加&#xff09;: 在提交前先将代码提交到暂存区com…...

mysql自定义安装

1、下载安装包 我是在windows上安装&#xff0c;所以选择“Mysql Installer for Windows” 2、安装mysql 双击“mysql-installer-community-8.0.40.0.msi”&#xff0c;开始启动安装 这里选择安装项&#xff0c;这里只选择了两项。workbench是图形化管理工具&#xff0c;比较吃…...

微软自带日志输出+Serilog

安装两个 NuGet 包&#xff1a;Microsoft.Extensions.Logging&#xff0c;Serilog.AspNetCore 如何配置Program.cs&#xff0c;builder 具体如何配置自行解决&#xff1a; var builder WebApplication.CreateBuilder(args); builder.Logging.ClearProviders(); builder.Loggi…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

前端工具库lodash与lodash-es区别详解

lodash 和 lodash-es 是同一工具库的两个不同版本&#xff0c;核心功能完全一致&#xff0c;主要区别在于模块化格式和优化方式&#xff0c;适合不同的开发环境。以下是详细对比&#xff1a; 1. 模块化格式 lodash 使用 CommonJS 模块格式&#xff08;require/module.exports&a…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...