ORM 框架 SQL 注入点分析 (以Golang为例)

最近研究了一些现代 ORM 框架的 SQL 注入情况,做一些笔记吧。 GORM 注入点 gorm 注入点简单可以分为三种情况 检测转义 直接转义 schema 校验 如果 gorm 认为这个参数他不会是一个表达式也不会是`aaa`.`bbb` 的形式,从功能上也只可能是一个单纯的列名,这个时候 gorm 会直接给你套上 ` 同时对内部的内容全部进行转义,这种一般是不存在注入点的,例如 Association 函数。 另外部分多表关联(Associations)查询的字段会存在 schema 校验,如果对不上列名会在 sql 构建阶段报错,例如 Preload 函数,这些也是无法注入的。 那剩下的部分都执行一个检测转义的策略: 先检测`的存在, 如果不存在就套上,并假装存在,直到扫描另一个` 这个转义设计上是为了兼容性,并不出于安全性考虑,所以是比较好注的 根据注入点出现的位置分类,可以分为下面这几个 参数位置 函数 1 Group,Order,Exec,Having,InnerJoins,Joins,Not,Or,Pluck,Raw,Select,Table,Where 1… Distinct 2 Find,First,FirstOrCreate,FirstOrInit,Last,Take 参数位置 为 2 的一类基本是 gorm 新增的一些语法糖 API,不过从上表也可以看出 Gorm 设计的真的不错,API 风格真的非常统一。 案例 DB.Order("id = case when version() rlike '8.*' then ? else 0 end #").First(&a) DB.First(&a, "?=0 union select 1,1,version() #") SELECT * FROM `aaaa` ORDER BY id = case when version() rlike '8....

August 8, 2024 · BaiMeow

CTF是怎么出题的?关于今年 D^3CTF 的 OSPF Enhanced

前言 今年给 D^3CTF 出了一道 Web 一道 Misc,非常可惜都TMD有非预期,出的最差的一回了。 Web 那道题暂且不提,那道题在出题角度来说其实没有任何难度,只是把原项目的Docker镜像稍微重打包了一下交给平台。 今给大伙讲讲我们这道 Misc 网络题,这道题前前后后打包容器和平台联调等等,非常有难度,可能耗费了我将近一周的时间。 早期构思 其实一早就定下了出一道网络相关的 Misc 题的基调,问题在于具体整点什么活上去比较有意思。 早先 D^3 CTF 出过一道网络相关的 Misc 赛题,原题叫 O!!!SPF!!!!!! 那道题非常简单,只需连上 OSPF 就可以拿到 flag 了,没有什么难度。 Soha 每年都会出一些网络相关的新年红包,他的题目也是遵循 CTF 的形式的,所以也在我的参考范围之内。 翻阅了很多,决定题目主体就出一个路由劫持,具体劫持的手法来源于一次真实路由劫持,不过那次环境比较复杂没通,但是我觉得这个思路还可以再利用,就只能出成题这样分享一下。 此外,Potat0 还给我提供了一个 rDNS 的小 trick,作为套娃的一部分,这个 trick 也成为了题目的一部分。为了防止选手写了一坨脚本打完卡在这个 trick 上,因此还设计将这个 trick 前置了一下。 开始出题吧 出一道这样的网络题和传统 CTF 题目不一样,他需要去模拟一个网络环境,首先在本地测试的时候,最容易想到的就是 docker compose,可以添加几个 network,然后将他们绑定到容器上构建一些内网出来。 我们大概需要一个这样子的内网环境,简单来说就是三个设备其中一个是路由器,负责两个内网的路由,openvpn 从这里接入并且桥接到 100.64.11.0/24 上。 好吧那就开工吧,把这个网络拓扑写进 docker compose 以下 docker compose 并非最终版本,有意留下了一些错误,后文会纠正 version: '3' name: ospf-enhanced services: router: image: router build: ....

May 7, 2024 · BaiMeow

一种借助PCDN实现隐秘通信的方法

本文仅供安全研究学习使用 前言 早先找实习的时候了解了一下玄武实验室,再读了一遍玄武那篇域前置的文章,这里贴一下链接 https://xlab.tencent.com/cn/2021/05/14/domain-borrowing 这是篇老老老文章了,这篇文章里提出了利用公共 CDN 服务来做 C2 通信的隐藏的一种手法 在防火墙来看,高可信域名+高可信 IP,唯一瑕疵就 DNS 对不上。即使是专门部署 TLS 解密设备来针对这一类的,一看 Host 对的上,也大概率放行。所以走这种 TLS 的 c2 流量是非常难去识别的,因为他伪装得实在是太好了。 但是想要用这个手法做隐蔽通信有个前提,就是需要在 CDN 厂商那边创建这个高可信域名的资源。 大多数的 CDN 供应商,他们的 CDN 往往都会有一个所有权校验,只有你证明你拥有这个域名,你才能创建这个域名的一个 CDN 资源。 在做 DNS 校验的 CDN 厂商创建 CDN 资源比较困难,DNS 污染是运营商层面的东西了。 不过在规模比较大的提供 CDN 服务的云厂商中,AWS 的验证方式是少数不同于其他的,他需要的是一个域名下的TLS证书用作所有权校验,因此利用这个手法做隐蔽通信的一个最低门槛,就是必须要有一个来自高可信域名的证书。 原文提到这点时,建议利用漏洞获取证书,但是这并不容易,越是高可信的域名,他背后的公司组织可能其实做的防御越强,所以域前置就有了这样的一个硬门槛。 那么,有没有办法以较低的代价得到一个来自高可信域名的证书呢? PCDN 与证书 PCDN 中文又称点对点内容分发网络,你可能没实际玩过,但是肯定也听说过运营商封杀 PCDN 的事情。 PCDN 的出现是因为正常的 CDN 和商业宽带的价格比较高昂,尤其国内这种宽带金贵的地方,所以就出现了利用用户闲置的上传带宽做内容分发的应用,他被称之为 PCDN,对企业而言 PCDN 最最显著的特点就是廉价。 既然上面提到,PCDN 是用户在扮演CDN做内容的上传,那么当他跑 HTTPS 流量的时候,他是怎么实现 TLS 加密的呢? 没有什么花活,他就是单纯地把相应的 TLS 证书交给了用户,然后做了一些加密,不让用户能够简单获取到证书。 那么既然证书都给我们了,而且在我们本地做到解密,我们肯定是可以解密出证书的原始内容的 无论有些是有现成的脚本,有些可能需要你做一点点逆向,总归是有办法拿到原证书的,这里就不具体阐述证书是怎么拿到的了。...

April 29, 2024 · BaiMeow

GOSTv3 扩展开发 —— SM4 加密隧道

Gost 是什么 Gost 是 Golang 语言编写的网络隧道工具。得益于纯 Go 开发以及 Go 在网络开发以及交叉编译方面的强势,Gost 能够在几乎任何地方近乎零依赖地运行,因此 Gost 最早作为一个方便好用的 socks5 server 启动器在内网渗透等领域开始出名。 Gost 即将正式推出他的 v3 版本,这个版本改变之大,几乎相当于是一个独立的应用。不得不承认,Gost 的作者对于网络和隧道是有一些他的想法的。给大家解读一下在我看来的 Gostv3 设计的核心思想。 Gostv3 核心思想 在介绍 Gost 的配置之前,我们需要先理解一个概念 “传输层与应用层分离” 假设一个socks5隧道,如果我们暂时只考虑tcp代理的情况,那么这个事情其实很简单。先在客户端和服务器之间建立一个tcp连接,随后就按照socks5协议所描述的,协商版本号和认证方式,进行认证,发送代理地址,相应结果,建立隧道,这事情就好了。 隧道应用只是一个应用层的例子,我们可以把上述所做的所有事情分成两部分 建立可靠连接 (传输层) 处理应用层消息 (应用层) 对于大多数基于应用层网络协议,我们可以把他们所做的都抽象为这两件事情。 在常见的网络协议里,传输层与应用层往往是绑定的,但这是没有必要的,我们完全可以为一个应用层协议配置另一个传输层协议,唯一的要求(如果原来是tcp)就是建立可靠流式传输。 这种做法并非是没有先例的,互联网的发展过程中 web 服务逐渐使用 https 替代 http,这就是将 http 协议的应用层部分抽象出来并将其传输层协议替换为 tls 带来的一个结果。 大可放开想象,除了替换成 tls,为什么不能替换成更多的能够实现可靠传输的传输层协议呢?比如说 kcp websocket ssh quic 这些协议可能乍一看怎么可能是一个传输层协议,但是他们确实能够提供可靠传输,相对于我们的应用层而言,他就是传输层。 一个网络协议,他并非属于一个固定的层,这其实也是学术界和工业界的区别,学术界可以理想地对网络协议进行划层,但是工业界只在乎能不能用好不好用。就像很多路由协议,你可能很难给他没有争议地划分到一个层去。 这就是我认为的 Gostv3 最核心的设计,他拆分了隧道协议的网络层和应用层,使他们能够自由组合 Gostv3有四种最基本的概念(listener,handler,dialer,connector) block-beta columns 5 arr1<[" "]>(right) listener1["listener"] space connector2["connector"] arr2<[" "]>(right) space arr3<["...

March 15, 2024 · BaiMeow

在实验网络中使用 step-ca 签发 SSL 证书

DN11 是受 DN42 启发而搭建的一个实验性网络,目前用于杭电范围内,对网络感兴趣的同学学习使用,DN11和DN42非常相似,他们之间的经验都有广泛借鉴意义。 在真实的互联网中,我们常常会通过校验 SSL 证书的方式创建加密 socket 来访问互联网上的资源,这能够有效阻止他人看到通信的内容。而在 DN11 中,由于每个人都相当于是 ISP,流量可能途径每一个人,随时可能被人抓取,因此使用 SSL 证书这件事就更为重要了。 本文将在使用 PDNS 搭建好实验性网络 DNS 的基础上使用 step-ca 搭建 ACME Server 并使用 acme.sh 签发证书。 0. 实验环境介绍 DNS服务器自建已经完成了,通过 anycast IP172.16.255.53可以解析顶级域名dn11。 acme.dn11域名已经解析到172.16.255.2,并且实验机已经宣告了这个 IP。 已经获取到根证书,中间证书,中间证书的签名密钥,而根证书密钥安全起见由他人代管。 GOGOGO! 1. 初始化 step-ca step-ca 提供了很多种安装方式,裸机,docker,k8s等等。由于计划部署 step-ca 的机器上并没有集群环境,裸机又不方便 remake,通过 docker 镜像安装便成为了最佳选择。 https://hub.docker.com/r/smallstep/step-ca docker pull smallstep/step-ca docker run -it --rm -v step:/home/step smallstep/step-ca step ca init --remote-management 上面的命令会拉取 step-ca 的镜像,使用step ca init --remote-management替换原有的启动命令启动容器同时创建一个名为 step 的卷挂载到 /home/step,还使用了-it参数进入交互式。...

October 8, 2023 · BaiMeow

IBGP FullMesh 实现多节点自治域

最近不少群友有把自己的其他服务器也接入自己的 AS 的需求,那这篇教程也是时候该出了。 总览 这个事情比较复杂,我们先不急着开始配,先了解一下我们需要一个什么效果。 DN11 作为一个发展了有一段时间的实验性网络,我们目前有很大一批人,他们手上都已经有了一个节点,并且在这个节点上配置了 BGP 从而联通到其他节点。那这个情景下,他们的自治域就是由那一个节点组成的单节点自治域。我们现在需要添加一个新的节点到这个自治域,我们需要解决两个问题。 这两个节点之间需要组网 需要把某一个节点获取到的 BGP 路由与其他节点做一个同步 这两件事情我们分别将通过 OSPF 和 IBGP 实现。OSPF 是 DN11 的老东西,从使用者的角度看,就一个通过获取全局拓扑计算最短路的路由协议。IBGP 是 BGP 的一种,BGP 协议分为两种 EBGP 和 IBGP, 他们分别用于将 BGP 路由发给其他 AS 和将 BGP 路由同步到自己 AS 的其他节点。 IBGP 需要配置 fullmesh,这是由他的设计决定的,IBGP 只会把自己收到的 EBGP 路由转发给自己的邻居,对于自己收到的 IBGP 路由他并不会做一个转发,这主要是为了防止产生环。这其实无所谓,节点多了我们可以用 rr 反射器甚至多级 rr,还可以玩联邦,这个日后再说。下面将以双节点为例,配置一个多节点的 AS。 入口文件 由于这次的配置文件比较长,我们会把他切分到各个文件中,所以先介绍一下入口文件bird.conf的配置 log syslog all; debug protocols all; router id 172.16.4.6; protocol device{ } protocol kernel{ ipv4 { import none; export all; }; } ipv4 table OSPF_table; ipv4 table BGP_table; include "/etc/bird/ospf....

September 23, 2023 · BaiMeow

校园网打洞纪实,绕个普普通通的防火墙

WireGuard 在 i-HDU 之死 突然集体下线了 前几天接到悲报,说是 Vidar-Team 300b 节点从 DN11 下线了 校园网需要走web认证登陆,所以起初我以为是校园网的登陆脚本炸了,找个人把自己账号登上去救一下急就好了 后来派煎包去看看,他回来告诉我,Vidar 的 WiFi 有网,网很好校园网也登着 这就很让人迷惑了,按理说有网的情况下,万万不该这么多隧道一起炸了 由于是暑假,Vidar 没有网管在学校里,连不进去无能为力,这件事就这么搁置了好几天 SSTP 你怎么活着? 自爆炸后,一转眼就过了好几天,因为前两天刚刚冲了一手新版本 RouterOS,搞得我以为这个是 RouterOS 的 bug 直到… Liki 发现他的 sstp 依旧稳如老狗,我赶紧找了台 frp 穿透出来的机器测了一下校园网的 WireGuard 情况 这个案子破了,WireGuard 被校园网拦截了。 缝缝补补 原来只是封杀了一个协议而已,不算什么大事情,得赶紧去修网了 于是在校园网里扫了一下 ip,把路由器的 WAN IP 先扫出来,然后借着上面提到的这台 frp 穿透出来的校园网机器作为跳板,起了新的 frp 内网穿透 现在总算能连上路由器了,果然 WireGuard 全部掉线了,SSTP 还健在。 赶紧找了 potat0 把他最爱的 WireGuard in VLess 先部署了上去,临时恢复了网络。 转生成为 WireGuard-mix WireGuard 是寄了,但是我确实很喜欢 WireGuard,不然我也不会 ALL IN 救一下 WireGuard 吧,还是很简单的啦 gogogo WireGuard 有一个用户态版本,叫做 WireGuard-go,是 go 实现的...

September 16, 2023 · BaiMeow

BGP 组网,DN11 与 VidarNetwork 的并网试验

DN11 是受 DN42 启发而搭建的一个实验性网络,目前用于杭电范围内,对网络感兴趣的同学学习使用,DN11和DN42非常相似,他们之间的经验都有广泛借鉴意义。 DN11配网第二期,接上文 “使用 Bird2 配置 WireGuard + OSPF 实现网络的高可用”,这是一篇用于 DN11 的 BGP 配置教程 随着 DN11 的扩大,使用 OSPF 进行集中管理已经变得麻烦起来了,此外还能看到一堆隧道IP污染路由表 也有不少人手上有多个内网,不得不打破 DN11 原先一个人使用一个/24网段的约定 近期又在考虑和 VidarNetwork 并网的事情,最终合并完的网络会变得相当庞大,或许是时候转移到BGP上去了 准备 选择一个AS Number BGP 是用于连接不同 AS 的路由协议,现在定义每一个人选取自己的AS号管理自己的AS。对于已经有AS号的,可以使用已有的AS号,没有AS号的建议选择 421111xxxx 并登记进文档。 选择自己的网段 首先,不要一次性宣告大于/24的网段,/24已经很够你折腾,如果你有多个路由设备并且确实有多个真实子网,那么你可以宣告两个或者三个/24的网段。 也不要为了省网段资源而采用/25这种做法,没有必要,只会给你带来更多的麻烦。 如果你是新加入DN11的成员,虽然DN11改为BGP的同时我们放开了网段的限制,但是真别用常见网段 172.16.x.0/24 (这是DN11之前使用的网段,.17 .18这些段docker会用,不要宣告) 10.x.x.0/24 (注意避开移动的内网段,不要使用太高或者太低的地址) 11.x.x.0/24 (美国国防部的公网段其中之一,他们一般当内网段用) 100.64.x.0/24 (比较少见的保留段) 192.168.x.0 (真的很容易冲突,不要用) 此外你还需要避开HDU已经使用了的内网段,具体有哪些段可以在飞书知识库上查找 隧道 本小节写给 Openwrt 用户,ros 用户应该都会,linux 用户参考 wg-quick 使用教程。但无论你是什么用户,请务必看完本章节的内容,铺设隧道这件事有一些实践上的做法可供参考。 安装wg-quick-op 我给 openwrt 专门写了一个用来配置 wireguard 的工具,他会帮你处理开机启动,ddns 的问题的同时你可以使用 wg-quick 配置文件的所有配置。主要是基于 wg-quick-go 修改,定制了一些实用功能。...

June 1, 2023 · BaiMeow

d3go write up

目录穿越读取源代码 directory traversal to dump source code go embed * 的错误使用,导致源代码被打包进程序。 The incorrect use of go embed * results in the source code being packed into the program. 再结合错误的静态文件托管,导致/../路径可以列目录获取源代码 This, combined with incorrect static file serving, results in /../ listing directory to get the source code. Gorm 软删除注入 代码审计,发现 管理员账户是数据库中的第一个用户,而这个用户目前无法登陆 对于/register接口,controller使用了c.ShouldBindJSON(), db层对其返的值直接进行一个db.Save()到数据库的操作,可以注入gorm.Model相关字段 因此可以构造注入deletedat字段,使得原来的admin被软删除 A code audit was performed and found that the administrator account is the first user in the database, and this user is currently unable to log in For the /register api, the controller uses c....

May 4, 2023 · BaiMeow

深夜碎碎念,无缘相识,更无缘相恋

以下内容被密码保护

March 26, 2023 · BaiMeow