Author Archives: wind

Length extension attack

长度扩展攻击(Length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。简单来说,就是通过特殊的手段来扩展消息,可以伪造一个不经过私钥签名的Hash签名结果。

攻击条件

  1. 已知私钥和消息
  2. 采取了 H(密钥 ∥ 消息) 此类构造的散列函数

攻击效果

  1. 伪造消息签名

攻击场景

  1. API请求签名:MD5(Secret + k1,v1 + k2,v2 …) ,注意secret在前
Continue reading

Padding oracle attack

适用于CBC模式下的AES,DES,3DES等分组密码。

攻击成立需要:

  1. 能控制初始向量 IV 和密文 CT
  2. 能触发密文解密流程(选择密文),得知解密结果以及是否padding异常

攻击效果:

  1. 解密密文
  2. 生成任意明文的密文

攻击场景:

  1. 加密协议为SSLv3的HTTPS请求
  2. 客户端存储形式的敏感凭证
Continue reading

使用Hopper Disassembler轻松破解Gem Menu for OneNote

最近喜欢上了OneNote,有一款小插件Gem Menu for OneNote功能还蛮实用的。下载下来,点击注册激活软件,一股原始的味道扑面而来,想必没有经过很强的保护,于是直接动手反编译破解这个小软件。

在Mac上可以使用Hopper Disassembler很方便的进行反编译,我们打开Gem Menu for OneNote的二进制文件,拖进Hopper Disassembler即可完成反编译,得到可执行文件的汇编代码和更直观的C语言代码等,方便我们理解程序逻辑:
Continue reading

抽奖活动中的黑灰产对抗

有羊毛的地方,必有薅羊毛者。近日破站为了预热 98E 手办,推出了个抽奖活动,需要通过用户互赞达成抽奖条件,并且以先到先得,无限抽奖的方式清空奖池。

显然这种活动很容易被羊毛党攻击,可利用点有:

  • 将养好羊毛号拿出来批量相互点赞
  • 即将开始抽奖时,控制羊毛号批量无限抽奖

攻击者只需要写个简单脚本就能完成上述攻击,攻击成本低。这时候防御方则需要考虑如何用尽量低的成本进行防护,而且若稍有不慎,服务还可能被攻击者打挂,下面将从四个方面介绍攻防对抗手段:

  1. 增加参与门槛
  2. 应用层的防御
  3. 业务风险控制模型
  4. 切断利益链

Continue reading

微服务架构的认证与鉴权

微服务很酷,但流量在各服务间欢快穿梭的背后可能隐藏着重大安全隐患,黑客也许只需要通过一个点,就能将整个体系击溃。

相比单体应用,在微服务架构的身份认证和鉴权需要考虑的点要多许多。在单体应用中的只有两个对象,即用户与整体的系统,相对简单。

在微服务架构中,对象可能有用户、API 网关、身份认证鉴权服务和其他服务。系统由多个服务组成,并且为了更好的伸缩性,每个服务都应该是无状态的,而服务的对外网络也许并不是完全隔离的,服务间是不可信的,服务间也需要认证和鉴权。

为了保持微服务的简洁轻量,可以将身份认证和鉴权可以单独的拆分出来作为一个或两个独立的服务,由这些服务负责授权,其他服务可以根据用户携带的令牌进行认证。当然,若是能做到完全隔离,并且服务间完全可信,也可以在 API 网关统一解决认证和鉴权,能减少各服务的关注点,把注意力集中在业务本身。服务间通信有一定的成本,如果每个请求过来,除了 API 网关以外,请求涉及到服务都调用一次鉴权服务,这会大大增加鉴权服务的压力,可能会成为系统瓶颈并带来隐患,下面为了平衡安全性和性能来进一步分析选型。

Continue reading

Android 无源码调试

在逆向 Android APP 的过程中,有时候盯着一串加密算法,不断地在脑子模拟,并发生“栈溢出”和“OOM”。动态调试往往比静态分析更为生动和直观,但又苦于没有源码,无法调试,但这个其实真的可以有。

Android 通过 Dalvik VM 执行指令,在打包 APK 文件时,Java 源码将编译成 Dalvik 可执行文件,将 Native 代码编译成 .so 二进制 JNI 函数库,下面将介绍这两种代码的无源码调试方法。

Continue reading