漏洞分析SQL Injection Attack Lab(自用,记录)
SQL Injection Attack Lab
1 Overview
SQL注入是一种利用web应用程序和数据库服务器之间接口漏洞的代码注入技术。当用户的输入在被发送到后端数据库服务器之前没有在web应用程序中被正确地检查时,就会出现漏洞。
许多web应用程序接受用户的输入,然后使用这些输入构造SQL查询,因此web应用程序可以从数据库获取信息。Web应用程序也使用SQL查询在数据库中存储信息。这些是web应用程序开发中的常见实践。当SQL查询的构造不仔细,可能会出现SQL注入漏洞。SQL注入攻击是web应用程序中最常见的攻击之一。
在这个实验室中,我们创建了一个容易受到SQL注入攻击的web应用程序。我们的web应用程序包括许多web开发人员经常犯的错误。学生的目标是找到利用SQL注入漏洞的方法,演示攻击可以造成的破坏,并掌握可以帮助防御此类攻击的技术。
2 Lab Environment
2.1 Environment Configuration
Starting the Apache Server
启动Apache服务器。Apache web服务器默认启动。可以使用下面的命令手动启动web服务器。本次实验所用的虚拟机中是Apache2服务。
Configuring DNS(虚拟机已经配置好)
Configuring Apache Server(虚拟机已经配置好)
2.2 Turn Off the Countermeasure
关闭 php 自动防御 SQL 注入攻击的机制。通过路径/etc/php5/apache2/
找到php.ini
文件,将其中的magic_quotes_gpc = On改为Off
,重新执行命令sudo service apache2 restart
用来重启apache服务。
PS:vim使用小技巧,在非INSERT模式输入命令:set nu
显示行号
在非INSERT模式输入命令/magic_quotes_gpc
进行查找
2.3 Patch the Existing VM to Add the Web Application
对现有的VM进行补丁,以添加Web应用程序。将patch.tar.gz
文件复制到虚拟机中,进入存放的目录
,执行以下命令即可。
3 Lab Tasks
3.1 Task 1: MySQL Console
这个任务的目标是通过使用所提供的数据库来熟悉SQL命令。有一个名为Users的数据库,其中包含一个名为credential的表;表存储每位员工的个人资料(如eid、密码、薪资、ssn等)。管理员是al-lowed可以更改所有员工的个人资料,但每个员工只能更改自己的信息。在这个任务中,您需要使用数据库来熟悉SQL查询。
登入MySQL数据库,用户名root,密码seedubuntu
进入Users数据库
查询Users数据库包含的表
使用SQL语句查询Alice的所有信息
3.2 Task 2: SQL Injection Attack on SELECT Statement
进入网页www.SEEDLabSQLInjection.com
该界面是员工登入时的界面,其处理代码如下
分析上面的代码,可以知道select语句存在SQL注入漏洞,可以利用攻击.当登入用户为admin时,会显示所有员工的信息
SQL Injection Attack from webpage
任务目标为从管理员登录页面,可以看到所有员工的信息。假设知道管理员的帐户名,即admin,但不知道ID或密码。
由代码分析可以知道,在ID栏输入’ or name=’admin’#
就可以成功以admin的身份登入.原因是,第一个单引号
会闭合eid=’$input_eid’
,使条件变成了eid=’’or name=’admin’#
,但是#会把后面的语句都注释掉,所以相当于直接登入admin.
SQL Injection Attack from command line
任务目标为从命令行登录页面,可以看到所有员工的信息。假设知道管理员的帐户名,即admin,但不知道ID或密码。
该部分需要使用curl命令,虚拟机中无,且apt-get install curl失败,所以没有继续做该部分实验
Append a new SQL statement
在以上两种攻击中,我们只能窃取信息从数据库中;如果我们可以修改数据库使用相同的漏洞在登录页面。方法是使用SQL注入攻击将一条SQL语句转换为两条SQL语句,第二个是update或delete语句。在SQL中,分号(;)用于分隔两个SQL语句。请描述如何使用登录页面让服务器运行两条SQL语句。尝试从数据库中删除一条记录,并描述您的观察结果。
构造注入语句admin'; update user set name='test' #
进行尝试
发现失败了,原因是, 在MySQL中实现了一种特殊的保护机制,mysq_query不允许提交多个请求
,导致我们两个连续的请求就会报错。
3.3 Task 3: SQL Injection Attack on UPDATE Statement
SQL Injection Attack on UPDATE Statement — modify salary
员工只能更新他们的昵称,电子邮件,地址,电话号码,和密码;他们无权改变工资。只有管理员允许做工资的变化。如果你是一个恶意的员工(比如Alice),你在这个任务中的目标是增加你自己的工资通过这个编辑档案页面。我们假设您知道工资存储在a中列称为salary。
以Alice的身份登入, 在ID栏输入10000’#
就可以成功与Alice身份登入(由task2可以知道Alice的Employee ID是10000)
由上图可知,Alice的原始工资为20000,现在通过注入攻击,修改工资为199901.
首先,查看这部分代码
分析上面的代码可以知道,只需要在nickname输入框中输入语句', salary='199901' where EID='10000';#
即可将原来的代码修改为
在修改输入框中进行注入攻击
攻击结果如下,可以发现Alice的工资成功被修改为199901
SQL Injection Attack on UPDATE Statement — modify other people’ password
这个任务的目标是修改另一个员工的密码,你可以成功地使用新密码登录受害者的账户。假设这里你已经知道你想攻击的员工的名字(例如Ryan)。
由代码可分析出password在数据库中是以sha1的形式存储的,输入以下命令获取指定数字的sha1值,这里用0113作为密码
0113的sha1值为bc7d28a99c80767ae5dd0eb7ef058f68d053fb60
通过Alice修改Ryan的密码,在Alice的nickname栏输入', Password='bc7d28a99c80767ae5dd0eb7ef058f68d053fb60' where Name='Ryan';#
登入Ryan的账户, Employee ID是30000(Task2可知),密码0113(刚才注入设置的)
3.4 Task 4: Countermeasure — Prepared Statement
SQL注入漏洞的根本问题是数据与代码的分离失败,因此我们可以针对这个原因进行防御
防御策略1—默认开启magic_quotes_gpc
防御转义特殊字符使用,默认开启magic_quotes_gpc,将magic_quotes_gpc值设为On
,后执行sudo service apache2 restart
该语句.
防御策略2—避免使用特殊字符
MySQL提供一个函数 mysql_real_escape_string()
,这个函数可以用来过滤一些特殊字符;如\x00, \n, \r, , ', " and \x1a;
防御策略3—数据与SQL语句分离
通过SQL逻辑分离来告诉数据库哪部分是数据部分,哪部分是SQL语句部分;提供以新的new mysqli()
函数, 将这个函数写入config/standary/config.php
文件