SQL注入(SQL Injection)就是攻击者将SQL语句通过Web网页注入到网站后台的数据库中,从而对数据库进行控制或者破坏。SQL注入是一种主流的攻击方式。在OWASP Top 10中,一直稳居第一。
SQL注入攻击的原理就是由于Web后台对用户输入的数据不进行严格的检查导致的,使得攻击者可以通过在post/get等web表单、输入域名或页面请求的查询字符串中插入恶意的SQL命令,并被web服务器执行,从而绕过PHP等脚本的不严谨导致的漏洞,与数据库进行交互,而这些都不是设计者本来的设计意图。
在进行SQL注入的时候我们需要判断注入点的闭合条件,可将SQL注入点大致分为三类:数字型注入点、字符型注入点、搜索型注入点。
顾名思义就是输入数据是数字的就是数字型注入,在使用带关于ID啊,岁数啊!就是这种注入点,而由于在弱数据类型中,是没有数据类型这一概念的(其实有但是不那么严谨),就比如说,PHP中输入的数据,PHP是可以自动推导出数据的数据类型的,而Python中是将输入的数据全部转换成字符串。
例如:
select * from 表名 where 数字型参数 = 1
字符型注入点就是输入的数据是字符型,字符型与数字型的区别就是有没有引号括起来,但是一般情况下数字型也可以括起来,而字符型就行不行了,必须有引号。在使用带关于姓名,地址,就是这种注入点。
例如:
select * from 表名 where 字符型参数 = 'text'
搜索型注入点是在进行数据搜索时没过滤搜索参数,一般在链接地址中有"keyword=关键字",直接通过搜索框表单提交。
例如:
select * from 表名 where 字段 like '%关键字%'
这种分类就是通过判断向数据库进行提交用到了那种提交方式,比较常用的有GET、POSH方式。
这种注入方式是通过GET请求方式向服务器提交数据,注入点位置在GET数据部分,在URL中显示。
使用了POST请求方式向服务器提交数据,注入点位置在POST数据部分,没有在URL中显示。
这种注入一般在在 HTTP 请求头部的某个字段中,比如UA或者cooke都有可能。
我们可以通过注入后,对返回的执行效果进行分析,可分为布尔型,时间型,报错型。
基于报错注入是没有数据的回显位,也就是说即使构造语句成功,我们也没有办法看到数据的显示,但是这种注入型却可以通过页面执行后返回的错误信息显示在页面上,这时候我们可以利用这点来构造报错显示sql语句。
布尔的盲注就是说通过判断执行后返回效果,即真假两种答案进行语句猜测。
布尔型盲注是由于页面提交数据在与数据交互是完全没有在页面上出现回显数据,只会出现数据提交正确和错误两种不同页面(注意区别于报错型,报错会出现报错信息,而布尔型不会)。
例如:A问一个哑巴事情,对就点头,错就摇头。
场景如下:
A:“朋友,你是不姓张?”
哑巴:摇头
A:“我知道了,你姓李吗?”
哑巴:点头
A:“原来姓李”
然后A开始了新一轮的猜测
时间型的注入遇到的条件更为苛刻,由于交互完成以后网站没有错误和正确的页面的回显,这种情况我们可以利用条件语句与时间延迟语句进行判断,关键函数是sleep()
。
联合查询注入是可以使用union all的情况下的注入。
堆查询注入是说可以同时执行多条SQL语句。
宽字节注入就是由于后台机制会给特殊字符添加转义字符来达到防御的目的,即%--->\
等, 但是当我们输入%5c%27,即(’),后台对%5c添加转义%df等于的我们输入的%5c%27组合就被添加为%df%5c%27,由于%df%5c是一个宽字节汉字,语句就会形成縗%27
-->縗'
。
SQL注入作为OWASP Top 10的第一名,说明其危害性是可以说显而易见的。当攻击者控制一个企业的数据库的时候,可以想象下,我们如果在这个企业上有金额或者姓名、身份证等隐私数据将会被曝光,这是非常可怕的。
以下是说可能涉及到的危害:
get
,post
。''
,""
,()
,('')
,("")
,[]
,{}
检测SQL一般分两种:手工检查、全自动检测
手工检查
一般使用盲打的方式,就是不知道后台代码,靠自己的经验去猜测,或者使用一些比较敏感的符号''
,""
,()
,('')
,("")
,[]
,{}
反正见到输入框或者是URL参数就是加代码。
全自动检测
检测工具:啊d注入工具、明小子、Pangolin、Sqlmap(推荐)
任何的检测方式都有利有弊,所以真正厉害的大牛,都是使用半手工半自动。
select system_user()--系统用户名
select user()--用户名
select current_user()--当前用户名
select session_user()--连接数据库用的用户名
select database()--数据库名
select version()--mysql数据库版本
select load_file(路径)--mysql读取本地文件的函数
select @@datadir--数据库路径
select @@basedir--mysql安装路径
select @@version_compile_os--操作系统
做一个网络的维护者,而不是攻击者!