zl程序教程

您现在的位置是:首页 >  后端

当前栏目

sql注入原理,为什么要sql注入

注入SQL原理 为什么
2023-09-11 14:19:27 时间

sql注入原理,SQL注入攻击是通过操作输入来修改SQL语句,用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。

sql注入原理: 

下面我们来说一下sql注入原理,以使读者对sql注入攻击有一个感性的认识,至于其他攻击,原理是一致的。

SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。

SQL注入式攻击的主要形式有两种:

    一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。

    二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。

为什么要sql注入?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

防止SQL注入:

  1、开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置

  2、执行sql语句使用addslashes进行sql语句转换

  3、Sql语句书写尽量不要省略小引号和单引号

  4、过滤掉sql语句中的一些关键字:update、insert、delete、select、*

  5、提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

  6、Php配置文件中设置register_globals为off,关闭全局变量注册

SQL注入语句的简单例子

1.SQL注入漏洞的几种判断方法

http://www.heetian.com/showtail.asp?id=40'

http://www.heetian.com/showtail.asp?id=40 and 1=1

http://www.heetian.com/showtail.asp?id=40 and 1=2

如果执行①后,页面上提示报错或者提示数据库错误的话,说明是存在注入漏洞的。

如果执行②后,页面正常显示,而执行③后,页面报错,那么说明这个页面是存在注入漏洞的。

因为正确的链接:http://www.heetian.com/showtail.asp?id=40没有问题,如果如果执行①后,页面上提示报错或者提示数据库错误的话说明是不满足条件,说明查询的条件不满足,是有一个查询语句的,明是存在注入漏洞,如果执行②后,页面正常显示,而执行③后,页面报错,那么说明这个页面是存在注入漏洞的。

2.收集信息、判断数据库类型

从其返回的信息中可以判断下数据库的类型,更多可能可以知道部分数据库中的字段以及其他有用信息,为下一步攻击提供铺垫。

3.根据注入参数类型,重构SQL语句的原貌

①ID=40 这类注入的参数是数字型,那么SQL语句的原貌大致是:Select*from 表名 where 字段=40

②name=电影 这类注入的参数是字符型,SQL语句原貌大致是:Select*from 表名 where 字段=‘电影’

③搜索时没有过滤参数的,如keyword=关键字,SQL语句原貌大致是:Select*from 表名 where 字段 like ‘%关键字%’

4.猜解表名、字段名(直接将SQL语句添加到URL后)

①and exists(select*from 表名)

如果页面没有任何变化,说明附加条件成立,那么就是说明猜解的表名正确,反之,就是不存在这个表,接下来就继续猜解,知道正确

②and exists(select 字段 from 表名)

方法原理同上

③猜解字段内容(利用以上猜解出的表名和字段名 方法较古老且麻烦)

●猜解字段内容的长度

(select top 1 len(字段名)from 表名)>0 直至猜解到>n不成立的时候,得出字段的长度为:n+1。

●得到长度后,猜解具体的内容

(select top 1 asc(mid(username,1,1))from 表名)>0直到>m不成立时,就可以猜解出ASCII码的值了。