1.SQL注入
1.1 简介
SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序。 在应用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中执行(例如将数据库内容转储给攻击者)。
1.2 示例及应对
根据使用的技巧,SQL注入类型可分为
-
盲注
布尔盲注:只能从应用返回中推断语句执行后的布尔值
正常查询: SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码'; 始终返回真: 攻击者可以尝试以下输入: - 用户名:admin' AND 1=1 -- - 密码:任意密码 这将导致SQL查询变为: SELECT * FROM users WHERE username = 'admin' AND 1=1 --' AND password = '任意密码'; 如果应用程序对输入进行了不当处理,那么它可能会将查询视为: SELECT * FROM users WHERE username = 'admin' AND 1=1 始终返回假: 如果攻击者尝试以下输入: - 用户名:admin' AND 1=2 -- - 密码:任意密码 这将导致SQL查询变为: SELECT * FROM users WHERE username = 'admin' AND 1=2 --' AND password = '任意密码'; 如果应用程序对输入进行了不当处理,那么它可能会将查询视为: SELECT * FROM users WHERE username = 'admin' AND 1=2 解决方案: 1. 使用参数化查询或预编译语句:确保您的应用程序使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接将用户输入拼接到查询字符串中。这样可以防止恶意代码的注入。 2. 输入验证和过滤:对于用户输入的数据,进行严格的验证和过滤,确保只允许合法的字符和格式。可以使用白名单或正则表达式来验证输入。 3. 最小权限原则:为应用程序使用数据库的账户分配最小的权限,只授予执行必要操作所需的权限。这样即使发生注入攻击,攻击者也无法执行敏感操作。 4. 错误处理:在应用程序中,不要直接将数据库错误信息返回给用户,以免提供攻击者有关数据库结构和查询的敏感信息。相反,应该提供自定义的错误消息,不透露过多的细节。 5. 安全审计和监控:定期对应用程序进行安全审计,检查是否存在潜在的SQL注入漏洞。同时,实施监控措施来检测异常的数据库活动,及时发现和应对潜在的攻击。 6. 安全教育和培训:对开发人员进行安全教育和培训,使他们了解SQL注入攻击的原理和预防措施,并采取安全编码实践。
时间盲注:应用没有明确的回显,只能使用特定的时间函数来判断
正常查询: SELECT * FROM products WHERE name LIKE '%输入的关键词%'; 攻击者可以尝试以下输入: - 关键词:' OR SLEEP(5) --' 这将导致SQL查询变为: SELECT * FROM products WHERE name LIKE '%' OR SLEEP(5) --'%'; 如果应用程序对输入进行了不当处理,那么它可能会在执行查询时等待5秒钟,然后返回结果。这表明条件为真。 然而,如果攻击者尝试以下输入: - 关键词:' OR SLEEP(0) --' 这将导致SQL查询变为: SELECT * FROM products WHERE name LIKE '%' OR SLEEP(0) --'%'; 如果应用程序对输入进行了不当处理,那么它可能会立即返回结果,而不会等待。这表明条件为假。 通过观察应用程序的响应时间,攻击者可以推断出条件是否为真,从而逐步推导出数据库中的敏感信息。 解决方案: 1. 对用户输入进行验证和过滤:确保应用程序对用户输入进行严格的验证和过滤,只允许合法的字符和格式。可以使用白名单或正则表达式来验证输入。 2. 使用参数化查询或预编译语句:确保您的应用程序使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接将用户输入拼接到查询字符串中。这样可以防止恶意代码的注入。 3. 最小权限原则:为应用程序使用数据库的账户分配最小的权限,只授予执行必要操作所需的权限。这样即使发生注入攻击,攻击者也无法执行敏感操作。 4. 使用随机的时间延迟:在应用程序中,可以使用随机的时间延迟来响应查询,从而使攻击者无法通过观察响应时间来推断条件是否为真。 5. 安全审计和监控:定期对应用程序进行安全审计,检查是否存在潜在的时间盲注漏洞。同时,实施监控措施来检测异常的数据库活动,及时发现和应对潜在的攻击。 6. 安全教育和培训:对开发人员进行安全教育和培训,使他们了解时间盲注攻击的原理和预防措施,并采取安全编码实践。
-
报错注入:应用会显示全部或者部分的报错信息
假设应用程序有一个搜索功能,用户可以在搜索框中输入关键字来查询数据库中的数据。应用程序可能会将用户输入直接拼接到SQL查询语句中,而没有进行验证和过滤。 例如,应用程序的代码可能如下所示: search_term = request.GET.get('search_term') query = "SELECT * FROM products WHERE name = '" + search_term + "'" results = execute_query(query) 在这个示例中,应用程序将用户输入直接拼接到查询语句中的 name 字段上。如果用户输入恶意的SQL代码,就可能导致报错注入漏洞。 例如,用户输入 ' OR 1=1; DROP TABLE products; -- ,那么构建的查询语句将变成: sql SELECT * FROM products WHERE name = '' OR 1=1; DROP TABLE products; --' 这个查询语句会导致报错,并可能删除 products 表。 为了防止报错注入,应该使用参数化查询或预编译语句来构建和执行SQL查询,而不是直接拼接用户输入。下面是一个使用参数化查询的示例: search_term = request.GET.get('search_term') query = "SELECT * FROM products WHERE name = %s" results = execute_query(query, (search_term,))
-
堆叠注入:有的应用可以加入
;
后一次执行多条语句假设有一个简单的登录表单,用户需要输入用户名和密码来登录系统。系统使用以下代码来验证用户输入的用户名和密码: String username = request.getParameter("username"); String password = request.getParameter("password"); String query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'"; 在这个示例中,开发人员使用用户输入的值直接拼接到SQL查询语句中,这就存在堆叠注入的安全风险。攻击者可以利用这个漏洞来执行恶意的SQL代码。 例如,攻击者可以在用户名输入框中输入以下内容: ' OR '1'='1'; DROP TABLE users; -- 这将导致构建的SQL查询语句如下所示: sql SELECT * FROM users WHERE username='' OR '1'='1'; DROP TABLE users; --' AND password='' 由于 '1'='1' 始终为真,这个SQL查询将返回所有用户的数据,并且 DROP TABLE users 语句将删除 users 表。攻击者成功地执行了恶意的SQL代码,导致数据丢失和系统崩溃。
-
其他
2.XSS(跨站脚本攻击)
2.1 简介
XSS攻击利用了Web应用程序对用户输入的信任,攻击者将恶意脚本注入到Web页面中,当其他用户访问该页面时,恶意脚本会在他们的浏览器中执行。这使得攻击者可以窃取用户的敏感信息、劫持用户会话、篡改页面内容等
2.2 示例及应对
假设有一个留言板的Web应用程序,用户可以在留言板上发布评论。评论会在页面上显示,并且其他用户可以看到。开发人员使用以下代码将用户输入的评论内容显示在页面上: html <div class="comment"> <?php echo $_POST['comment']; ?> </div> 在这个示例中,开发人员没有对用户输入的评论内容进行任何过滤或转义处理,攻击者可以利用这个漏洞来注入恶意脚本。例如,攻击者可以在评论中输入以下内容: html <script> alert('恶意脚本已执行!'); // 偷取用户的敏感信息并发送给攻击者的服务器 </script> 当其他用户访问该页面时,恶意脚本会在他们的浏览器中执行,弹出一个警告框,并可能执行其他恶意操作。攻击者成功地利用了XSS漏洞,对其他用户进行了攻击。 防御XSS漏洞的常见措施包括对用户输入进行过滤和转义处理、使用内容安全策略(Content Security Policy,CSP)、限制脚本执行等。这些措施可以有效地防止XSS攻击,保护Web应用程序和用户的安全。
3.CSRF(跨站请求伪造)
3.1 简介
CSRF攻击利用了Web应用程序对用户发出的请求没有进行充分验证的情况。攻击者通过诱使用户访问恶意网站或点击恶意链接,来触发用户在已登录的合法网站上执行未经授权的操作。这是因为Web应用程序在处理用户请求时没有对请求的来源进行验证,而是默认信任已经登录的用户。
3.2 示例及应对
假设有一个银行网站,用户在该网站上可以通过以下URL来更改密码: https://bank.com/change-password?new-password=123456 在这个示例中,用户在已登录的情况下,访问了一个恶意网站。恶意网站上的攻击者构造了一个图片标签,其中的src属性指向了银行网站的密码修改链接: <img src="https://bank.com/change-password?new-password=654321" /> 当用户访问恶意网站时,浏览器会自动加载图片,并向银行网站发送了一个修改密码的请求。由于用户已经在银行网站上登录,所以该请求会被银行网站认为是合法的,并执行密码修改操作。攻击者成功地利用了CSRF漏洞,未经用户授权修改了其密码。 防御CSRF漏洞的常见措施包括使用CSRF令牌(Token)进行验证、检查Referer头部、使用同源策略、使用验证码等。这些措施可以增加Web应用程序对请求来源的验证,从而有效防止CSRF攻击。
4.SSRF(服务器端请求伪造)
4.1 简介
SSRF攻击利用了Web应用程序对服务器端请求的信任,攻击者可以控制服务器发起的请求,包括向内部网络或其他外部系统发送请求。这使得攻击者可以访问和操作不应该对外部公开的资源,如内部接口、数据库、文件系统等。
4.2 示例及应对
假设有一个图片上传的Web应用程序,用户可以上传图片并获取其URL。该应用程序使用以下代码将用户上传的图片显示在页面上: $url = $_POST['image_url']; echo '<img src="' . $url . '"/>'; ?> 在这个示例中,攻击者可以利用SSRF漏洞来伪造服务器端的请求。例如,攻击者可以在图片URL中注入以下内容: http://localhost/admin/delete?file=important_document.txt 当服务器处理该请求时,它会尝试访问本地主机上的 /admin/delete 接口,并删除 important_document.txt 文件。攻击者成功地利用了SSRF漏洞,执行了未经授权的操作。 防御SSRF漏洞的常见措施包括限制服务器端请求的目标、验证和过滤用户输入、使用白名单来限制允许访问的资源等。这些措施可以有效地防止SSRF攻击,保护Web应用程序和服务器的安全。
5.命令注入
5.1 简介
命令注入漏洞通常出现在需要执行系统命令的应用程序中,攻击者可以通过在用户输入中注入恶意命令来执行任意的系统命令。这使得攻击者可以执行危险的操作,如执行恶意代码、访问敏感信息、篡改文件等。
5.2 示例及应对
假设有一个简单的Web应用程序,允许用户在服务器上执行 ping 命令来测试网络连接。应用程序使用以下代码来执行用户输入的命令: $ip = $_GET['ip']; $result = shell_exec('ping ' . $ip); echo $result; ?> 在这个示例中,开发人员没有对用户输入进行任何过滤或验证,攻击者可以利用这个漏洞来执行任意的系统命令。例如,攻击者可以在URL中输入以下内容: http://example.com/ping.php?ip=; rm -rf / 当服务器处理该请求时,它会执行以下命令: ping ; rm -rf / 这会导致服务器执行 ping 命令后,继续执行 rm -rf / 命令,删除服务器上的所有文件。攻击者成功地利用了命令注入漏洞,造成了严重的破坏。 防御命令注入漏洞的常见措施包括验证和过滤用户输入、使用参数化查询或预编译语句来执行系统命令、限制应用程序的权限等。这些措施可以有效地防止命令注入攻击,保护应用程序和服务器的安全。
6.目录穿越
6.1 简介
目录穿越漏洞通常出现在需要处理文件路径的应用程序中,攻击者可以利用这个漏洞来绕过应用程序的访问控制,访问他们没有权限访问的文件或目录。这可能导致泄露敏感信息、执行恶意代码、修改文件等危险后果。
6.2 示例及应对
假设有一个简单的文件下载应用程序,用户可以通过提供文件名来下载文件。应用程序使用以下代码来处理文件下载请求: $filename = $_GET['file']; $filepath = '/var/www/files/' . $filename; if (file_exists($filepath)) { header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($filepath).'"'); readfile($filepath); } else { echo 'File not found.'; } ?> 在这个示例中,开发人员没有对用户提供的文件名进行任何验证或过滤,攻击者可以利用目录穿越漏洞来下载任意文件。例如,攻击者可以通过以下URL来下载 /etc/passwd 文件: http://example.com/download.php?file=../../etc/passwd 当服务器处理该请求时,它会将文件路径设置为 /var/www/files/../../etc/passwd ,导致下载了 /etc/passwd 文件,其中可能包含敏感的用户凭据和系统信息。攻击者成功地利用了目录穿越漏洞,获取了敏感信息。 防御目录穿越漏洞的常见措施包括验证和过滤用户输入、使用白名单来限制允许访问的文件或目录、对文件路径进行规范化处理等。这些措施可以有效地防止目录穿越攻击,保护应用程序和服务器的安全。
7.文件读取
7.1 简介
文件读取漏洞通常出现在需要加载文件的应用程序中,攻击者可以利用这个漏洞来读取敏感文件、执行恶意代码或绕过访问控制。这可能导致泄露敏感信息、操作系统命令执行、服务器被入侵等危险后果。
7.2 示例及应对
假设有一个简单的Web应用程序,允许用户通过提供文件名来查看文件内容。应用程序使用以下代码来处理文件查看请求: $filename = $_GET['file']; include($filename); ?> 在这个示例中,开发人员没有对用户提供的文件名进行任何验证或过滤,攻击者可以利用文件读取漏洞来读取任意文件。例如,攻击者可以通过以下URL来读取 /etc/passwd 文件的内容: http://example.com/view.php?file=../../etc/passwd 当服务器处理该请求时,它会将文件路径设置为 ../../etc/passwd ,导致读取了 /etc/passwd 文件的内容,其中可能包含敏感的用户凭据和系统信息。攻击者成功地利用了文件读取漏洞,获取了敏感信息。 防御文件读取漏洞的常见措施包括验证和过滤用户输入、使用白名单来限制允许访问的文件、对文件路径进行规范化处理、设置适当的文件权限等。这些措施可以有效地防止文件读取漏洞,保护应用程序和服务器的安全。
8.文件上传
8.1 简介
文件上传漏洞通常出现在需要用户上传文件的应用程序中,攻击者可以通过利用应用程序对上传文件的验证不足或绕过,上传恶意文件并在服务器上执行。这可能导致服务器被入侵、用户数据泄露、恶意代码执行等危险后果。
8.2 示例及应对
假设有一个简单的图片上传应用程序,允许用户上传图片文件并显示在网页上。应用程序使用以下代码来处理文件上传: $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // 检查文件类型 if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "只允许上传 JPG, JPEG, PNG 和 GIF 文件."; $uploadOk = 0; } // 检查文件大小 if ($_FILES["fileToUpload"]["size"] > 500000) { echo "文件过大."; $uploadOk = 0; } // 判断是否上传成功 if ($uploadOk == 0) { echo "文件上传失败."; } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "文件上传成功."; } else { echo "文件上传失败."; } } ?> 在这个示例中,开发人员对文件类型和大小进行了一些基本的验证。然而,攻击者可以通过修改上传文件的扩展名、伪造文件头或绕过其他验证措施,上传恶意文件。例如,攻击者可以将一个 PHP 文件命名为 evil.jpg 并上传,然后通过以下URL访问该文件执行恶意代码: http://example.com/uploads/evil.jpg 当服务器处理该请求时,它会执行 evil.jpg 文件中的恶意代码,导致服务器被入侵或执行任意操作。攻击者成功地利用了文件上传漏洞,造成了严重的安全问题。 防御文件上传漏洞的常见措施包括:对上传文件进行严格的验证和过滤、限制上传文件的类型和大小、重命名上传文件、将上传文件存储在非可执行目录、设置适当的文件权限等。这些措施可以有效地防止文件上传漏洞,保护应用程序和服务器的安全。
9.文件包含
9.1 简介
文件包含漏洞通常出现在Web应用程序中,当应用程序使用用户提供的输入(如文件路径或参数)来包含其他文件时,如果没有正确过滤或验证用户输入,攻击者可以构造恶意输入,使应用程序包含并执行恶意文件。这可能导致服务器被入侵、敏感信息泄露、远程代码执行等危险后果。
9.2 示例及应对
假设有一个简单的PHP应用程序,用于加载并显示指定文件的内容。应用程序使用以下代码来加载文件: $file = $_GET['file']; include($file); ?> 在这个示例中,应用程序接受来自用户的 file 参数,并将其作为文件路径直接传递给 include 函数。攻击者可以构造恶意请求,将恶意文件路径传递给 file 参数。例如,攻击者可以通过以下URL访问应用程序: http://example.com/index.php?file=../../../../../etc/passwd 当应用程序处理该请求时,它会包含 /etc/passwd 文件的内容,导致敏感信息泄露。 另外,攻击者还可以利用文件包含漏洞进行远程代码执行。例如,攻击者可以构造恶意请求,将远程恶意脚本的URL传递给 file 参数,从而使应用程序包含并执行远程恶意脚本。 防御文件包含漏洞的常见措施包括:避免直接将用户输入作为文件路径进行包含,使用白名单验证用户输入,限制文件路径的访问范围,对用户输入进行严格过滤和转义,使用安全的文件包含函数等。这些措施可以有效地防止文件包含漏洞,提高应用程序的安全性。
10.XXE
10.1 简介
XXE漏洞通常出现在使用XML解析器的应用程序中,当应用程序接受用户提供的XML输入并解析时,如果没有正确限制外部实体的解析,攻击者可以构造恶意的实体,从而导致敏感信息泄露、服务器端请求伪造(SSRF)等危险后果。
10.2 示例及应用
假设有一个接受用户提交的XML数据并解析的应用程序。应用程序使用以下代码来解析XML数据: $xmlData = $_POST['xml']; $dom = new DOMDocument(); $dom->loadXML($xmlData); ?> 在这个示例中,应用程序接受来自用户的 xml 参数,并将其作为XML数据传递给 loadXML 函数进行解析。攻击者可以构造恶意的XML数据,其中包含外部实体的引用。例如,攻击者可以提交以下XML数据: xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE data [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]> <data>&xxe;</data> 当应用程序处理该请求时,它会解析XML数据并尝试解析外部实体 xxe ,并将 xxe 的内容替换为 file:///etc/passwd 文件的内容,导致敏感信息泄露。 另外,攻击者还可以利用XXE漏洞进行服务器端请求伪造(SSRF)攻击。例如,攻击者可以构造恶意的XML数据,其中包含外部实体的引用,并将实体的内容设置为目标服务器的内部地址。当应用程序解析该XML数据时,它会尝试访问目标服务器的内部地址,从而实现SSRF攻击。 防御XXE漏洞的常见措施包括:禁用外部实体解析、使用安全的XML解析器、对用户输入进行严格过滤和转义、限制解析的实体和DTD(文档类型定义)等。这些措施可以有效地防止XXE漏洞,提高应用程序的安全性。
11.模版注入
11.1 简介
模板注入漏洞通常出现在使用模板引擎的应用程序中,当应用程序接受用户提供的输入并将其插入到模板中时,如果没有正确过滤、转义或限制用户输入,攻击者可以注入恶意的模板代码,从而导致代码执行漏洞。
11.2 示例及应对
假设有一个使用模板引擎的应用程序,用于生成HTML页面。应用程序使用以下代码来渲染模板: from jinja2 import Template def render_template(user_input): template = Template(user_input) output = template.render() return output 在这个示例中,应用程序接受来自用户的 user_input 参数,并将其作为模板代码传递给 Template 函数进行渲染。攻击者可以利用模板注入漏洞注入恶意代码。例如,攻击者可以提交以下模板代码: {{ 7 * 7 }} 当应用程序处理该请求时,它会将 user_input 作为模板代码进行渲染,并将 {{ 7 * 7 }} 替换为 49 ,最终渲染出的页面中会显示 49 。这是一个无害的示例,但如果攻击者注入恶意代码,例如执行系统命令或访问敏感信息,就会导致安全漏洞。 另外,模板注入漏洞还可以用于绕过身份验证、访问其他用户的数据或进行服务器端请求伪造(SSRF)等攻击。 防御模板注入漏洞的常见措施包括:对用户输入进行严格过滤和转义、限制模板代码的执行权限、使用安全的模板引擎、更新和修补模板引擎的漏洞等。这些措施可以有效地防止模板注入漏洞,提高应用程序的安全性。
12.Xpath注入
12.1 简介
XPath是一种用于在XML文档中定位节点的查询语言。XPath注入漏洞通常出现在使用XPath查询语言的应用程序中,当应用程序接受用户提供的输入并将其作为XPath表达式执行时,如果没有正确过滤、转义或限制用户输入,攻击者可以注入恶意的XPath表达式,从而导致代码执行漏洞。
12.2 示例及应对
假设有一个使用XPath查询的应用程序,用于从XML文档中获取特定节点的值。应用程序使用以下代码执行XPath查询: import lxml.etree as ET def get_node_value(user_input): xml = "<root>" + user_input + "</root>" root = ET.fromstring(xml) node = root.xpath("//node") return node[0].text 在这个示例中,应用程序接受来自用户的 user_input 参数,并将其作为XPath表达式拼接到XML文档中进行查询。攻击者可以利用XPath注入漏洞注入恶意代码。例如,攻击者可以提交以下输入: ' or 1=1 or ''=' 当应用程序处理该请求时,它会将 user_input 拼接到XML文档中的XPath表达式中,并执行查询。由于注入的XPath表达式为 ' or 1=1 or ''=' ,这将导致查询返回所有节点,而不仅仅是特定的节点。攻击者可以利用这个漏洞来绕过访问控制、获取敏感信息或执行其他恶意操作。 防御XPath注入漏洞的常见措施包括:对用户输入进行严格过滤和转义、使用参数化查询或预编译XPath表达式、限制查询的执行范围和权限、使用安全的XPath库等。这些措施可以有效地防止XPath注入漏洞,提高应用程序的安全性。