代码安全审计经验集(上)

通过fuzz方式绕WAF

在目标系统发现一处SQL注入漏洞,但前置了一个某大厂的WAF,通常的套路是内联注释、编码、参数污染、分块传输等等,但方法都尝试了一遍之后,还是突破不了WAF。

代码安全审计经验集(上)_第1张图片

最后,绕过的技巧是插入了一个"\", 通常select version\()无法在数据库中执行,但是在这个应用中,插入"\"能绕过WAF执行SQSL,select version\()会被WAF认为该语句不能执行遂被放行,之后可能是网关把请求中的转义符号剔除,导致select version\()又变成select version()。

代码安全审计经验集(上)_第2张图片

开源软件自带的弱口令

不少用户在自己安装部署开源项目的时候,难免遇到各种环境适配、缺少依赖的问题。为了方便用户体验产品,有的开源项目会提供线上体验环境,但有时这些用于演示的测试账号可能会因为版本控制问题被带到生产环境。

代码安全审计经验集(上)_第3张图片

对于这类项目,不妨去项目源码看SQL文件中是否有体验环境的账号口令,如果有,那么用户部署后就会把这个弱口令账号带到自己正式环境中。用户部署后admin的账号一般会被修改为强口令,但是demo账户却容易被遗忘,实际测试发现,互联网上80%的该系统可以用这个demo账户的弱口令登录。

代码安全审计经验集(上)_第4张图片

利用参数变化绕过权限控制

对于使用了AOP、Shiro做了鉴权的服务,仍然有被绕过的可能,有时候是安全和业务功能冲突,有时候是鉴权不严格,比如下面的案例:

一个SpringBoot的服务由管理员创建更新,使用了AOP对接口鉴权,且要同时校验两个DePermission,pid对应的DePermission配置的level属性值是5,普通用户的level是1,小于这个level,也就是说,普通用户没有权限调用update方法。

代码安全审计经验集(上)_第5张图片

再看AOP中的鉴权代码,如果传入的AOP属性为空,则直接返回true

代码安全审计经验集(上)_第6张图片

于是,使用level小于5的普通用户去调用该接口,只传入id指定的应用,不传入pid,pid对应的对象就会为空,即可绕过权限校验更新该应用。

因此,在安全测试中,某些高权限接口的调用可以尝试删除某些参数再去调用,说不定会发现类似的越权问题。

代码安全审计经验集(上)_第7张图片

利用Authorization滥用添加管理员账户

一次测试项目中,系统只分配了普通用户账号,需要对用户系统和管理后台做测试,先输入任意账号密码登录管理后台。

代码安全审计经验集(上)_第8张图片

登录请求如下:

代码安全审计经验集(上)_第9张图片

查看系统提供的接口,发现其中包含一个新增用户接口:

代码安全审计经验集(上)_第10张图片

直接调用该接口会提示未授权:

代码安全审计经验集(上)_第11张图片

于是先登录上述的用户账户,获取一个普通用户账号的Authorization(JWT凭证):

代码安全审计经验集(上)_第12张图片

将这个Authorization添加到上述管理后台的添加用户的接口sys/user/add 的请求头中,即可以成功添加管理员账户。

这里的后台代码应该只是校验了Authorization的JWT是否不为null且没过期,满足条件就会调用sys/user/add接口并执行新增用户操作,但并未校验这个Authorization的用户身份。

代码安全审计经验集(上)_第13张图片

之后用该账号便可以成功登录管理后台。

代码安全审计经验集(上)_第14张图片

在线安装功能的命令注入漏洞

对于在线安装与卸载这类的功能,如下图所示:

代码安全审计经验集(上)_第15张图片

后台实现可能是调用系统中的wget或者curl命令去指定URL下载安装包。

代码安全审计经验集(上)_第16张图片

于是通过可控的URL拼接命令即可实现命令注入:

代码安全审计经验集(上)_第17张图片

代码安全审计经验集(上)_第18张图片

作者:RoShine

2024年1月29日 

洞源实验室 

代码安全审计经验集(上)_第19张图片

你可能感兴趣的:(网络安全)