代码白盒安全总结
认证框架
- 认证作用:接口认证的主要作用是保障能接入系统的请求都是有服务授权的用户,防止未授权访问
- 推荐认证方案
- 拦截器
- 过滤器
认证常见问题
- 不认证特殊接口(黑白名单),黑白名单不能使用包含类判断,应该使用正则或者绝对匹配,同时获取url的方式也需要确认,保证获取的url是真正的路由
- Token防篡改验证
- 利用证书签名校验
- 利用密码学解密
- token 时效性性检验
- token基础授权(细粒度鉴权检测),要保证访问人是正确的权限
鉴权框架
- 鉴权框架指服务实现的通用鉴权逻辑如:AOP、注解装饰器以及封装的主动调用上报日志的函数或对象等,在每个接口中单独实现的鉴权逻辑不在此检查项中关注。 鉴权框架在设计及实现过程中应考虑支持用户细粒度的鉴权,包含:用户类型、用户角色、用户资源关系等,方便应对不同场景下的授权最小化管控
鉴权可常见问题
- 权限分组缺陷
eg:Group_Operator = [“Operator”,”Reader”] … 如上Group_Operator角色组中包含reader角色,导致即便注解中要求有operator权限组,因为该组中包含了低权限的reader角色,导致用户有reader即可操作
- 非严格匹配
判断用户是否拥有权限时,禁止使用字符串contains等非严格匹配如(短名绕过)
- 用户类型
要分清是人机账号还是机机账号权限,确保不会相互冲突
- 默认权限
要保证合理的默认权限,防止用户越权或者权限过低。
日志框架
审计日志
审计日志是安全审计和事后回溯的唯一依据,也被认为是最重要的日志质疑。此处只关注日志记录框架实现的安全性,具体接口有没有记录日志需要根据策略在检查API时筛查。 审计日志六要素:
- 事件发生的时间;
- 用户ID;
- 访问发起端地址或标识(如关联终端、端口、网络地址或通信设备等);
- 事件类型;
- 被访问的资源名称;
- 事件的结果。
审计日志常见问题
- 存储数据库字段长度过短,导致日志绕过
- 上报系统接收日志规则,导致审计日志被绕过
为保证审计日志安全可以服务本身存储方便后续排查。
越权排查
- 接口隔离:人机和机机分开访问
- 资源隔离:用户只能访问用户的资源,服务只能访问服务的资源
- 审计日志用户id唯一
越权常见问题
- 需要鉴权的接口未鉴权
- 鉴权逻辑有问题
- 未接口隔离
- 权限分配不合理
API-REDOS
- 描述: 正则表达式拒绝服务(Regular expression Denial of Service-ReDoS)是一种拒绝服务攻击(Denial of Service )。开发人员使用了正则表达式来对用户输入的数据进行有效性校验,或功能逻辑中使用正则处理逻辑, 当编写校验的正则表达式存在缺陷或者不严谨时, 攻击者可以构造特殊的字符串来大量消耗服务器的系统资源,造成服务器的服务中断或停止.
- 原理
- NFA:NFA引擎是回溯引擎,可以对输入字符串中的每个字符计算多次,NFA还是表达式导向。
- DFA全称确定型有穷自动机,不支持回溯和捕获括号,匹配时以目标字符串为导向,又称为文本导向的引擎。系统会在匹配之前花一定的时间理解模式串,在匹配的时候不会进行目标字符串回溯(回溯在NFA里面解释),只需要从左到右扫描目标字符串一次,其中每个字符至多尝试匹配一次,所以又叫文本导向。DFA的最大特点是会保证返回一个目标字符串里面的最长匹配(且有多个分支时会同时匹配多个分支)
正则redos常见问题
- 使用通配符嵌套,导致正则匹配时间过长
- 未设置匹配超时时长
SSRF
- 描述: SSRF(Server Side Request Forgery,服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。简单来说,SSRF是利用服务器请求外部系统(例如攻击者控制的系统)的一个安全问题。
- 界面本原理
- 攻击者找到一个可以从服务器端发起请求的功能或接口。
- 构造恶意数据,让服务器发起请求访问内网系统或外网系统。
- 服务器接收数据后,会按照数据中的地址发出请求。
- 攻击者可以通过结果获得内网资产信息,或者利用请求访问其他系统。
SSRF常见问题
- 输入的ip被污染
- 输入的url 被污染
- 端口被污染
- 解决方案
- 白名单方式
- 谨慎使用对外调用,尤其是用户触发的
- 添加审计方式监控异常请求
XXE
描述:XML External Entity Injection即xml外部实体注入漏洞,简称XXE漏洞。XXE是针对解析XML输入的应用程序的一种攻击。 当弱配置的XML解析器处理包含对外部实体的引用的XML输入时,就会发生此攻击。 这种攻击可能导致信息泄露,命令执行,拒绝服务,SSRF,内网端口扫描以及其他系统影响。
- 攻击方式
- 许多XML解析器默认允许外部实体的加载,这可以通过声明外部实体来实现。
- 攻击者构造一个恶意外部实体,并通过提交数据的方式发送给XML解析器。
- 解析器在解析XML时,会根据声明去加载这个外部实体。
- 这样攻击者就可以让解析器去读取任意文件(通过file协议)、执行系统命令(通过expect协议)等。
- 如果外部实体获取的内容返回到XML响应中,还可能导致内网端口扫描、内网资产信息泄露等更严重的安全风险。
- 攻击者也可以构造指数型实体攻击(Billion Laughs Attack),通过声明极其庞大的外部实体来启动DOS攻击。 总之,XXE攻击是通过提交特制的XML文件,利用解析器的外部实体加载漏洞,达到获取服务器敏感信息或是执行远程代码的攻击手段。
- 解决方案
- 防范方式是对输入的XML数据进行校验,禁止外部实体的加载,使用不可扩展的解析器,以及切勿返回外部实体的内容到响应中。
反序列化漏洞
描述:序列化 就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化 即逆过程,由字节流还原成对象。Java中的 ObjectOutputStream 类的 writeObject()方法可以实现序列化,类 ObjectInputStream 类的 readObject() 方法用于反序列化。 问题在于,如果Java应用对用户输入,即不可信数据做了反序列化处理,那么攻击者可以通过构造恶意输入,让反序列化产生非预期的对象,非预期的对象在产生过程中就有可能带来任意代码执行。所以这个问题的根源在于类 ObjectInputStream 在反序列化时,没有对生成的对象的类型做限制;
- 排查方法
- python 着重检查Pickle
- java fastjson包
CSV/EXCEL注入
描述:Excel注入攻击是一种通过在Excel电子表格中的公式中插入恶意代码来利用Excel的一个漏洞。攻击者可以构造一个看似无害的Excel文件,其中的公式包含了恶意命令或代码。当用户打开含有这些公式的Excel文件时,公式会自动执行,从而实现攻击者的目的,比如获取控制权或者窃取信息等。
CSV/EXCEL注入常见问题
- 导出csv/excel文件功能
- 下载csv/excel文件功能
- 处理excel设置每个单元格为文本格式
SQL注入
描述:SQL注入是一种常见的Web应用程序漏洞攻击技术。其基本原理是:
- Web应用程序存在未过滤用户输入的安全漏洞。
- 攻击者可以在应用程序输入字段(如搜索栏、登录框等)中输入恶意构造的SQL语句代码。
- 应用程序将用户输入的数据拼接到SQL查询语句中,作为SQL语句的一部分执行。
- 这样导致了SQL语句的语义和逻辑被改变,执行了攻击者插入的可破坏或窃取数据的恶意SQL代码。
- 数据库服务器无法识别这是非法代码,会顺从执行造成数据泄露、服务器异常等后果。
SQL注入的防护方法:
- 使用参数化的SQL语句,而不是动态拼接SQL。
- 对用户输入的数据进行强输入验证,过滤特殊字符。
- 限制Web应用程序对数据库的操作权限。
- 使用最新的数据库和操作系统补丁。
- 在Web应用设置单用户输入长度限制。
总之,SQL注入攻击通过构造恶意输入代码,终究是利用了应用程序对用户输入过滤不严格的漏洞。因此开发者必须非常小心,对用户输入特殊字符进行转义,使用参数化SQL语句,以防止SQL注入漏洞。
文件上传
描述:文件上传主要面临的风险包括跨目录、文件类型(主要关注webshell、脚本及关键配置)和拒绝服务等
文件上传常见问题
- 落盘
- 跨目录问题
- 文件覆盖问题
- 文件权限问题
- 文件上传大小限制
- 上传频率
- 落盘文件与业务不熟进行逻辑隔离
- 落盘位置地权限其他用户可读写
- 压缩包
- 解压跨目录防护
- 解压炸弹
- 解压路径于业务路径隔离
- 用完清理逻辑
- 不落盘
- excel 文件大小正价内容行数限制和sheet数量限制
- 执行频率限制
文件下载
描述:文件下载主要关注:后台跨目任意文件下载、客户端任意文件写入和DOS问题(黑盒:下载用户无法控制文件大小的场景,如果涉及文件IO行为黑盒测试过程此处需管控好下载频率)
文件下载常见问题
- 跨目录问题
- 任意文件导出
- 导出DOS
- 导出文件类型
压缩包
描述:针对压缩机制和解压机制,攻击者可以进行扩目录攻击,压缩炸弹等安全问题
压缩包常见问题
- 扩目录解压
- 解压炸弹
- 文件大小
- 文件数量
- 解压目录与业务目录逻辑隔离
代码注入
描述:代码注入简单理解,就是系统将攻击者可以污染的信息作为某种表达式语法、代码进行执行。从而利用当前上下文的能力进一步对系统造成损害。 不同的语言基本都有将字符串当作代码执行方式,这个会被当作代码执行的字符串如果能被污染就可能会存在代码注入如:
- Python:exec、eval
代码注入常见问题
- 命令执行,在命令执行时是否做防护
- 反射代码段,是否有可篡改或者注入漏洞
命令注入
描述:命令上下文是bash、sh、cmd之类的“命令行”,由于这些上下文拥有类似堆叠和管道的命令执行流的能力,滥用这些能力导致非预期的系统命令被执行,就是命令注入问题,非shell上文如:cmd=”/tmp/service/getInfo.sh %s” 这类的命令前面没有”bash -c “就不存在命令注入问题,但根据具体执行的命令存在对应的选项注入问题。
代码注入常见问题
- Shell上下文(Bash、sh、cmd等):
- 命令拼接 bash –c \”id ”+username+”\”” 可以使用白名单方式进行安全加固
- 非Shell上下文(命令选项注入):
- “find ./ -iname ”+logPath 查看命令是否高危是否需要处理
响应泄露敏感信息
描述:在请求的返回体重包含明/密文密码、token、手机、邮箱、异常堆栈相关信息等,属于危险操作
响应泄露敏感信息常见问题
- 泄露账号密码
- 网络结构
- 堆栈信息
- 目录结构 总之,任意可以被攻击利用的信息都需要脱敏防止黑客利用这些信息,对系统产生攻击
日志打印敏感数据
描述:同上日志打印敏感信息,是常见的安全问题,也是安全测试需要重点关注的重灾区,常见的有请求参数、响应参数中包含敏感信息,日志在打印或上报请求或响应时导致敏感信息被泄露。
日志打印敏感数据常见问题
- 泄露账号密码
- 网络结构
- 堆栈信息
- 目录结构 总之,任意可以被攻击利用的信息都需要脱敏防止黑客利用这些信息,对系统产生攻击
暴力破解
描述:特征是存在敏感信息是否正确验证能力的API
暴力破解常见问题
- 攻击者想要获取用户密码,通过其他方式获取用户名后,对密码进行猜解,通过不断尝试最终尝试出正确密码的这个猜解的过程就是暴力破解
- 验证能力接口逻辑过于简单,未做防包里机制,比如限制重试次数,过多次锁定账号
- 未有验证码机制,系统过多被机器访问
防护手段
- 使用强大的密码。使用随机生成的长密码,避免使用简单的密码或字典中的常用密码。强密码可以大大减慢暴力破解的速度。
- 限制登录尝试次数。在用户登录失败超过一定次数后暂时锁定账户,比如10分钟后允许再试。这样可以防止暴力破解软件尝试大量密码。
- 使用CAPTCHA验证码。在登录页面添加验证码可以防止使用自动化脚本的暴力破解。但是需要注意验证码的实现质量,简单的验证码容易被机器绕过。
- 监控并分析登录活动。分析登录失败的次数、来源IP等信息,可以检测出暴力破解行为,及时采取措施。
- 使用双因素认证。增加除了密码以外的第二验证因素,比如手机验证码,可以大大提高安全性。
- 加密敏感数据。对用户密码和其他敏感数据加密后存储,即使账号被破解,黑客也难以获得明文敏感数据。
- 更新软硬件。及时更新操作系统、应用程序和安全补丁,关闭不必要的服务,可以减少被利用的安全漏洞。
- 启用账户锁定。在一段时间内登陆失败超过限制次数后,锁定账户一段时间。这样可以防止暴力破解软件持续尝试密码。
- 使用防火墙和入侵检测系统。使用硬件和软件防火墙,入侵检测系统可以检测并阻止暴力破解攻击。
- 定期审计日志。检查相关系统日志中是否有大量失败登录尝试的情况,及时发现和应对暴力破解。
总之,对任意的确验证能力的API,需要从防暴力破解手段中进行规避
不安全算法
描述:不安全加密算法场景,目前主要涉及的场景有,敏感数据加密和TLS套件使用的加密算法
不安全算法常见问题
- 使用不安全算法加密数据(md5 对称加密算法传输数据)
- 使用低版本的TLS和不安全的算法进行TLS通信
- 总之,尽量使用安全的加密算法进行敏感数据加密和安全通信
不安全随机数
描述:当系统中使用到随机数时,需要确认随机数是密码算法场景,即用作数据加密保护场景,其他非此用途场景无需关注
不安全随机数常见问题
- 只有设计到加密算法场景才需要关注,其他场景可以使用。
信息炸弹
描述:信息炸弹这类问题,涉及的场景主要是有信息通知能力的业务,如:审批提醒,工单生成,密码找回等,提醒类型包含不限于:邮件、应用号、短信等
信息炸弹常见问题
- API触发频率控制 – 基于用户session的频率控制,不区分用户进行控制虽然也能防护炸弹问题,但会引入DOS问题
- 信息接收人去重 – 当支持同时给多个人发送信息时,还要对接收人进行取重处理,否则可能会利用重复接收人进行炸弹攻击
逻辑漏洞
描述:逻辑漏洞没有具体限制,主要分为两大类,设计类和编码类,因逻辑缺陷导致的安全问题,都可以归结道此项
逻辑漏洞常见问题
- 编码类逻辑问题
- 前后端校验不一致,导致关键配置信息可以被篡改,引发的安全问题
- 客户端地址标识取值逻辑缺陷,引发的安全问题
- 使用非法token上报审计日志
- 日志AOP未捕获异常,导致接口执行过程只要抛出异常就会绕过审计日志上报
- 动态文件目录与业务部署目录没有进行逻辑分区隔离
- nginx路由控制存在缺陷导致绕过
- 功能先执行后校验,导致校验失效
- 静态资源不认证,导致认证逻辑绕过
- 校验逻辑缺陷导致绕过
- 设计类逻辑问题
- 用户资源鉴权仅使用用户名进行判断
- 认证信息(账号、密码、AK/SK、Token等),与认证地址未作强关联
- 功能设计的能力过大,导致部分功能滥用引入其他安全问题
- logrotate使用root用户修改日志文件权限导致整个OS不可用
- jre环境变量设置到系统配置/etc/profile中,但属主却是service
- 验证码与登录接口没有关联性,导致可以直接调用登录接口,绕过验证码限制
总之:逻辑上可以导致系统出现异常的问题都需要谨慎和小心,尊重我们自己写的代码
URL参数注入&路径注入
描述:URL参数注入也叫参数”污染”或”投毒”,常指参数在拼接到url中时可以携带”&、#”之类的特殊意义字符,从而导致在解析url中用户受限的参数时,获取的参数值可被攻击者污染. 将未经验证的用户输入连接到URL中可以允许攻击者覆盖请求参数的值。攻击者可能能够覆盖现有参数值、注入新参数或在直接范围之外利用变量。HTTP参数污染(HPP)攻击包括将编码查询字符串分隔符注入其他现有参数。如果Web应用程序不能正确清理用户输入,恶意用户可能会破坏应用程序的逻辑,以执行客户端或服务器端攻击。
URL参数注入常见问题
- 未对入参进行强校验
总之:所有用户输入的参数都要小心谨慎的使用,并且确保不会被利用。
参数遍历DOS
描述:此类场景比较常见,当API接受的参数存在Iterator 类型的可迭代对象并在业务逻辑中进行遍历时,如果没有对遍历参数的size进行限制就会引发DOS问题。如list、map等
参数遍历DOS常见问题
主要问题循环体外部可控
- 遍历用户提供的list或者array 导致DOS
- 循环控制数量外部可控比如for循环的num
- excel文件相关
- 文件行数为限制
- sheet页为限制
总之,对于循环体被外部参数控制的场景需要注意
敏感信息明文存储
描述:密码、SK、token等敏感信息禁止明文存储,因此从配置或数据库中获取的敏感信息必须解密后再使用,才能避免敏感信息明文或伪密文存储,同时需要关注禁止硬编码问题
敏感信息明文存储常见问题
- 关注对外请求获取token时的SK或密码是否有解密逻辑
- 关注加解密时,如果有从配置文件中获取工作密钥,是否有对密钥进行解密后再使用
- 关注https证书库在使用时获取的密码是否有解密逻辑
- 关注从配置文件中获取密码等敏感信息后,是否有解密逻辑
- 关注代码中是否存在硬编码的明密文敏感信息(根密钥组件仅允许对部分进行硬编码)
总之,敏感信息是安全大忌。
logrotate 提权
描述:logrotate是很多服务都在使用的OS自带的日志转储工具,系统默认启用,且会以root用户解析/etc/logrotate.d/下的所有配置并触发相应的轮转能力,其中拥有命令执行能力(postrotate),且服务常用来进行设置备份日志文件的属主和权限。
logrotate 提权常见问题
- 越权问题
/opt/cloud/logs/xxx/ { monthly rotate 5 compress delaycompress missingok notifempty create 0600 service servicegroup postrotate find /opt/logs/xxx/ -iname "*.gz" |xargs chmod 440 // 由于是root上下文执行,所以这里会存在越权修改文件权限问题 endscript }
总结:logrotate 配置时要指定特定用户防止越权问题。
OS进程泄露敏感信息
描述:OS下的系统进程信息对所有用户开放,导致登录到系统中的任意用户都可以通过ps -aux查看进程信息以及进程对应的命令行参数;此时如果命令行参数中存在敏感信息时就会被未授权用户获取到,导致敏感信息泄露
OS进程泄露敏感信息常见问题
- shell脚本实际是一个命令集,每一条命令都会起一个子进程执行,所以当shell脚本中有命令涉及通过命令参数传递敏感信息时,均存在进程泄露敏感信息问题
- 同理只要是进程中通过命令行参数传递了敏感信息的都会存在泄露风险
总结:当使用到命令执行时,要考虑敏感信息的处理。