0%

母校计算机院的李樾、谭添老师讲的课,听了第一节课就哭了,决定做一下笔记,课程网站 https://pascal-group.bitbucket.io/teaching.html。

PL知识体系

image-20200802113608162

如上图所示,主要分三大块,理论部分包含语言设计、类型系统、语义和逻辑检查;环境部分包含编译器和运行时设计等;应用部分包含程序分析、程序验证和程序生成等,本课程主要关注于应用方面的程序分析。

阅读全文 »

悬镜的一个技术分享会,大致讲了三种IAST的实现,这里做一个笔记总结。

IAST简介

IAST (Interactive Application Security Testing) 也叫灰盒测试,即介于白盒和黑盒之间的一种测试,这一场景下的技术不但关注程序输入输出信息(像黑盒程序那样),还可以(注意只是可以,后面会细说)了解部分程序内部逻辑(像白盒测试那样)。因此具备黑白盒测试的优点,被认为是下一代安全扫描技术,被各个行业所关注。许多黑白盒测试技术稍加改造和结合,就可以变为灰盒测试技术。

阅读全文 »

OpenRASP是一种较为成熟的RASP技术开源实现,技术思路主要是上一篇文章中的主动型RASP原理,详细可以见hook函数列表(商业版有动态污点追踪),本文为试用报告,之后有时间会深入看看代码。

安装

安装后台

  1. 安装MongoDB和ElasticSearch(5.6~6)

  2. https://packages.baidu.com/app/openrasp/release/latest/下载rasp-cloud.tar.gz

  3. 解压并配置conf/app.conf

    1
    2
    3
    4
    5
    6
    7
    [prod]
    EsAddr = http://127.0.0.1:9200
    EsUser =
    EsPwd =
    MongoDBAddr = 127.0.0.1:27017
    MongoDBUser =
    MongoDBPwd =
  4. 启动./rasp-cloud -d,用户名密码为openrasp::[email protected],后台如下图所示:

    image-20200629161638149

阅读全文 »

Sqreen 作为一款IAST产品,用户在项目中导入他们的agent,之后可在控制台查看检测到的安全风险,并进行防御(RASP)。

技术介绍

如下图所示,Sqreen主要由三个组件组成,MicroAgent、Security Engine和Sqreen Platform,Security Engine部署于MicroAgent内部,开发者只要在启动应用时倒入MicroAgent即可,Platform主要用于接收Agent信息并且可视化给用户。

阅读全文 »

本文首次发表在慕测头条公众号,这里只作归档用

背景意义

随着人们对软件安全的不断重视,静态安全扫描系统被部署于开发流程。相对于其他传统分析方法,污点分析技术由于具有较高的可解释性和准确性,目前作为挖掘 Web 漏洞的常用技术,广泛应用于开源和商用扫描器中。

然而,污点分析方法存在种种不足。首先,污点分析无法处理容器类型,静态污点分析只能将容器变量(如Map、List变量)的传播规则设为传播/不传播污点,造成过污染/欠污染;其次,污点分析无法处理控制流,污点分析并不能识别用于检查数据是否合法的分支语句,导致误报;最后,污点分析无法处理特殊的传播条件,如SSRF漏洞要求攻击者能操纵域名,若污点拼接在URL参数部分,则代码不存在漏洞,而污点分析仍会报告漏洞。为解决这些问题,目前安全工程师只有手动设计精巧的规则,可即使这样仍会产生大量误报甚至漏报。

阅读全文 »

写毕设调查背景知识时做的,在t00ls90sec发过帖子,这里做归档用。

词法分析技术

词法分析技术是最简单的一类漏洞挖掘技术,其主要思想是将代码文本与归纳好的缺陷模式进行匹配,以此发现漏洞。由于其不深入分析程序结构和语义,往往只能挖掘较为简单的一类漏洞,并且存在相当高的误报率,在实际场景下应用较少,但由于其思想简单,适用性很广,目前也还存在类似工具,如:MobSFCobra

阅读全文 »

Python 开发扫描器时往往会调用其他第三方工具,但是通过 os.system()或者其他命令中是会有这样或那样的坑或不足,本文对这些问题进行总结并提出解决方案,并在结尾给出了一个封装好的类,能较为完美的解决Python调用第三方命令的问题。

需求

  1. 首先,我可以调用任意命令,并且可以在命令执行时向输入通道(stdin)传更多输入,同时Python能实时获取输出通道(stdout)和错误通道(stderr)获程序输出,注意是获取输出,而不是单纯的将输出重定向到屏幕或文件中;
  2. 我可以通过返回值,或者程序输出判断第三方程序执行是否出错,如果出错抛出异常或者进行异常处理;
  3. 执行命令是最好可以设置超时时间,防止子命令假死而影响主程序;
  4. 这段调用程序应该是跨平台的,毕竟Python本身就是跨平台语言。
阅读全文 »

原理

触发入口

登录点击记住密码时,有rememberMe,下次登陆时会带rememberMe的cookie,rememberMe存在反序列化问题

1563415886850

序列化入口

调试得到序列化入口和解密方法:

1
2
3
4
org.apache.shiro.mgt.AbstractRememberMeManager#rememberIdentity(AuthenticationToken, AuthenticationInfo):321
org.apache.shiro.mgt.AbstractRememberMeManager#rememberIdentity(Subject, PrincipalCollection)
org.apache.shiro.mgt.AbstractRememberMeManager#convertPrincipalsToBytes(L360:序列化)
org.apache.shiro.mgt.AbstractRememberMeManager#encrypt(加密方法)
阅读全文 »

原理

shiro1.2.5后秘钥不再硬编码,但是采用CBC加密会产生padding oracle攻击,又因为java序列化结构体后可以加垃圾字符,所以攻击能够成功

解密时的调用链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
org.apache.shiro.mgt.AbstractRememberMeManager#convertBytesToPrincipals // 不论哪个异常都会返回null,上层302跳转
org.apache.shiro.mgt.AbstractRememberMeManager#decrypt
org.apache.shiro.crypto.JcaCipherService#decrypt(byte[], byte[])
org.apache.shiro.crypto.JcaCipherService#decrypt(byte[] encrypted, byte[] key, byte[] iv)
org.apache.shiro.crypto.JcaCipherService#crypt(byte[] encrypted, byte[] key, byte[] iv, int MODE):
org.apache.shiro.crypto.JcaCipherService#crypt(javax.crypto.Cipher, byte[] encrypted):459 //throw Unable to execute 'doFinal' with cipher instance
javax.crypto.Cipher#doFinal(byte[] encrypted) //this=(key+iv+mode) // jce.jar包 调试直接在这下断点
com.sun.crypto.provider.AESCipher#engineDoFinal(byte[] encrypted, startIdx, len)
com.sun.crypto.provider.CipherCore#doFinal(byte[] encrypted, startIdx, len)
com.sun.crypto.provider.CipherCore#fillOutputBuffer(encrypted, startIdx, iv, startIdx, len, encrypted)
com.sun.crypto.provider.CipherCore#unpad(len, decrypted)
com.sun.crypto.provider.PKCS5Padding#unpad(decrypted, startIdx, len) // throw BadPaddingException
org.apache.shiro.mgt.AbstractRememberMeManager#deserialize(serialized)
org.apache.shiro.io.DefaultSerializer#deserialize(serialized) // invalid stream header
阅读全文 »