详解SQL注入原理

无人久伴 提交于 2020-03-07 13:37:19

看到有好多人在问:什么是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.对口令进行加密。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!