报名热线 0731-85579057
桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校
专注于桐梓县PLC自动化培训、为桐梓县地区想学PLC自动化技术的求学者提供专业的PLC自动化培训课程和充电平台!
主页 > PLC自动化 >

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校

  • 课程介绍

  • 参考资料

  • 2022-11-15 04:25
湖南阳光PLC自动化培训学校常年面向桐梓县招生!
【温馨提示】湖南阳光PLC自动化培训学校地址:湖南省长沙市雨花区车站南路红花坡路176号。目前没有在桐梓县地区设立分校。热忱欢迎桐梓县的学员来湖南阳光PLC自动化培训学校长沙总校区参加学习!

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校

详情请进入 湖南阳光电子学校 已关注: 咨询电话:0731-85579057 微信号:yp941688, yp94168

桐梓县PLC自动化培训学校

桐梓县PLC自动化培训学校

桐梓县PLC自动化培训学校

桐梓县PLC自动化培训学校

桐梓县PLC自动化培训学校文章前言:为您提供全面的桐梓县学PLC自动化的学校,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训学校,桐梓县PLC自动化短期培训班,桐梓县PLC自动化培训学校地址,桐梓县学PLC自动化培训,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训班,桐梓县PLC自动化技术培训信息以及桐梓县PLC自动化培训学校和桐梓县PLC自动化培训班最新资讯,湖南阳光PLC自动化培训学校,常年面向桐梓县地区开设PLC自动化培训班,是专业的桐梓县PLC自动化学校,常年面向桐梓县地区招生,热忱欢迎桐梓县地区的PLC自动化技术求学者来我校学习最专业的PLC自动化技术。
全球首个江海铁多式联运全自动化码头投入运行 工业机器人、自动化领域被盯上 多股获400家以上机构调研!次新股最受瞩目 工控龙头透露布局新战略思路 南兴股份携新品亮相第49届中国家博会 智能化解决方案备受追捧 津荣天宇:公司电气精密部品包括低压配电部品、中压配电及能源设备部品和工业自动化部品 中国西门子PLC总代理商 西门子授权代理商
,桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校

桐梓县PLC自动化培训班文章内容:

最近关于 CodeQL 的概念很火,大家普遍认为这会是下一代的代码审计神器。网上关于 CodeQL 的文章已经有不少,但是多数文章还是在分析 CodeQL 的安装和简单使用用例。真正使用 CodeQL 来进行自动化代码审计的文章较少,本文主要研究基于 CodeQL 实现全自动的代码审计工具实现思路,预计文章分成三部分完成,目前是第一部分内容。

CodeQL(全称 Code Query Language), 从其英文名称中可以看出这是一种基于代码的查询语言,其作用主要是通过编写好的语句查询代码中可能存在的安全隐患。学习 CodeQL 类似于学习一门全新的编程语言,语法类似于 SQL,但是比传统 SQL 还是要难很多。目前 CodeQL 支持对多种语言,包括 java、javascript、go、python、C、Csharp 等,但是很遗憾的是不支持 " 世界上最好的语言 "PHP。这大概是因为 PHP 实在是太灵活了,函数名是字符串变量这种调用方式确实很难从 AST 语法树中静态分析出问题,但这并不能阻碍我们学习 CodeQL 的兴趣。文章所有内容基本上围绕 java 语言展开,其他语言操作基本类似。

0x02 环境准备

网上关于 CodeQL 安装的文章已经很多了,本来不打算再说这个事情,但是因为本人在 CodeQL 安装过程中遇到不兼容 mac m1 架构的情况,我想还有很多小伙伴也会遇到这个问题的,这里主要以 MAC 的环境来说明安装过程。

CodeQL 的安装主要分成引擎和 SDK,新建一个目录 CodeQL(~/CodeQL/)来保存后续所有的相关的工具和代码。

首先下载最新的引擎包,下载地址是:https://github.com/github/codeql-cli-binaries/releases

下载之后解压把 codeql 文件夹放在刚才新建的文件夹 CodeQL 中,添加环境变量。

vim ~/.profile

export PATH=/Users/ 用户名 /CodeQL/codeql:${PATH}

使用 source 命令是环境变量生效,然后命令行中运行 codeql,如图 2.1 所示。

图 2.1 CodeQL 引擎安装

然后需要下载 CodeQL 对应的 sdk 包,下载地址是:

https://github.com/Semmle/ql

下载之后也需要把 ql 文件夹复制到 ~/CodeQL 文件夹中。

在 CodeQL 文件夹中新建 databases 文件夹,用于存放后续使用 codeql 生成的数据库,那么一切准备好了之后我们的 CodeQL 目录之下就会是三个文件夹,如图 2.2 所示。

图 2.2 CodeQL 安装

后续我们就可以使用 codeql database create 命令来创建查询数据库,命令如下所示。

codeql database create /Users/xxx/CodeQL/databases/project_db_name --language=java --source-root=/Users/xxx/cms/project_path --overwrite

在 windows 环境中和以前的 mac 环境中确实没有问题,但是如果是在 m1 的环境中会报错,报错信息如图 2.3 所示。错误的原因是 codeql 官方提供的工具是 x86 架构的,不能直接在 arm 中使用。

图 2.3 在 MAC M1 环境中 codeql 运行错误

从官网中找到了 codeql 对 m1 的支持情况,如图 2.4 所示。从图中可以明确看出 codeql 确实是支持 m1 架构的,但是需要依赖 rosetta2 和 xcode。但是并没有给出具体的安装和使用步骤,必须吐槽官方一点也不人性化,说话说一半。

图 2.4 CodeQL 支持 M1 架构

后来慢慢摸索着装 xcode 和 rosetta2,安装 xcode 是直接通过 appstore 来装的,安装 rosetta2 是使用下面的命令。

softwareupdate – install-rosetta

安装好了之后就可以使用下面的命令来生成数据库,与传统方式不同的是需要在命令前面增加 arch -x86_64,如图 2.5 所示。

arch -x86_64 codeql database create /Users/xxx/CodeQL/databases/mvn_test --language=java --command='mvn clean install -DskipTests' --source-root=/Users/xxx/java/projects/mvn_test --overwrite

图 2.5 在 M1 中使用 codeql 生成数据库

0x03 语法基础

CodeQL 是一门全新的语言,基础的 CodeQL 语法网上已经有很多文章。大家在学习之前可以首先参考链接,了解关于 CodeQL 的基础语法,重点掌握关于类和谓词的概念。

参考链接:https://longlone.top/%E5%AE%89%E5%85%A8/%E5%AE%89%E5%85%A8%E7%A0%94%E7%A9%B6/codeql/2.CodeQL%E8%AF%AD%E6%B3%95/

直接来学习语法是一件很枯燥的事情,我们这里只是总结一些 CodeQL 中重点的概念。关于语法详情在后续的实际案例分析中会有更深刻的体会。

1 ) 与 Class 相关的概念

与类直接相关的概念包括 Class、Method、Field、Constructor,其代表的意义与 java 语言一致,通过其相互组合可以从数据库中筛选出符合条件的类和方法。

Demo1: 查询类的全限定名中包含 Person 的类,其中方法 getQualifiedName 代表获取类对应的全限定类名。

import java

from Class cwhere c.getQualifiedName ( ) .indexOf ( "Person" ) >=0select c.getQualifiedName ( )

Demo2: 查询所有字段 Field,满足条件是字段类型是 public,并且字段类型继承 java.lang.Throwable。(Fastjson1.2.80 漏洞利用链的查找方式)。

其中 getASupertype 代表获取类对应的父类,* 代表递归查找所有父类。

getDeclaringType 代表获取字段对应的定义类型。

getAModifier 代表获取字段对应的修饰符。

import java

from Class c, Field fwhere c.getASupertype* ( ) .hasQualifiedName ( "java.lang", "Throwable" ) andf.getDeclaringType ( ) = c and f.getAModifier ( ) .getName ( ) = "public"select c.getQualifiedName ( ) ,f.getName ( )

2 ) 与 Access 相关的概念

access 代表对变量或者方法的调用,主要有 VarAccess 和 MethodAccess。

Demo1:查询所有继承自 java.util.list 的变量及变量的引用。

import java

from RefType t,Variable v,VarAccess vawhere t.getSourceDeclaration ( ) .getASourceSupertype* ( ) .hasQualifiedName ( "java.util", "List" ) and v.getType ( ) = t and va.getVariable ( ) = vselect v,va

Demo2:查询所有 InputStream 类对应的 readObject 方法调用(遍历反序列化漏洞的基础)。

import java

from MethodAccess ma,Class cwhere ma.getMethod ( ) .hasName ( "readObject" ) and ma.getQualifier ( ) .getType ( ) = c and c.getASupertype* ( ) .hasQualifiedName ( "java.io", "InputStream" ) select ma,ma.getEnclosingCallable ( )

3)与 Type 相关的概念

Type 代表类型,是属于 CodeQL 中一个很重要的概念,Type 类有俩个直接派生类 PrimitiveType,RefType。

PrimitiveType 代表 Java 中的基础数据类型,派生类有 boolean, byte, char, double, float, int, long, short, void,, null。

RefType 代表 Java 中的引用类型,有派生类 Class、Interface、EnumType、Array。

Type 多数情况下是和 Acess 相互使用的,其实在上面 Acess 的例子中几乎都用到了 Type 相关的类。

4)与 Flow 相关的概念

Flow 是 CodeQL 中最重要的概念,代表数据流,与此对应的概念包括 source 和 sink。

source 代表可控的用户输入点,通常是指 WEB 站点中的 URL 中参数,例如

request.getParameter ( "name" ) 。其他例如命令行参数 args 也属于 source。在 CodeQL 中已经存在 RemoteFlowSource 类,在类中已经定义了很多常见的 source 点,可以满足我们做一般性代码审计的需要。但是如果我们是要做特定 jar 包漏洞挖掘,例如复现 log4j2 的远程命令执行漏洞,由于 log4j2 包中不包含常规的 source 点,就需要用户自定义 source。

sink 代表危险的函数,通常是指一些危险的操作,包括命令执行、代码执行、jndi 注入、SQL 注入、XML 注入等。CodeQL 虽然也预置了部分的 sink 点,但是远不能满足实际的需求,需要我们在不同的漏洞环境中自定义 sink 点。

在有了 source 和 sink 之后我们可以基于 CodeQL 提供的查询机制,自动判断是否存在 flow 可以连接 source 和 sink,一个典型的用法如下,如图 3.1 所示。

图 3.1 典型的 flow 利用方式

在图 3.1 所示的 Flow 中,自定义类继承自 TaintTracking::Configuration,并且覆盖其中的 isSource 个 isSink 方法。这个是固定写法,后续的绝大部分的 ql 脚本都包含这样的代码。

其中 isAdditionalTaintStep 方法是 CodeQL 的类 TaintTracking::Configuration 提供的的方法,它的原型是:override predicate isAdditionalTaintStep ( DataFlow::Node node1, DataFlow::Node node2 ) {}。它的作用是将一个可控节点 A 强制传递给另外一个节点 B,那么节点 B 也就成了可控节点,如图 3.2 所示。

图 3.2 isAdditionalTaintStep 方法的连接作用

如果 CodeQL 不能自动连接 node1 和 node2 节点,就需要手动通过 isAdditionalTaintStep 来指定连接。

除此之外,在 Flow 中还有一个方法经常用到 isSanitizer,用法如图 3.3 所示。这是官方提供的关于 log4j2 漏洞的查询脚本,其中定义了 isSanitizer 方法来限制 flow 流中的数据不能是基本数据类型 PrimitiveType 和 BoxedType 类型。这是一个特别常用的过滤机制,代表只要是常规的字符类型(Bool、int 这些)则不再进行传递。

图 3.3 isSanitizer 方法的过滤作用

0x04 案例实践

作为新手来说,要自己编写有效的 CodeQL 查询脚本是一件很难的事情,幸运的是 CodeQL 官方为我们提供了大量的 demo。

参考地址:https://github.com/github/codeql/tree/main/java/ql/src/experimental/Security/CWE

我们可以直接使用这些 demo 来完成部分漏洞发现功能。

为了更加清晰的理解关于 CodeQL 的使用,通过具体案例来演示 CodeQL 的作用。若依 RuoYi 是国内使用量较大的后台管理系统,从网上下载到某版本的 RuoYi 的源码。

1)基于 RuoYi 的源码生成数据库

arch -x86_64 codeql database create /Users/pang0lin/CodeQL/databases/RuoYi --language=java --command='mvn clean install -DskipTests' --source-root=/Users/pang0lin/cms/ 若依 RuoYi --overwrite

成功生成数据库之后,会返回类似的 success 界面,如图 4.1 所示。

图 4.1 创建基于 RuoYI 的数据库

2)使用官方 demo 查询漏洞

官网提供了很多查询的 ql 脚本,其中能直接找到若依相关漏洞的有两个脚本,其中第一个脚本是 spel 表达式注入的查询脚本。

参考地址:https://github.com/github/codeql/blob/main/java/ql/src/experimental/Security/CWE/CWE-094/SpringViewManipulation.ql)

查询结果如图 4.2 所示。

图 4.2 基于 SpringViewManipulation 的查询结果

查看 sink 点详情可知这个漏洞是用户输入的 fragment 直接传入了模版引擎中,如图 4.3 所示。

图 4.3 跟踪 sink 点之后的结果

这个漏洞其实是属于若依的一个已知的安全问题,详情见:https://blog.csdn.net/qq_33608000/article/details/124375219#Thymeleaf_184

虽然在最新版的若依中已经因为升级了 thymeleaf 版本导致无法利用,但是站在 CodeQL 的角度还是可以发现这种问题。

另一个可用的 CodeQL 的查询脚本是基于 mybatis 的 SQL 注入查询脚本,详情见:https://github.com/github/codeql/blob/main/java/ql/src/experimental/Security/CWE/CWE-089/MyBatisMapperXmlSqlInjection.ql

查询结果如图 4.4 所示。

图 4.4 基于 MyBatisMapperXmlSqlInjection 的查询结果

可以看到 CodeQL 找到了若依可能存在的 SQL 注入漏洞,跟进 sink 点看一下,如图所示。每一个都是类似的问题,我们随便打开看一个就可以了。

这个可以看到这里的参数传递到 SQL 语句中,造成了 SQL 注入漏洞。这个漏洞在网上也有大佬已经提到了漏洞细节信息,详情见:

https://juejin.cn/post/7001087308510265352

从上面的两次查询中我们可以看到 CodeQL 在代码审计过程中带来的便利,可以方便的帮助我们定位可能存在的漏洞点。

0x05 结论

CodeQL 给我们提供的查询 ql 脚本有很多,如果是通过手工一个一个试的话并不是一个好的解决办法,并且官方的 ql 脚本并不完善,还有很大的完善空间。

。桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校,桐梓县学PLC自动化的学校,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训学校,桐梓县PLC自动化短期培训班,桐梓县PLC自动化培训学校地址,桐梓县学PLC自动化培训,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训班,桐梓县PLC自动化技术培训.(编辑:hnygdzxx888)

桐梓县PLC自动化培训学校

桐梓县PLC自动化学校延伸阅读:
电力加速 江北内河首家堆场自动化港口在济宁投运 海翔药业(002099.SZ)拟斥3亿元于湖北枝江市投建医化设备及自动化项目 斩获应用创新奖!橙色云连续上榜中国自动化及数字化年度评选 记方大九钢自动化部维护站站长刘杰 中国船舶集团第七一六研究所:国内首台!杰瑞LNG自动化装车撬首装成功! 国网信通公司:与高压公司开展自动化站端设备技术交流 平顶山plc编程入门出来能工作吗? 西安PLC编程培训学校招生(OK!2022已更新) 成套PLC控制柜价格 共达地产品总监刘荣杰:基于AutoML技术的全流程自动化AI训练平台 先惠技术:上海先惠自动化技术股份有限公司关于重大资产重组之标的资产过渡期损益情况的公告 上海步科自动化股份有限公司 2021年年度报告摘要 青海通天河上的古渡口蝶变:智慧测量长江源水文情势 弘玑Cyclone创始人高煜光:打造数字生产力、构建组织竞争力,踏上超级自动化征程 工业自动化控制系统的组成和控制原理 如何基于工业物联网充分发挥工业自动化的潜力 弘亚数控:公司将利用已应用于下游家具生产的工段自动化连线的成功经验逐步推出开料、封边的工段自动化生产线 天宝智能型测量机器人赋能工程机械运动轨迹自动跟踪测量 会员动态:热烈祝贺灵龙自动化正式加入中国新能源企业家俱乐部,并担任新能源企业家俱乐部常务理事单位! 皇家骑士自走棋@粉阵营怎么用?@粉阵营使用攻略[多图]
。桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校,桐梓县学PLC自动化的学校,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训学校,桐梓县PLC自动化短期培训班,桐梓县PLC自动化培训学校地址,桐梓县学PLC自动化培训,桐梓县PLC自动化培训哪里好,桐梓县PLC自动化培训班,桐梓县PLC自动化技术培训.

(整理:桐梓县PLC自动化培训学校)


桐梓县PLC自动化培训学校

湖南阳光电子学校教学特色

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班

  • 桐梓县PLC自动化培训学校,桐梓县PLC自动化培训班,桐梓县PLC自动化学校
  • 扫码分享
  • 最新资讯
  • 热点资讯