我很难弄清楚什么是SQL注入攻击,或者更一般地说,什么是注入攻击。互联网上的大多数解释都很难理解。有人能用外行人的话解释一下注入攻击是什么,特别是SQL注入吗?此外,有什么方法来抵御这些呢?
谢谢
发布于 2015-10-04 09:57:12
用外行人的话说:
典型的web应用程序分为三层(browser +web服务器+后端数据库).当用户访问一个网站时,他的浏览器接收到html和js,它们是静态网页的产物,以及使用服务器端代码(例如php、asp)动态生成的网页。在登录时,您向web服务器发送密码和用户名,web服务器处理这些参数,并应用预先编程的身份验证逻辑(在php、asp中).Such逻辑需要使用存储用户数据的数据库进行验证,并允许简单验证:用户名匹配密码。因此,服务器端逻辑接受您的参数并查询数据库(例如MySQL)。
SELECT * FROM Users WHERE username='your_supplied_username' AND password='your_supplied_password';数据库处理这个过程,并返回(如果数据库设计正确)只有一个(用户名和密码匹配)或零(错误密码)匹配的“代表你”。
我不是你的兄弟,兄弟:一个草率的开发人员会接受你发送的参数,并将它们直接放到your_supplied_*字段中。如果用户不是恶意用户,这根本不是问题。然而,对于恶意攻击者来说,这为攻击打开了一扇巨大的大门。如果您熟悉SQL,那么您知道这一点,并且需要左表达式和右表达式才能计算为true。另外,在SQLi中,注释字符"--“是一个有用的朋友,所以,如果我写我的_username‘;-?
SELECT * FROM Users WHERE username='your_supplied_username';--' AND password='your_supplied_password';服务器端代码将接受我的输入,将其应用于字符串查询,并将其发送到数据库。数据库将
' AND password='your_supplied_password';同时保持:
SELECT * FROM Users WHERE username='your_supplied_username'这是一个有效的查询,很容易计算为true。这里的行为各不相同。如果用户名是唯一的(通常是唯一的),则只返回一条记录。如果不是,将返回多个记录,web服务器代码(例如php)通常会选择第一个记录。如果您熟悉SQL,现在您可能会得到创造性的查询和链查询,使用通配符并变得狂野。现在的问题是:
现在,这取决于您正在使用的服务器端语言,但是编码原语通常都是相同的。您可以使用php (http://php.net/manual/en/mysqli.real-escape-string.php)或使用准备好的语句(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)转义特殊序列。
我如何知道服务器是否受到SQLi的影响?您可以运行诸如SQLMap或SQLNinja等工具。您还可以转到表单并编写
在'gibberish中,“希望”会混淆php查询解析器,并泄漏浏览器上显示的错误(SQL语句错误)。还有其他技术,例如在查询中注入一个睡眠语句,以检查数据库在返回之前是否挂起几秒钟。作为一种防御机制,在将SQL错误发送给用户之前,您应该始终在服务器端代码上处理SQL错误,以避免信息泄漏。
保持安全;)
发布于 2015-10-04 04:16:32
SQL注入攻击本质上是攻击者通过利用应用程序处理某些字符串(特别是字符串转义字符)中的漏洞或错误配置来访问数据库内容的一种方式。
我能想到的最简单的方式来描述它是你有一个web表单,需要用户输入来完成一项调查。在正常情况下,用户将在表单中输入他们的信息并提交。但是,如果web应用程序没有通过删除某些特殊字符来正确地清理输入,攻击者就可以输入一个SQL命令来提取数据,而不是键入预期的数据。在http://www.w3schools.com/sql/sql_injection.asp中有一些常用的SQL注入方法和技术的示例。
有几种方法可以减轻SQL注入可能造成的损害。清理输入可以防止攻击者输入执行SQL命令所需的特殊字符,限制web数据库帐户的权限可以阻止SQL注入可以收集的数据。
https://security.stackexchange.com/questions/101801
复制相似问题