前言
在这个数字化时代,安全已经成为最重要的关键词之一。对于开发人员和安全专业人员来说,代码审计是确保应用程序和服务安全性的一项重要任务。通过审计,可以发现并修复各种类型的漏洞,包括 SQL 注入、XSS、CSRF、文件上传漏洞等。愿你们在代码审计的道路上勇往直前,不断学习和探索,找到应用程序中的所有漏洞,并将其修复,为我们的数字世界带来更加安全可靠的服务。
SQL 注入
审计SQL 注入漏洞的一些常规步骤和技巧:
-
找到所有的 SQL 查询语句,包括 SELECT、INSERT、UPDATE、DELETE 等语句。
-
检查这些 SQL 查询是否接受用户输入的参数,并确保所有的参数都使用了正确的 SQL 转义函数。
-
检查代码中的拼接 SQL 语句的地方,看是否有拼接变量的情况。如果有,请检查是否正确地使用了字符串连接符
.
或字符串双引号"
。 -
确定 SQL 查询中使用的参数是否来自于用户提交的数据,如果是,则需要对其进行必要的校验和过滤。例如,对于数字类型的参数,需要检查其是否大于零;对于字符串类型的参数,需要过滤掉一些特定字符,如
\
、%
、_
等。 -
检查代码中是否存在可被注入的参数,如 HTTP 参数、POST 参数或COOKIE 参数。使用单引号或双引号来将注入语句嵌入到 SQL 查询中是常见的 SQL 注入攻击方式。
-
对于所有接收到的输入参数,使用合适的 SQL 转义方法来过滤特殊字符。PHP 中有一些常用的转义函数,如
mysqli_real_escape_string
、PDO::quote
等。但是,这些函数只能提供基本的安全保障,因此,请尽量使用预编译语句来防止 SQL 注入攻击。 -
检查 SQL 查询的结果是否是可预测的。如果 SQL 查询结果的复杂性取决于用户提供的数据,那么有可能存在其他类型的注入攻击。例如,一个查询用户资料的 SQL 语句可以通过修改参数获取管理员密码的 MD5 值。
-
在实际情况下,通常需要对代码中所有的 SQL 查询语句进行手工审计,以确保没有漏洞。如果可能,应该通过代码审计工具进行自动化检测。
总之,为了防止 SQL 注入攻击,应该在代码中严格控制所有可用的输入参数,并且使用正确的过滤和转义方式来处理这些参数。同时,通过预编译语句来减少 SQL 注入攻击的风险。
XSS (跨站脚本攻击)
审计XSS (跨站脚本攻击)漏洞的一些常规步骤和技巧:
-
找到所有的输出点,包括 HTML 输出点、JavaScript 输出点和 URL 输出点。
-
检查这些输出点是否被过滤和编码。常见的编码方式有 HTML 编码、URL 编码和 JavaScript 编码。
-
检查输入点是否接受用户输入的参数,并确保所有参数都进行了正确的校验和过滤。特别地,修正了必须对 HTML、JavaScript 和 CSS 的输入值进行过滤的应用程序的原始 XSS 风险。
-
确定是否存在使用动态脚本和内联样式的情况,并检查它们是否正确地过滤。例如,HTML 注释中的 Java 脚本是非常令人困惑的,因此在 Code 中查找这种情况是一种好的思路。
-
检查代码中的所有重定向,并确保这些重定向只接受为内部的,可靠的 URL。
-
如果使用了类似 CKEditor、TinyMCE 等富文本编辑器,请确保输出中的 HTML 代码是被过滤和编码过的。一些富文本编辑器可以针对输出内容进行过滤和编码,但不是每个都这么做。
-
检查使用的框架和库是否有 XSS 防御机制,并查看是否正确地启用了这些机制。例如,Laravel 框架内置的 XSS 防御可以防止大部分的 XSS 攻击。
-
在实际情况下,应该对代码中所有的输出点进行手工审计,以确保没有漏洞。如果可能,应该通过代码审计工具进行自动化检测。
总之,要防止 XSS 攻击,需要对相关代码进行审计,并确保所有输出点都进行了过滤和编码。特别地,输入点也需要接受必要的校验和过滤,以防止恶意输入。此外,使用现有的 XSS 防御机制和工具是很有帮助的。
文件上传
审计文件上传漏洞的一些常规步骤和技巧:
-
检查应用程序的文件上传机制,确定哪些文件扩展名、大小和类型被允许上传。检查应用程序是否存在任何不安全的上传方法,例如通过文件路径或 URL 地址进行上传。
-
确认应用程序对上传的文件进行了正确的安全检查,包括文件类型、大小、扩展名和内容。确保验证过程不会被绕过、篡改或欺骗。
-
检查上传文件的存储路径,确认应用程序是否对文件存储路径进行了限制,并且只能在预定的目录内进行上传。确保该路径可被服务器写入,并且不包含敏感文件。
-
确认应用程序是否已经正确处理上传文件的错误。例如,当上传文件失败时,应用程序应该告诉用户上传失败的原因。还需要检查应用程序是否已经正确记录上传文件的错误信息,并且该信息不会泄露敏感数据。
-
检查应用程序对上传文件进行后续处理的方式,包括缩略图生成、文件重命名、解压缩等。确保底层代码不会导致安全漏洞或任何可能的攻击场景。
总的来说,审计 PHP 文件上传漏洞需要仔细检查上传文件的各种限制,以及应用程序是否正确处理和验证上传的文件。同时,需要检查应用程序对上传文件进行的后续处理方式,以确保其不会导致任何可能的漏洞。最重要的是,在服务器端,需要限制文件操作的权限,限制上传文件的存储路径,并使用严格的访问控制方法对其进行保护。
代码执行
审计代码执行漏洞的一些常规步骤和技巧:
-
找到所有的执行外部命令的点,包括 PHP 函数
exec()
、system()
、shell_exec()
和passthru()
等。检查这些函数是否接受用户输入的参数,并确定这些参数是否已被正确过滤。 -
检查代码中是否使用原生的 PHP 文件包含函数
include
和require
以及其他相关函数include_once
、require_once
和eval
等。如果这些函数被误用,则可以用来执行恶意代码。确保所有的文件包含点都使用了硬编码的文件路径以及其他必要的安全检查。 -
检查代码中是否使用了 PHP 的反序列化功能,如
unserialize
函数。使用恶意序列化值,攻击者可以在受害者服务器上执行任意 PHP 代码。 -
检查代码中是否使用了 PHP 的动态函数执行功能,如
call_user_func()
和call_user_func_array()
函数。攻击者可以将任意函数名作为参数传递给这些函数,并在服务器上执行恶意代码。 -
如果您的代码中使用了 PHP 的 XML 解析器,如
simplexml_load_string()
和xml_parse()
,请确保解析的内容不包含任何用户输入,并且所有输入都被正确过滤。 -
检查代码中是否使用了 PHP 的
assert()
函数。这个函数可以将字符串作为 PHP 代码执行。确保所有的传递给 assert() 函数的字符串都是硬编码的,并且不包含任何用户输入。 -
检查代码中是否使用了 PHP 的自动加载功能,如
spl_autoload_register()
。使用恶意的类名,攻击者可以在服务器上执行任意 PHP 代码。如果必须使用自动加载功能,请确保传递给它的类名都是硬编码的,并且没有包含任何可疑的用户输入。
总之,为了防止 PHP 代码执行漏洞,请确保所有执行的外部命令都是使用硬编码的字符串,并对任何来自用户的输入进行必要的过滤和校验。特别地,请小心使用 PHP 的文件包含功能和反序列化功能,以及动态函数执行功能。建议审计代码,以查找潜在的问题,并使用 PHP 安全工具来帮助您发现问题。
文件包含
审计文件包含漏洞的一些常规步骤和技巧:
-
找到所有的文件包含点,包括
include
、include_once
、require
、require_once
等函数的调用。检查这些函数是否接受用户输入的参数,并确定这些参数是否已被正确过滤。 -
检查文件包含点的文件路径是否来自用户输入。如果是,将会成为攻击者尝试利用目录遍历漏洞获得对系统文件的访问权限的目标。
-
检查文件包含点的文件路径是否是硬编码的,或是否基于应用程序的内部逻辑构建。如果是,将会使攻击者很难找到一个有效的文件包含路径。
-
检查文件包含点的文件路径是否经过正确的安全筛选。如使用
realpath()
、basename()
等安全函数来帮助过滤路径。 -
检查 PHP 配置文件
php.ini
中的allow_url_fopen
和allow_url_include
设置是否被启用。如果是,这可能使攻击者可以执行远程文件包含漏洞。 -
了解应用程序中所有使用文件包含功能的代码,并审查每一个文件包含点,以确保它们都被正确的过滤和校验。
-
为了增加应用程序的安全性,应该禁用非必要的文件包含功能,并使用其他安全机制,如加载类文件而不是包含文件。
总之,为了防止文件包含漏洞,请确保文件包含点的文件路径都是硬编码的或者根据应用程序的内部逻辑构建的,并对所有的用户输入进行过滤和校验。开发者需要了解 PHP INI 的配置,确保配置文件在启用文件包含时,具备足够的安全策略。另外,要在可能的情况下减少对文件包含功能的使用,并采用其他更安全的方法进行编程。
CSRF(跨站请求伪造)
审计CSRF(跨站请求伪造)漏洞的一些常规步骤和技巧:
-
找到所有的表单提交点,包括用于登录、注册、上传数据或进行任何其他数据处理的表单。确保每个表单都包含 CSRF 保护机制。
-
确认表单提交点中是否有 CSRF 保护机制的存在,如 CSRF TOKEN 或基于 Synchronizer Token 模式的保护机制。如果不存在,则建议开发人员添加CSRF保护机制。
-
确认 CSRF TOKEN 或基于 Synchronizer Token 模式的保护机制是否难以猜测,是否每次都随机生成,是否难以重用。
-
确认 CSRF TOKEN 或基于 Synchronizer Token 模式的保护机制是否在 CSRF 攻击时会检测到并且导致请求失败。如果不会,则说明 CSRF 保护机制已被绕过。
-
检查 AJAX 调用是否存在 CSRF 保护机制。使用 AJAX 调用可以使攻击者通过跨站脚本(XSS)攻击绕过令牌保护机制。
-
检查与 CSRF 保护机制相关的敏感操作,如删除帐户、修改密码等,并确保这些操作都包含了 CSRF 保护机制。
总之,要防止 CSRF 攻击,您应该确保在应用程序中的每个表单提交点都包含合适的 CSRF 保护机制,并且这些保护机制不能被攻击者所绕过。同时,还需确保 CSRF 保护机制能够在攻击时发挥作用,并且在所有关键的操作上都得到保护。建议代码审计人员检查并测试所有应用程序的表单,并确认应用程序中的所有重要操作都有足够的 CSRF 保护。
SSRF (服务端请求伪造)
审计SSRF (服务端请求伪造)漏洞的一些常规步骤和技巧:
-
找到所有的 URL 输入点,包括通过 GET、POST、COOKIE 等方式传递的 URL 参数。确保每个 URL 输入点都进行了正确的过滤和验证。
-
检查 URL 输入点是否具备目标主机的控制权。如果是,则该 URL 输入点可能成为一个潜在的 SSRF 漏洞。
-
检查 URL 输入点是否具备远程代码执行的能力,如用于动态加载图片或其他外部数据的功能。如果是,则该 URL 输入点可能成为一个潜在的 SSRF 漏洞。
-
检查代理服务器或其他中间人是否可以从应用程序中访问外部资源。如果可以,则该代理或中间人可能成为一个潜在的SSRF 漏洞。
-
检查应用程序是否使用了所述 URL 输入点中的参数。如果没有,则该 URL 输入点可能是一个潜在的 SSRF 漏洞。
-
了解应用程序访问外部资源的模式,例如 DNS 查询、HTTP 请求等,并确保它们没有通过 URL 输入点的方式被意外的改变。
-
尝试通过 URL 输入点访问本地资源,如
file:///etc/passwd
。如果您可以访问到这些本地资源,则说明该 URL 输入点在某种程度上可以被利用为 SSRF 漏洞。
总之,审计 PHP SSRF 漏洞需要仔细检查所有的 URL 输入点,并确保它们都进行了正确的过滤和校验。您还需要了解应用程序访问外部资源的方式,并防止被 URL 输入点修改。建议开发人员使用白名单来限定外部资源的访问。最重要的是,为了防止 SSRF 攻击,请尽可能限制应用程序访问外部资源的能力。
未授权访问
审计未授权访问漏洞的一些常规步骤和技巧:
-
确认应用程序是否实现了正确的访问控制机制,包括用户身份验证、授权和访问控制等。
-
检查应用程序是否实现了正确的会话管理机制,以确保在用户身份验证过程中始终使用唯一的会话 ID。
-
确认应用程序是否对访问受限资源的请求进行正确的身份验证和授权机制,例如登录验证、角色权限等。
-
确认应用程序是否对敏感数据和操作需要的权限进行了正确的访问控制,例如修改和删除等操作。
-
检查应用程序是否使用安全的协议和加密方法,例如 HTTPS 和 SSL 等,以保护数据和用户隐私。
-
对应用程序进行安全测试,尝试使用未经授权的访问方式访问受限资源,例如使用 URL 编码、SQL 注入或 XSS 攻击等。
总之,审计 PHP 未授权访问漏洞需要深入理解应用程序实现的身份验证和访问控制机制,并采取必要的措施保护数据和用户隐私。建议审计人员应重点检查敏感数据和操作的访问控制,例如修改、删除等操作,以避免未授权访问漏洞。此外,安全测试是审计过程中的重要一环,因为它可以帮助审计人员发现未经授权的访问漏洞,例如使用 URL 编码、SQL 注入和 XSS 攻击等测试方式。
逻辑漏洞
审计逻辑漏洞的一些常规步骤和技巧:
-
了解应用程序的功能,并尝试理解与其相关的业务逻辑。
-
检查应用程序提供的各种服务是否存在缺陷,例如忘记进行重要的安全检查、缺少授权认证、未实现错误处理机制等。
-
检查应用程序的访问控制机制,包括用户授权和访问控制的代码实现。确认用户是否能够访问他们没有权限访问的资源和功能点。
-
检查代码是否正确处理和验证用户输入。开发人员经常忽略对特殊字符的处理和完整性检查,这可能导致恶意用户绕过访问控制机制。
-
检查各种错误处理机制,例如异常处理、日志记录、错误代码等,并确保代码不能泄露系统信息或用户数据。
-
尝试执行未经授权的操作,例如修改不应该修改的数据、查看敏感信息等。攻击者经常尝试从枚举性错误中获得利用。
-
尝试进行竞态条件攻击,例如在同一时刻多个用户同时访问共享资源或配置文件。
总之,对于 PHP 代码审计中的逻辑漏洞,您需要深入理解代码背后的程序逻辑,并尝试从攻击者的角度思考。建议审计人员应特别注意用户授权和访问控制的实现,处理和验证用户输入的方式,各种错误处理机制的实现以及数据竞争条件和未经授权的操作的处理等。最重要的是,不能忽略任何看似没有关系的细节,因为逻辑漏洞不一定是显而易见的,但它们可能会给攻击者带来可利用的漏洞。