认证绕过
认证鉴权是所有安全机制的基础,如果认证逻辑被绕过了,系统毫无安全可言。认证是重中之重,一旦出问题了,毫无疑问是红线。
导致认证绕过主要有三种原因:
- 设计上不合理,敏感操作存在不鉴权接口
- 利用不鉴权接口来执行需要鉴权的接口
- 代码逻辑存在漏洞,通过特殊报文绕过鉴权动作
防范措施:
- 开发人员对应安全高风险点输出代码处理逻辑,由安全专家和安全白盒测试进行评审,确保无漏洞。
- 安全测试人员要深入掌握渗透技术,学会白盒分析方法,走读关键代码
命令注入
操作系统命令注入简称命令注入,是指用户输入的数据(命令)被程序拼接并传递给执行操作系统命令的函数来执行。编程语言如C/C++/Python/Rust等,都支持执行系统命令,都存在命令注入的可能。下面以C语言为例解释命令注入的成因、分类和防范措施。
C/C++有三种常用的方式来执行系统命令,分别是system(vos_system)、popen、exec家族函数(vos_system_s)
-
具体执行的系统命令又可以分成2类:
- 执行解释器程序:如
system(“/bin/bash –c touch /tmp/sample”); - 执行非解释器程序: 如
gchar* argv[3] = {“/tmp/src”, “/tmp/dest”, NULL}; vos_system_s(“/bin/cp”, argv); - 执行解释器程序:如
-
按照注入方式又可以分成两类:
- 在shell命令后拼接新命令来注入:如
system(“/bin/cp src dest && touch /tmp/sample”); - 从命令的特殊参数来注入: 如
system(find . -name “*.log” -exec rm {})
- 在shell命令后拼接新命令来注入:如
防范措施:
- 尽量通过通用接口/库函数/系统调用来实现功能,而不是使用系统命令
- 指定具体的命令程序,而不执行解释器程序,例如拷贝文件的时候,使用cp命令而不是/bin/bash –c cp命令
- 只在需要获取命令的结果反馈时使用popen,其余场景都用vos_system_s
- 使用popen函数时,如果存在命令拼接,先校验拼接后的命令是否有特殊字符或恶意命令
- 外部输入作为tar、find等特殊命令的参数时,需要校验参数中是否包括-exec
软链接攻击
又称符号链接,类似windows上的“快捷方式”。由于软链接可以指向任意文件,因此创建一个与普通文件同名的软链接,可以欺骗业务程序,造成原先无法访问的文件被读取或修改,或者被修改属主或者权限,进而导致提权、任意命令执行、沙箱逃逸等。
| 受软链接影响的操作 | 原理 | 危害 | 防范措施 |
|---|---|---|---|
open / fopen |
默认打开的是软链接指向的目标文件,后续读写操作均作用于目标文件 | - 信息泄露(如泄露 /etc/shadow 文件)- 任意文件写入(如篡改 /etc/passwd 文件) |
- 使用 open 时设置 O_NOFOLLOW 标志位,禁止跟随软链接- 使用 fopen 前先通过 lstat() 获取文件信息,判断是否为软链接 |
chmod / chown / chgrp |
默认修改的是软链接所指向的文件的权限/属主/属组 | - 权限提升(例如:将指向 /etc/passwd 的软链接 test.csr 的权限改为 666,导致任意用户可读写 passwd 文件) |
- 使用 -h 参数:仅修改软链接本身,不修改目标文件- 使用 -P 参数:跳过软链接,不进行任何操作(等同于不跟随) |
cp |
若源(src)或目标(dest)为软链接,则默认会从软链接指向的路径拷贝数据或拷贝到目标路径 |
- 文件被意外覆盖 - 敏感信息泄露(如将系统关键文件拷贝到非预期位置) |
- 使用 -P 参数:强制不跟随软链接,将软链接当作普通文件处理 |