SQL注入的原理、过程及如何防范
SQL注入的原理:
定义:通过把SQL命令插入到 web表单提交、输入域名、页面请求的查询字符串,最终达到欺骗服务器 执行恶意的sql命令。
它的本质就是服务器对代码和数据不区分,未对用户提交的参数进行校检或者有效的过滤,直接进行sql语句的拼接,改变了原有的sql语义,传进数据库解析引擎中执行。
网页一般分为静态页面和动态页面。静态页面一般是HTML或者htm页面格式,不需要服务器解析脚本。也就不存在sql漏洞,但是它灵活性交互性就很差。动态页面一般是asp,jsp,php等页面格式,它是由相应的脚本引擎来解释执行,根据指令来生成网页。但是在与数据库交互时,可能会存在SQL漏洞。
动态网页访问过程:
SQL注入的场景:
一切用户可控参数的地方,比如:URL路径,GET/POST请求参数,HTTP请求头。
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方法把特殊字符替换成空格