Skip to content

应用程序风险和措施

时间:2023年5月7日 星期日

作者:小王

一、应用程序攻击

1.缓冲区溢出

未对用户的输入进行验证,输入太大溢出到其他内存空间,可造成系统崩溃、执行任意代码等等。

2.TOCTOU

• 检查时间(TOC)指的是主体检查对象状态的时间。

• 使用时间(TOU)指的是主体访问对象的时间。

• TOCTOU攻击被称为竞争条件(race conditions)。

举个例子:一个URL允许上传文件,但会对上传的文件格式进行检查,不符合的要求的文件会被删除。如果上传了一个webshell.php文件,然后疯狂访问这个webshell文件,就可能会在文件被删除前访问到,那么这个就是竞争条件攻击。

3.后门

开发人员在测试阶段留的、用于调试目的的后门叫维护钩子,而攻击者留的远程控制的后门就是后门。

4.特权提升和Rootkis

攻击者拿到普通管理员权限后,会使用rootkit(利用系统漏洞攻击)工具获得管理员权限。

二、注入漏洞

1.SQL注入攻击

SQL注入利用SQL命令拼接的方式来执行额外的命令获取权限之外的信息。许多情况下SQL注入攻击无法直接查看返回结果,这种情况下则使用盲注攻击(blind SQL injection)。通常有两种类型:

• 基于内容盲注:根据不同的输入得到不同的返回结果判断是否存在注入点。

• 基于时间盲注:输入加入延迟命令看返回时间是否延迟而判断是否存在注入点。

2.代码注入攻击

试图将攻击者编写的代码插入web应用程序合法代码的攻击都是代码注入攻击,如SQL注入。

• LDAP注入攻击

PDF) LDAP injection techniques

• XML注入

img

• 跨站脚本XSS

Cross Site Scripting (XSS) Attack Tutorial with Examples, Types & Prevention

3.命令注入攻击

某些情况下,应用程序代码可能会返回到操作系统以执行命令,那就可能出现命令注入攻击。

DVWA - Command Injection

三、利用授权漏洞

ACL访问控制漏洞

1.不安全的直接对象引用(Insecure Direct Object References)

根据用户输入的参数直接查询相关数据,而不对用户的权限再次判断就会出现不安全的直接对象引用。

Insecure Direct Object Reference (IDOR) Vulnerability | Spanning

2.目录遍历(Directory Traversal)

当允许用户浏览web服务器目录结构并访问相应文件时,使攻击者可以通过目录遍历攻击获取密码文件或备份文件。

File:Directory traversal.png - Wikimedia Commons

3.文件包含(File Inclusion)

文件包含攻击可执行文件中包含的代码,从而使web服务器执行目标代码。通常有两种类型:

• 本地文件包含:执行本地服务器上的代码。

• 远程文件包含:执行远程服务器上的代码。

Authenticated Local File Inclusion(LFI) in fm module · Issue #33 ·  GilaCMS/gila · GitHub

四、利用Web应用程序漏洞

1.跨站脚本攻击(XSS)

攻击者将恶意代码插入网页中用以攻击客户端。

• 反射型XSS:通常发生在应用程序允许反射输入时,最典型是弹窗告警。

• 存储型/持久型XSS:将跨站脚本代码存储在web服务器上,就是存储型XSS,又因为能够持久存在,也称为持久型XSS。

通过输入验证和输出编码进行防范。

2.请求伪造(Request Forgery)

利用信任关系并试图让用户无意中对远程服务器执行命令。有两种形式:

• 跨站请求伪造(CSRF/XSRF):利用远程站点对用户系统的信任来冒充用户执行命令。

• 服务端请求伪造(SSRF):通过篡改提及的URL可以对内网其他系统进行攻击。

3.会话劫持(Session Hijacking)

攻击者拦截授权用户和资源直接的通信,使用劫持技术接管会话。常用劫持技术有:

• 抓取客户端和服务器间的身份验证信息进行客户端伪装

• 诱使客户端认为攻击者就是目标服务器

• 使用用户cookies数据访问服务器

通过反重放认证技术和cookies过期时间进行防范。

五、应用程序安全控制

1.输入验证

对用户的输入进行验证,以降低包含攻击代码的可能性。

• 输入白名单(input whitelisting):仅允许清单里的值进行输入。

• 输入黑名单(input blacklisting):不允许清单里的值进行输入。

• 元字符(Metacharacters):被赋予特殊编程含义的字符,通常使用转义(Escaping)将其转换成普通符号。

• 参数污染(Parameter Pollution):攻击者向web应用程序同一个输入变量发送多个值,用以实现绕过输入验证机制。

执行输入验证必须在服务器端实现,客户端输入验证极容易被绕过。

2.Web应用防火墙

Web应用防火墙(WAF)工作在应用层,根据规则库对网络流量中的恶意行为进行过滤,是对应用程序安全控制的补充措施。

3.数据库安全

• 参数化查询(Parameterized queries):开发人员准备SQL语句,仅允许用户输入变量的值,不允许插入额外代码。

• 存储过程(Stored procedures):与参数化查询原理类似,但实现代码在数据库服务器上。

• 数据最小化(Data minimization):最好的防御,数据越少、风险越小。

• 令牌化(Tokenization):使用唯一标识符替代敏感信息。

• 哈希(Hashing):将敏感数据通过哈希计算形成替代标识符,通常会加入盐或胡椒用以抵抗彩虹表攻击。

4.代码安全

• 代码签名(Code Signing):使用私钥对代码进行数字签名,可提供完整性和不可否认性。

• 代码重用(Code Reuse):通过使用第三方软件库和软件开发工具包(SDK)来重用代码。

• 软件多样性(Software Diversity):避免依赖于单个源代码、二进制可执行文件或编译器。

• 代码存储库(Code Repositories):用于存储和管理应用程序源代码的位置。

• 完整性测量(Integrity Measurement):利用哈希算法确保部署的代码与代码库中的代码是一致的。

• 应用弹性(Application Resilience):设计应用程序时需要考虑其能够适应不断变化的需求,有两个方面:可伸缩性(Scalability)和弹性(Elasticity),参考云计算特性。

六、安全编码实践

1.源代码注释(Source Code Comments)

源代码注释可以帮助开发人员理解代码实现的功能和原理,但也向攻击者提供了便利,代码发布前应删除相关注释。

2.错误处理(Error Handling)

攻击者会利用代码中的错误进行攻击,因此开发人员应在代码中加入对错误的处理机制。另一方面,错误处理输出的信息也不能太过详细,也容易被黑客利用。

3.硬编码凭证(Hard-Coded Credentials)

在某些情况下,开发人员可能会在源代码中包含用户名和密码,有两种情况:保留维护账号用于开发维护,即后门漏洞;代码中的用户名和密码可能会被外人得知,即信息泄漏风险。

4.内存管理(Memory Management)

• 资源耗竭(Resource Exhaustion)

系统的资源是有限的,一旦全部用完就会造成系统拒绝服务,如内存泄漏(Memory leaks)。

• 指针解引用(Pointer Dereferencing)

指针是在内存中存储另一个位置地址的内存的一个区域。如果应用程序访问某一个资源,则会执行一个指针解引用的操作,即访问指针指示的内存地址。如果指针是空的,那么可能会导致系统崩溃或绕过安全控制,进而产生风险。