Kali Linux Web 渗透测试秘籍 第十章:OWASP Top 10
每个渗透测试的目标都是识别应用、服务器或网络中的可能缺陷,它们能够让攻击者有机会获得敏感系统的信息或访问权限。检测这类漏洞的原因不仅仅是了解它们的存在以及推断出其中的漏洞,也是为了努力预防它们或者将它们降至最小。
简介
这一章中,我们会观察一些如何预防多数 Web 应用漏洞的例子和推荐,根据 OWASP:
https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project
A1 预防注入攻击
根据 OWASP,Web 应用中发现的最关键的漏洞类型就是一些代码的注入攻击,例如 SQL 注入、OS 命令注入、HTML 注入(XSS)。
这些漏洞通常由应用的弱输入校验导致。这个秘籍中,我们会设计一些处理用户输入和构造所使用的请求的最佳实践。
操作步骤
- 为了防止注入攻击,首先需要合理校验输入。在服务端,这可以由编写我们自己的校验流程来实现,但是最佳选择是使用语言自己的校验流程,因为它们更加广泛使用并测试过。一个极好的激励就是 PHP 中的
filter_var
,或者 ASP.NET 中的 校验助手。例如,PHP 中的邮箱校验类似于:function isValidEmail($email){ return filter_var($email, FILTER_VALIDATE_EMAIL); }
- 在客户端,检验可以由创建 JavaScript 校验函数来完成,使用正则表达式。例如,邮箱检验流程是:
function isValidEmail (input) { var result=false; var email_regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[azA-Z0-9.-]{2,4}$/; if ( email_regex.test(input) ) { result = true; } return result; }
- 对于 SQL 注入,避免拼接输入值为查询十分关键。反之,使用参数化查询。每个编程语言都有其自己的版本:
PHP MySQLLi:
$query = $dbConnection->prepare('SELECT * FROM table WHERE name = ?'); $query->bind_param('s', $name); $query->execute();
C#:
string sql = "SELECT * FROM Customers WHERE CustomerId = @ CustomerId"; SqlCommand command = new SqlCommand(sql); command.Parameters.Add(new SqlParameter("@CustomerId", System. Data.SqlDbType.Int)); command.Parameters["@CustomerId"].Value = 1;
Java:
String custname = request.getParameter("customerName"); String query = "SELECT account_balance FROM user_data WHERE user_ name =? "; PreparedStatement pstmt = connection.prepareStatement( query ); pstmt.setString( 1, custname); ResultSet results = pstmt.executeQuery( );
- 考虑注入出现的时机,对减少可能的损失总量也有帮助。所以,使用低权限的系统用户来运行数据库和 Web 服务器。
- 确保输入用于连接数据库服务器的用户不是数据库管理员。
- 禁用甚至删除允许攻击者执行系统命令或提权的储存过程,例如 MSSQL 服务器中的
xp_cmdshell
。
工作原理
预防任何类型代码注入攻击的主要部分永远是合理的输入校验,位于服务端也位于客户端。
对于 SQL 注入,始终使用参数化或者预编译查询。而不是拼接 SQL 语句和输入。参数化查询将函数参数插入到 SQL 语句特定的位置,消除了程序员通过拼接构造查询的需求。
这个秘籍中,我们使用了语言内建的校验函数,但是如果你需要校验一些特殊类型的参数,你可以通过使用正则表达式创建自己的版本。
除了执行正确校验,我们也需要在一些人蓄意注入一些代码的情况下,降低沦陷的影响。这可以通过在操作系统的上下文中为 Web 服务器合理配置用户权限,以及在数据库服务器上下文中配置数据库和 OS 来实现。
另见
对于数据校验来讲,最有用的工具就是正则表达式。在处理和过滤大量信息的时候,它们也能够让渗透测试变得更容易。所以好好了解它们很有必要。我推荐你查看一些站点:
- http://www.regexr.com/ 一个很好的站点,其中我们可以获得示例和参数并测试我们自己的表达式来查看是否有字符串匹配。
- http://www.regular-expressions.info 它包含教程和实例来了解如何使用正则表达式。它也有一份实用的参考,关于主流语言和工具的特定实现。
- http://www.princeton.edu/~mlovett/reference/Regular-Expressions.pdf (Jan Goyvaerts 编写的《Regular Expressions, The Complete Tutorial》)就像它的标题所说,它是个正则表达式的非常完备的脚本,包含许多语言的示例。
原创文章,作者: Admin ,转载请注明出处:https://www.secvery.com/3687.html