服务器端的漏洞(相关学习)
-
什么是 SQL 注入 (SQLi)?
SQL 注入 (SQLi) 是一种 Web 安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。这可能允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序可以访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为持续更改。
在某些情况下,攻击者可以升级 SQL 注入攻击,以破坏底层服务器或其他后端基础结构。它还可以使他们执行拒绝服务攻击。
如何检测 SQL 注入漏洞
您可以使用一组针对应用程序中每个入口点的系统测试来手动检测 SQL 注入。为此,您通常会提交:
- 单引号字符,并查找错误或其他异常。'
- 一些特定于 SQL 的语法,这些语法的计算结果为入口点的基本(原始)值和其他值,并查找应用程序响应中的系统差异。
- 布尔条件(如 和 ),并查找应用程序响应中的差异。OR 1=1OR 1=2
- 有效负载旨在在 SQL 查询中执行时触发时间延迟,并查找响应时间的差异。
- OAST 有效负载旨在在 SQL 查询中执行时触发带外网络交互,并监视任何生成的交互。
或者,您可以使用 Burp Scanner 快速可靠地找到大多数 SQL 注入漏洞。
检索隐藏数据
想象一下,一个显示不同类别产品的购物应用程序。当用户单击“礼品”类别时,其浏览器会请求以下网址:
https://insecure-website.com/products?category=Gifts
这会导致应用程序进行 SQL 查询,以从数据库中检索相关产品的详细信息:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
此 SQL 查询要求数据库返回:
- 所有细节 (*)
- 从表格中products
- 其中 是categoryGifts
- 并且是 .released1
该限制用于隐藏未发布的产品released = 1。我们可以假设对于未发布的产品released = 0
该应用程序不会实现任何针对 SQL 注入攻击的防御措施。这意味着攻击者可以构造以下攻击,例如:
https://insecure-website.com/products?category=Gifts'--
这会导致 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
至关重要的是,请注意,这是 SQL 中的注释指示器。这意味着查询的其余部分被解释为注释,从而有效地将其删除。在此示例中,这意味着查询不再包含 。因此,将显示所有产品,包括尚未发布的产品。
--AND released = 1
您可以使用类似的攻击使应用程序显示任何类别中的所有产品,包括他们不知道的类别:
https://insecure-website.com/products?category=Gifts'+OR+1=1--
这会导致 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
修改后的查询返回 为 或 等于 的所有项目。与往常一样,查询返回所有项。
categoryGifts111=1
警告 将条件注入 SQL 查询时要小心。即使它在你注入的上下文中看起来是无害的,应用程序在多个不同的查询中使用来自单个请求的数据也是很常见的。例如,如果您的条件达到 or 语句,则可能会导致意外丢失数据。OR 1=1UPDATEDELETE
颠覆应用逻辑
想象一下,一个应用程序允许用户使用用户名和密码登录。如果用户提交了用户名和密码,则应用程序通过执行以下 SQL 查询来检查凭据:wienerbluecheese
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
如果查询返回用户的详细信息,则登录成功。否则,它将被拒绝。
在这种情况下,攻击者可以以任何用户身份登录,而无需密码。他们可以使用 SQL 注释序列从查询子句中删除密码检查来执行此操作。例如,提交用户名和空白密码将导致以下查询:--WHEREadministrator'--
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
此查询返回其所在用户,并成功将攻击者登录为该用户。usernameadministrator
-
实验室:WHERE 子句中允许检索隐藏数据的 SQL 注入漏洞
本实验在产品类别筛选器中包含一个 SQL 注入漏洞。当用户选择类别时,应用程序将执行如下所示的 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
若要解决实验室问题,请执行 SQL 注入攻击,使应用程序显示一个或多个未发布的产品。
- 使用 Burp Suite 拦截和修改设置产品类别过滤器的请求。
- 修改参数,为其赋值category'+OR+1=1--
- 提交请求,并验证响应现在是否包含一个或多个未发布的产品。
实验步骤
URL 中输入单引号,查看是否存在漏洞,服务器返回一个错误,借以得知容易受到 SQL 注入攻击
URL 中输入'+OR+1=1-- (查询字符串中空格被编码成+号)
数据库执行的 SQL 查询则为
SELECT * FROM products WHERE category = ''or 1=1-- ' AND released = 1
通过'来闭合参数,-- 来注释后半部分
-
实验室:允许绕过登录的 SQL 注入漏洞
本实验在登录函数中包含一个 SQL 注入漏洞。
若要解决实验室问题,请执行以用户身份登录应用程序的 SQL 注入攻击。administrator
- 使用 Burp Suite 拦截和修改登录请求。
- 修改参数,为其赋值:usernameadministrator'--
实验步骤
目的为以管理员用户登录应用程序
尝试账号密码为admin。网页显示,Invalid username or password,无效的用户名或密码,故此不知道是用户名还是密码错误。
从实验室说明中查的用户名为administrator
在Username中输入any' or 1=1 -- ,密码随便写毕竟会被注释掉
用any'来闭合参数,or一个为真即可通过,-- 是 sql 的注释语法注释掉后面的密码
在Username中输入administrator'-- ,密码随便写毕竟会被注释掉
浏览器连上代理,在登录页面用 bp 抓包,修改其参数