SQL注入的原理、过程及如何防范

SQL注入的原理:

定义:通过把SQL命令插入到 web表单提交、输入域名、页面请求的查询字符串,最终达到欺骗服务器 执行恶意的sql命令。

它的本质就是服务器对代码和数据不区分,未对用户提交的参数进行校检或者有效的过滤,直接进行sql语句的拼接,改变了原有的sql语义,传进数据库解析引擎中执行。

网页一般分为静态页面和动态页面。静态页面一般是HTML或者htm页面格式,不需要服务器解析脚本。也就不存在sql漏洞,但是它灵活性交互性就很差。动态页面一般是asp,jsp,php等页面格式,它是由相应的脚本引擎来解释执行,根据指令来生成网页。但是在与数据库交互时,可能会存在SQL漏洞。

 

动态网页访问过程:

SQL注入的原理、过程及如何防范

SQL注入的场景:

一切用户可控参数的地方,比如:URL路径,GET/POST请求参数,HTTP请求头。

 

SQL注入过程:

SQL注入的原理、过程及如何防范

 

SQL注入的原理、过程及如何防范

 

详细过程:

①通过检查Web页面上存在的SQL注入漏洞,构建特殊的SQL注入点;

②其次通过这些特殊的注入点利用Web页面动态传递参数的功能,将SQL的语法组合动态传递给数据库;

③然后根据数据库的不同类型,对数据库采取不同的处理;

④最后执行SQL语句,从而达到攻击者想要的目的。

判断注入点:

在含有传递参数的动态网页中,判断是否存在注入漏洞。通常的判断方法有参数传递的地方输入参“and 1=1” ;“and 1=2”

结果:分别返回不同的页面,说明存在注入漏洞。

判断数据库类型:

通过函数来判断数据库类型:内置的函数的区别。

举例,len和length使用and len('a')=1的时候,返回正常页面时,mssql,或mysql。反之则可能会是oracle和informix

②--和# 这两个注释符号

MSSQSL是--,而MYSQL是#,ACCESS不支持注释

         HTTP://xxx.xxx.xxx/abc.asp?p=12--

         HTTP://xxx.xxx.xxx/abc.asp?p=12#

 

 

SQL注入的作用:

绕过登陆验证:使用万能密码登陆网站后台等;

获取敏感数据:获取网站管理员的账号密码等;

文件系统操作:列目录,读取,写入文件等;

注册表操作:读取、写入,删除注册表;

执行系统命令:远程执行系统命令。

 

 

注入漏洞分类

 按照数据类型

数字型注入(Integer)

select * from table where id =1

字符型注入(String)

select * from table where username=‘test’

字符型注入最关键的是如何闭合SQL语句以及注释多余的代码

按返回结果

 显错注入(Error-Based)

返回错误信息来判断结果

 盲注(Boolean/Time-Based Blind)

在不知道数据库返回值情况下,对数据库的内容进行猜测

猜测

基于时间盲注

查看时间延迟语句是否执行,页面返回时间增加了

基于布尔盲注

返回页面来判断条件的真假(order by exists)

其他分类

 POST注入:注入字段在POST数据中

 Cookie注入:注入字段在Cookie数据中

搜索注入:注入处为搜索的点

 Baes64注入:注入字符串需要经过base64加密

 布尔型盲注:即可以根据返回页面判断条件真假的注入

时间延迟型盲注

即不能根据页面返回内容判断任何信息,用条件语 句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断

报错回显型注入

即页面会返回错误信息,或者把注入的语句的结果 直接返回在页面中

联合查询型注入

可以使用union的情况下的注入

堆查询型注入

可以同时执行多条语句的执行时的注入

 

 

SQL注入利用工具- sqlmap

是一个自动化的SQL注入工具,其主要功能是扫描,发现并 利用给定的URL的SQL注入漏洞,目前支持的数据库是MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

五种SQL注入技术

基于布尔的盲注,即可以根据返回页面判断条件真假的注入

基于时间的盲注,即不能根据页面返回内容判断任何信息, 用条件语句查看时间延迟语句是否执行(即页面返回时间是否增 加)来判断

基于报错注入,即页面会返回错误信息,或者把注入的语句 的结果直接返回在页面中。

联合查询注入,可以使用union的情况下的注入。

堆查询注入,可以同时执行多条语句的执行时的注入

SQLMAP常用命令

-u 指定检测的URL地址 –dbs 列出数据库

-D cms --tables 获取指定数据库cms的表名

-D cms -T cms_users --columns  获取指定数据库cms及指定表cms_users的列名

-r c:\sqltest.txt  加载请求数据

--cookie=COOKIE  登录后的cookie

--proxy="http://127.0.0.1:8080"  使用HTTP代理

 

防御SQL注入漏洞

过滤的对象

用户的输入

 提交的URL请求中的参数部分

 从cookie中得到的数据

 部署防SQL注入系统或脚本

 过滤特殊字符

单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符

 str_replace方法把特殊字符替换成空格