DVWA平台的sql注入学习

概念

SQL攻击 简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入 SQL 指令,在设计不良的 程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,此因遭到破坏或是入侵。

原因

在应用程序中若有下列状况,则可能应用程序正暴露在SQLInjection的高风险情况下:

1.  在应用程序中使用字符串联结方式组合SQL指令。

2.  在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用sa(内置的最高权限的系统管理员账户)连接Microsoft SQL Server数据库)。

3.  在数据库中开放了不必要但权力过大的功能(例如在MicrosoftSQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)

4.  太过于信任用户所输入的数据,未限制输入的字符数,以及未对用户输入的数据做潜在指令的检查。

作用原理

1.  SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)

2.  SQL命令对于传入的字符串参数是用单引号字符所包起来。《但连续2个单引号字元,在SQL资料库中,则视为字串中的一个单引号字元》

3.  SQL命令中,可以注入注解《连续2个减号字元 -- 后的文字为注解,或/**/所包起来的文字为注解》

因此,如果在组合 SQL 的命令字符串时,未针对单引号字符作取代处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的 SQL 语法的作用。

可能造成的伤害

1.  数据表中的数据外泄,例如个人机密数据,账户数据,密码等。

2.  数据结构被黑客探知,得以做进一步攻击(例如SELECT* FROM sys.tables)。

3.  数据库服务器被攻击,系统管理员账户被窜改(例如ALTERLOGIN sa WITH PASSWORD='xxxxxx')。

4.  获取系统较高权限后,有可能得以在网页加入恶意链接以及XSS

5.  经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统(例如xp_cmdshell "net stop iisadmin"可停止服务器的IIS服务)。

6.  破坏硬盘数据,瘫痪全系统(例如xp_cmdshell "FORMATC:")。

避免的方法

1.  在设计应用程序时,完全使用参数化查询(ParameterizedQuery)来设计数据访问功能。

2.  在组合SQL字符串时,先针对所传入的参数作字符取代(将单引号字符取代为连续2个单引号字符)。

3.  如果使用PHP开发网页程序的话,亦可打开PHP的魔术引号(Magic quote)功能(自动将所有的网页传入参数,将单引号字符取代为连续2个单引号字符)。

4.  其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NETSqlDataSource对象或是 LINQ to SQL

5.  使用SQL防注入系统。


以上来自维基百科:https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A

DVWA平台sql注入

(平台安全等级为low)
尝试输入单引号’,得到报错:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1
有了这个报错,我们可以得到这个表单存在漏洞
尝试输入 1 or 1=1,得到的结果是id为1的信息:
DVWA平台的sql注入学习_第1张图片

再次尝试输入1 ‘ or ’1‘ = ’1,得到全部的信息:
DVWA平台的sql注入学习_第2张图片

为什么能得到这个?

从源代码的角度看,该页面的php的可能相关源码为:

可以看到,源码将输入框内获得的id值添加到查询语句之后,并没有对id进行检查是否合法,所以对于输入1 ‘ or ’1‘ = ’1,其最后得到的查询语句就变成:
select * from table_name where problem_id='1' or '1' = '1'

利用sql的注释符"-- "可进行更多操作,例如:

利用注释符号将最后面的单引号注释掉,得到全部的信息,并且排序:
DVWA平台的sql注入学习_第3张图片

利用UNION操作获取更多的信息:

要用UNION语句,必须先知道后台的查询语句的查询结果是多少列的,所以利用order by语句测试,此处就是将输入“‘ or '1' = '1' order by 1 -- ”的order by 1部分改成2,3……当按照第二列排序时,不报错,当按第三列排序时,报错,因此可得到查询结果是2列的。所以我们用UNION也是选择2列。
例如:
1'and 1=2 union select 1,@@global.version_compile_os from mysql.user -- /*获得操作系统信息
1' and 1=2 union select 1,schema_name from information_schema.schemata -- /*爆出所有数据库名称
利用mysql默认的数据库infromation_scehma,该数据库存储了Mysql所有数据库和表的信息。
1' and exists(select * from users) -- /*猜解表名
猜解dvwa数据库中的表名利用1 and exists(select * from 表名),此处表名猜解可以通过brupsuit挂字典猜解。
1' and exists(select first_name from users) -- /*猜解字段名
同猜解表名,无该表名,则报出错误Unknown column '表名' in 'field list'
1' and 1=2 union select first_name,last_name from users -- /*字段内容
根据获取的字段名,可以获取数据库内容。若是存放管理员的账号密码,则密码则也可以被爆出。
此处是利用后台select语句进行注入,获得数据库信息,若后台的是insert等语句,又可达到不同的攻击效果。

最后上其php源码中有关数据库查询的代码:
DVWA平台的sql注入学习_第4张图片

当用户点击submit按钮后,以GET方式获取输入框内的内容,而后直接将变量id的内容插入到查询字符串getid中,并未对id进行一个输入是否合法等的判断,使得注入可以实现。

再看安全等级为medium和high的源码:
medium:
DVWA平台的sql注入学习_第5张图片
high:
DVWA平台的sql注入学习_第6张图片
分别用了mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符和stripslashes函数。

你可能感兴趣的:(DVWA平台的sql注入学习)