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

网站建设工作动态wordpress次元主题

网站建设工作动态,wordpress次元主题,网站建设完成外网无法访问,小学学校网站前言 代码审计总是离不开一些神器#xff0c;笔者常用 Codeql[1] 这款工具辅助挖洞。当我每写一个规则都需要对其它项目手动运行检查一遍#xff0c;效率很低#xff0c;再加上 lgtm[2] 的关闭#xff0c;此项目诞生了 --- 弈(Yi)[3] 。 CVE-2021-43798 这里以 Graana 的…前言 代码审计总是离不开一些神器笔者常用 Codeql[1] 这款工具辅助挖洞。当我每写一个规则都需要对其它项目手动运行检查一遍效率很低再加上 lgtm[2] 的关闭此项目诞生了 --- 弈(Yi)[3] 。 CVE-2021-43798 这里以 Graana 的任意文件读取漏洞举例说明使用方法(初学 Codeql,如有错误之处轻点喷)。 该漏洞版本为 8.0.0 - 8.3.0 , 修复版本为 8.3.1, 8.2.7, 8.1.8, 8.0.7。 git clone https://github.com/grafana/grafana git checkout v8.2.6 这个漏洞发生在 /public/plugins/:pluginId/* api 中当输入的 pluginId存在时会匹配*内容使用filepath.Clean清理路径中的多余字符后直接拼接到pluginFilePath,然后使用os.open(pluginFilePath)打开该文件最终回显到页面。而且plugins api权限为public是未授权的任何人都可以查看。 fmt.Println(filepath.Clean(./.../../../../../../../etc/passwd)) 输出../../../../../etc/passwd 只清除了前面的./.../../ Codeql分析 生成 codeql 数据库 codeql database create /Users/yhy/CodeQL/database/go/grafana/v8.2.6 -s ./ --languagego sink os.open(),这个显而易见。 import go import DataFlow::PathGraphclass Sink extends DataFlow::Node {Sink() {exists(DataFlow::CallNode call |call.getTarget().hasQualifiedName(os, Open) |call.getArgument(0)  this // 标记 sink 为 os.Open 第一个参数)} } source 我将 Source 点定在了macaron.Params()函数。 网上的文章都是以github.com/grafana/grafana/pkg/api/routing.RouteRegister作为起始点这就导致一个问题写完的规则只对grafana项目起作用不通用。 仔细研究会发现RouteRegister的实现是以gopkg.in/macaron.v1框架为基础的但是官方的go/ql/lib/semmle/go/frameworks/Macaron.qll只是实现了一个重定向相关的检测规则emmm,只能自己动手写了。 写着写着忽然发现怎么也获取不到macaron.Params, 去看 macaron[4] 源码才发现这个函数就根本没有是Grafana自己实现的。我们来分析一下这个 Params 函数。 其实就是获取net/http中Request.Context的值而参数r又是通过pkg/macaron/context.go 。 也就是 macaron[5] 框架中的Context结构体中的Req成员这个Req就是我们要找的Source点。 修改go/ql/lib/semmle/go/frameworks/Macaron.qll文件加入如下代码 private class UserControlledRequestField extends UntrustedFlowSource::Range, DataFlow::FieldReadNode {UserControlledRequestField() {exists(string fieldName | this.getField().hasQualifiedName(gopkg.in/macaron.v1, Context, fieldName) | fieldName  Req)}} 单独执行可以找到污染点。 直接将 sink、source 拼接跑并没有出结果因此需要一些处理来连接数据流。 isAdditionalTaintStep 这里 tyskill[6] 师傅说的很详细引用一下 限制函数为Params。 函数可被污染就说明参数可控那么就让pred节点作为参数。 SimpleAssignStmt结构表示一个赋值表达式如abRhs表示等号右边通过查看源码可知Params函数调用几乎都是在等号右边因此可以通过该结构减少误报。 最后将输出节点连接到赋值表达式。 override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {exists(CallExpr call, SimpleAssignStmt sas |// call.getTarget().getName()  Params and// 限制为 Params 函数会产生局限性去除call.getAnArgument()  pred.asExpr() andsas.getRhs().getAChild()  call.getParent*().getAChild() and// 使用getParent*()是因为等号右边不止有光秃秃的Params方法调用如漏洞点就存在Jion函数拼接操作需要通过传递闭包getParent*()来获取完整表达式// 使用getAChild()则是要获取Params的方法调用不过测试发现用不用效果差不多所以也不懂为什么还要加这个sas.getRhs()  succ.asExpr()) }运行成功发现该漏洞。 加入工具监控、扫描 因为项目中调用 Codeql 将扫描结果保存为文件这里需在文件头添加一些描述,完整代码如下 /*** name read file* description read file* kind path-problem* problem.severity error* security-severity 6.1* sub-severity high* id yhy0/read-file* tags security* precision high*/ import go import DataFlow::PathGraphclass ReadFileSink extends DataFlow::Node {ReadFileSink() {exists(DataFlow::CallNode call |call.getTarget().hasQualifiedName(os, Open) |call.getArgument(0)  this // 标记 sink 为 os.Open 第一个参数)} }class ReadFileConfig extends TaintTracking::Configuration {ReadFileConfig() { this  read file }// 这里的 source 实现 UntrustedFlowSource ,方便其他框架通用, 对于Grafana ,我们已经修改了go/ql/lib/semmle/go/frameworks/Macaron.qll文件override predicate isSource(DataFlow::Node source) { source instanceof UntrustedFlowSource }override predicate isSink(DataFlow::Node sink) { sink instanceof ReadFileSink }override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {exists(CallExpr call, SimpleAssignStmt sas |// call.getTarget().getName()  Params and// 限制为 Params 函数会产生局限性去除call.getAnArgument()  pred.asExpr() andsas.getRhs().getAChild()  call.getParent*().getAChild() and// 使用getParent*()是因为等号右边不止有光秃秃的Params方法调用如漏洞点就存在Jion函数拼接操作需要通过传递闭包getParent*()来获取完整表达式// 使用getAChild()则是要获取Params的方法调用不过测试发现用不用效果差不多所以也不懂为什么还要加这个sas.getRhs()  succ.asExpr())} }from ReadFileConfig rfc, DataFlow::PathNode sink, DataFlow::PathNode source where rfc.hasFlowPath(source, sink) select sink.getNode(), source, sink, read file find on $., source.getNode(), user-provided value 将此 ql 文件路径加入配置文件config.yaml中, - go/ql/src/myRules/ReadFile.ql ,之后程序会自动对监控的项目运行此条规则等待捡洞即可(笔者已经捡到了^_^)。 效果图
http://www.pierceye.com/news/987450/

相关文章:

  • 手机网站源码asp网站快速排名技巧
  • 站点怎么建网页宁波网站建设设计制作公司
  • 黑龙江企业网站建设网站模板带后台 下载
  • 徐州在线制作网站营销网络是什么意思
  • 上海网站建设seo公司微信小程序制作教学
  • 信息化工作总结 网站建设十堰市有几家网站公司
  • 宠物网站建站目标做外贸的网站哪些是最好的
  • 垂直型电商网站如何做html5 开发的网站
  • 做网站可以不做后端吗渭南网站建设网站排名优化
  • 在线建站网页制作网站建设平台工商营业执照官网
  • 做网站用到的软件h5交互设计
  • 化工废料网站建设企业网站建设联系电话
  • 浙江高端网站建设公司什么是网页开发
  • 石碣网站仿做模具做外贸网站
  • 定制网站建设成本制作公司宣传片
  • 青岛低价网站建设达内it教育官网
  • 洛阳设计网站公司个人网站管理系统
  • 怎么可以预览自己做的网站天津市城乡建设网站
  • 本地网站开发宁夏建设工程招标投标信息网站
  • 网站建设服务费怎么记账维护一个网站一年多少钱
  • 电子商务网站建设定位设想我的网站为什么打不开
  • 旅游网站开发方案ppt移动商城积分和积分区别
  • 如何做网站推广自己的产品WordPress+百度+主动
  • 商丘网站建设推广公司赣州seo唐三
  • 产品网站设计计算机专业做网站运营
  • 做平台网站怎么做的wordpress获取当前分类下的子分类
  • 广州网站建设性价比长安高端装备网站设计公司
  • 电子商务网站推广计划沈阳建设工程造价
  • 网站备案接入商是什么网站语言版本
  • 个人做网站做什么样的话网站站点连接不安全