您的位置:首页 > 数据库

详解SQL注入原理

2012-10-17 09:31 162 查看
看到有好多人在问:什么是SQL注入?我尝试google后发现,网上只有怎么SQL注入,并没有解释什么是SQL注入。在此我给大家解释一下。
在说明什么是SQL注入前先提下什么是静态页面,什么是动态页面。静态页面是一种实际存在的网页,无需经过服务器的处理,就可以直接加载读取的页面。静态页面一旦制作出来,除非修改源码,否则是无法对页面内的内容进行更改的。而动态页面与静态页面正好相反。动态页面并不是一个实际存在的网页,它的所有数据不是存储于页面上,而是存储于数据库中。只有当用户请求网页的时候,服务器才会从数据库读取数据,从而返回一个网页。所以不同的用户得到的网页内容也可能不同。举个例子,蓝莓’s
Blog首页就是一个典型的动态页面,不同的浏览器登陆时页面右上角提示内容也会不同,如果你是通过搜索引擎找到我的Blog的,右上角也会显示你所来自于的那个搜索引擎,如果你是直接访问本站,他会提示“您直接访问了本站! 莫非您记住了我的域名.厉害~我倍感荣幸啊 嘿嘿”,在举一个例子,比如你登陆QQ安全中兴,登陆后网页最上边会显示你的帐号,和你的称昵,这个也是一个动态页面。这点是静态页面无法办到的。而这里我们所要讲到的SQL注入就是利用动态页面的这种特性来入侵的。
其实当你打开一个动态页面的时候,就是在向服务器提交信息,服务器会根据你提交的信息,对数据库进行查询,从而返回适合你的信息。我们可以举个例子,比如一个动态页面地址为http://XXXXX/article/article.asp?ID=1,当你打开这个动态页面的时候,就会向数据库提交一个Select * from 表名 where 字段=”&ID,查询完成之后再将查询结果返回给你。正是因为动态页面的这种特性,一些Hacker会故意提交这么一个网址http://XXXXX/article/article.asp?ID=1
and user>0,这样的话服务器就会对对数据库进行查询Select * from 表名 where 字段=444 and user>0,这样服务器就会出错,因为这种SQL语句是不存在的,所以部分服务器就会返回出错信息,例子如下:

Microsoft OLE DB PRovider for ODBC Drivers (0x80040E07)

[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值 ‘sqladmin’ 转换为数据类型为 int 的列时发生语法错误。/article/article.asp, 第 35 行
从出错信息中可以得知,这个网站使用MS_SQL数据库,使用ODBC连接,连接数据库的帐号为sqladmin。这个就是传说中的SQL注入,他是利用网站管理员对用户提交的信息过滤不严,从而对网站提交特殊的代码,以此获得网站和服务器的信息,得到自己想知道的资料。比如一些Hacker想要得到admin的口令,那么他可以提交这样的网址:http://XXXXX/article/article.asp?ID=1 and (Select passWord from
login where user_name=’admin’)>0,(这个是请求数据库中表名为login,字段名为admin的信息)返回的信息如下:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)

[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 ‘admin888′
转换为数据类型为 int 的列时发生语法错误。/article/article.asp, 第 35 行这样,admin的口令就得到了,就是上面的admin888,得到admin的口令后,别人就可以登陆你的帐号,进入你的后台,后果的严重性想必大家都知道。上面的例子可能有点复杂,下面举一个简单点的,经典的万能密码。网站登陆时的SQL查询代码为:strSQL = “SELECT * FROM users WHERE (name = ‘” + username
+ “‘) and (pw = ‘”+ password +”‘);”填入万能密码userName = “‘ OR ’1′=’1″;passWord = “‘ OR ’1′=’1″;这个时候SQL字符串就变成:strSQL = “SELECT * FROM users WHERE (name = ” OR ’1′=’1′) and (pw = ” OR ’1′=’1′);”

简化一下,也就是SQL命令变成这样:strSQL = “SELECT * FROM users;”

这样就可以达到没有帐号密码也可以登陆了。
不仅如此,SQL注入还可能造成以下的危害。

1.数据结构被黑客探知,得以做进一步攻击(例如SELECT * FROM sys.tables)。

2.数据库服务器被攻击,系统管理员帐户被窜改(例如ALTER LOGIN sa WITH PASSWORD=’xxxxxx’)。

3.取得系统较高权限后,有可能得以在网页加入恶意连结以及XSS。

4.经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell “net stop iisadmin”可停止服务器的IIS服务)。

5.破坏硬盘数据,瘫痪全系统(例如xp_cmdshell “FORMAT C:”)。
防止SQL注入有一下几种方法,这里大概讲一下:

1.在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据访问功能。

2.在组合SQL字符串时,先针对所传入的参数作字符取代(将单引号字符取代为连续2个单引号字符)。

3.如果使用PHP开发网页程序的话,亦可打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字符取代为连续2个单引号字符)。

4.其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。

5.使用SQL防注入系统。

6.判断用户提交的信息,当用户提交的参数中含有”exec、insert、select、delete、from、update、count、user”之类的SQL注入字符时,转向错误页面。

7.对服务器返回的错误信息进行修改,让其无论遇到什么错误只返回404之类的错误就行了。

8.对口令进行加密。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: