SQL注入
什么是SQL注入
理解SQL注入
SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行。如果web应用未对动态构造的SQL语句所使用的参数进行正确性审查,那么攻击者就很可能会修改后台SQL语句的构造。如果攻击者能够修改SQL语句,那么该语句将与应用的用户拥有相同的运行权限。
如果www.cimer/home.php?id=1 页面显示用户基本信息,我们可以尝试向输入参数id插入自己的SQL命令。可以通过URL添加字符串or 1=1来实现该目的: www.cimer/home.php?id=1 or 1=1
这样,php脚本构造并执行的SQL语句将忽略用户id为1的资料,这是因为我们修改了查询逻辑。添加的语句导致查询中的OR操作符永远返回真(即1永远等于1),从而出现这样的结果:
SELECT * FROM user WHERE id=1 or 1=1
展示了攻击者操纵动态创建的SQL语句的过程,该语句产生于未经验证或编码的输入,并能够执行应用开发人员未预见或未曾打算执行的操作。
OWASP
OW ASP(开放Web软体安全项目- Open Web Application Security Project)是一个开放社、非营利性组织,目前全球有130个分会近万名会员,其主要目标是研议协助解决Web软体安全之标准、工具与技术文件,长期致力于协助政府或企业了解并改善网页应用程式与网页服务的安全性。
TOP目标是通过展现出组织面临最严重的风险的一部分来提高我们对于应用安全的认识。2013的TOP10发行版标志着这个工程第十一年提高应用安全风险重要性的意识。OW ASP TOP10在2003年第一次被发行,在2004年和2007年有小小的改动。2010年的版本有了改进,是根据风险的重要程序而不是流行程度而排列。
SQL注入产生过程
SQL(结构化查询语言)是访问MsSQL、MySQL Oracle以及其他数据库服务器的标准语言。大多数web应用都需要与数据库进行交互,并且大多数web应用编程语言(如ASP、C#、.NET、JA V A和PHP)均提供了可编程的方法来与数据库相连并进行交互。如果web开发人员无法确保从web表单、cookie及输入参数等收到的值传递给SQL查询(该查询在数据库上执行)之前已经对其进行过验证,那么通常会出现SQL注入漏洞。如果攻击者能够控制发送给SQL查询的输入,并且能够操纵该输入将其解析为代码而非数据,那么攻击者就很可能在后台数据库执行该代码。
SQL注入的危害
这些危害包括但不局限于:
数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
网页篡改:通过操作数据库对特定网页进行篡改。
网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
破坏硬盘数据,瘫痪全系统。
一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大。
问题
什么是SQL注入?
SQL注入是一种通过操纵输入来修改后台SQL语句以达到利用代码进行攻击目的的技术。
SQL注入漏洞有哪些影响?
这取决于很多因素。例如,攻击者可潜在地操纵数据库中的数据,提取更多应用允许范围之的数据,并可能在数据库服务器上执行操作系统命令。
所选择的编程语言是否能避免SQL注入?
不能。任何编程语言,只要在将输入传递给动态创建的SQL语句之前未经过验证,就容易潜在地受到攻
击。
SQL注入攻击
在进行SQL注入攻击前,需要利用到从服务器返回的各种出错信息,但是在浏览器默认设置是不显示详细错误返回信息的,不论服务器返回什么错误,都只能看到“HTTP500服务器错误”,因此,在注入前首先要取消IE浏览器返回信息设置,以便查看到注入攻击时返回的数据库信息。
取消友好HTTP错误消息
打开IE浏览器,选择菜单“工具”->”Internet选项”对话框。打开“高级”选项卡,在设置列表中到“浏览”组,取消勾选”显示友好HTTP错误信息”复选框。
寻SQL注入
SQL注入可以出现在任何系统或用户接收数据输入的前端应用中,这些应用将会访问数据库服务器。
在web环境中,web浏览器是客户端,它扮演了向用户请求数据并将数据发送到远程服务器的前端角。远程服务器使用提交的数据创建SQL查询。该阶段的主要目标是识别服务器响应中的异常并确定是否是由SQL注入漏洞产生的。
通常注入是通过触发异常的输入来开始寻漏洞;最普遍的注入漏洞是由于参数值过滤不严导致的;Cookie注入漏洞普遍存在于ASP的程序中。
Cookie注入的原理:ASP中,获取参数值的标准方法为Request.QueryString (GET)或Request.Form (POST)。但是在很多程序员编写代码时,会简写成ID=Request(“参数名”),WEB服务从参数中获取数据会变成如下过程:
先取GET中的数据,没有再取POST中的数据,如果还没有则去取Cookies中的数据。因此Cookies中对应参数的参数值会被获取到然后代入到SQL命令中执行。
最常用的SQL注入判断方法,是在网站中寻如下形式的网页链接:
www.cimer/**.asp?id=xx
www.cimer/**.php?id=xx
www.cimer/**.jsp?id=xx
www.cimer/**.aspx?id=xx
如何判断某个网页链接是否存在SQL注入漏洞呢?
通常用两种检查方法:
“单引号”法
第一种检查SQL注入漏洞是否存在的方法是”单引号”法。方法很简单,直接在浏览器地址栏中网址链接后加上一个单引号,如果页面不能正常显示,浏览器返回一些异常信息,则说明该链接可能存在注入漏洞。
and 1=1和and 1=2法
很多时候检查提交包含引号链接时,会提示非法字符,或者直接不返回任何信息,但这并不等于不存在SQL注入漏洞。此时可以使用经典的”and 1=1和and 1=2”法进行检查。方法也很简单,就是直接在浏览器地址后分别加上and 1=1和and 1=2进行提交,如果返回不同的页面,那么说明存在SQL注入漏洞。
在数据库中的语句类似如下:
Select * from admin where id=1 and 1=1
Select * from admin where id=1 and 1=2
确认注入点
注入通过操纵用户数据输入并分析服务器响应来寻SQL注入漏洞的技术。识别出异常后,我们需要构造一条有效的SQL语句来确认SQL注入漏洞。
识别漏洞只是目标的一部分。最终目的是利用所测试应用中出现的漏洞。要实现该目标,需要构造一条有效的SQL请求,他会在远程数据库中执行且不会引发任何错误。
区分数字和字符串
要想构造有效的SQL注入语句,需要对SQL语言有一些基础的了解。执行SQL注入,首先要清楚数据库包含不同的数据类型,它们都具有不同的表达方式,可以将它们分为两种类型:
数字:不需要使用单引号来表示。
其他类型:使用单引号来表示。
数字型:
SELECT * FROM user WHERE id = 1
SELECT * FROM user WHERE id > 1
带引号类型的:
SELECT * FROM user WHERE name = ‘admin’
SELECT * FROM user WHERE date > ‘2014-2-24’
从中不难发现,数字字符混合值要使用单引号引起来。数据库就是以这种方式来为数字字母混合数据提供容器的。测试和利用SQL注入漏洞时,一般需要拥有WHERE子句后面所显示条件中的一个或多个值得控制权。正是因为这个原因,注入易受攻击的字符串字段时,需要考虑单引号的闭合。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论