Sql注入实验

 

作业题目

SQL注入是一种代码注入技术,它利用web应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在web应用程序中正确检查时,就会出现此漏洞。许多web应用程序从用户处获取输入,然后使用这些输入构造SQL查询,这样web应用程序就可以从数据库中获取信息。Web应用程序还使用SQL查询在数据库中存储信息。这些是web应用程序开发中的常见做法。如果未仔细构造SQL查询,则可能会出现SQL注入漏洞。SQL注入攻击是对web应用程序最常见的攻击之一。

在本实验室中,我们创建了一个易受SQL注入攻击的web应用程序。我们的web应用程序包含许多web开发人员所犯的常见错误。学生的目标是找到利用SQL注入漏洞的方法,演示攻击可能造成的损害,并掌握有助于抵御此类攻击的技术。

实验步骤及结果

Lab Environment

我们使用容器来设置易受SQL注入攻击的web应用程序。使用两个容器,一个用于托管web应用程序,另一个用于托管web应用程序的数据库。web应用程序容器的IP地址为10.9.0.5,web应用程序的URL为:http://www.seed-server.com.

向/etc/hosts文件添加:

把这个主机名映射到容器的IP地址。

清除以前的容器:

1.5

创建容器:

1.1

开启容器:

登陆网站:

成功。

数据库表credential内容:

Task 1: Get Familiar with SQL Statements

目的:熟悉SQL命令。

进入mysql容器中,以root用户身份登录到MySQL:

使用use命令来加载现有的数据库:

打印员工Alice的所有信息:

Task 2: SQL Injection Attack on SELECT Statement

位于/var/www/SQL_Injection目录中的PHP代码的不安全的unsafe_home.php,用于进行用户身份验证。

该程序检查是否有记录与提供的用户名和密码匹配;如果有匹配,则该用户已成功进行身份验证,并获得相应的员工信息。如果没有匹配项,则身份验证将失败。

无论输入什么数据,它们最终都将成为SQL字符串的一部分并被数据库执行。

Task 2.1: SQL Injection Attack from webpage.

目的:以管理员的身份从登录页面登录到web应用程序中,假设知道管理员的帐户名但不知道密码。

向USERNAME输入Admin’#

通过表单发起攻击, 将会形成以下SQL语句:
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email,

nickname, Password

FROM credential

WHERE name= ‘Admin’#’ and Password=’$hashed_pwd’";

从#开始,到行尾的内容都会被视为注释,所以上述SQL等价于:

$sql = "SELECT id, name, eid, salary, birth, ssn, address, email,

nickname, Password

FROM credential

WHERE name= ‘Admin’”;

点击Login按钮提交表单执行SQL语句,成功进入Web程序:

Task 2.2: SQL Injection Attack from command line.

目的:使用命令行完成SQL注入攻击。

通过cURL可以从命令行发送表单,但是在HTTP请求发送后,它附加的特殊字符需要被编码,%27(撇号),%20(空格),%23(井号)。

所以,在命令行中输入指令:

得到结果:

Task 2.3: Append a new SQL statement.

目的:通过登录页面运行两个SQL语句。

在SQL中,多条以分号分隔的语句可以包含在一条语句字符串中,所以,通过分号,就能在已有的SQL语句后加一条新的SQL语句了。

在网页输入Admin';update credential set salary=0 where Name='Alice';#' 将Alice的salary改为0.

出现错误:

这是因为PHP中mysqli扩展的query()函数不允许在数据库服务器中运行多条语句,这是对SQL注入攻击的一种保护措施。

想要执行多条SQL语句,可以使用muti-query().

修改unsafe_home.php:

重新创建开启docker:

进入网页重复上述操作:

发现网页什么也没有显示。

把unsafe_home.php改回去,登录Admin查看,发现时成功了的:

Task 3: SQL Injection Attack on UPDATE Statement

员工登录自己的账号,可以修改自己的信息。

在/var/www/SQLInjection 目录中的unsafe_edit_backend.php用于更新员工信息。

Task 3.1: Modify your own salary.

目的:修改用户自己的salary。

在USERNAME输入Alice’;#’登录Alice账号。

点击Edit Profile更新信息:

可以发现我们并不能直接修改salary。

通过表单向SQL中注入 Alice’,salary = ‘999999,将Alice的salary修改为999999.

Task 3.2: Modify other people’ salary.

目的:修改别人的salary。

想要降低Boby的薪水,首先要知道他的id。

通过Admin,可以知道Boby的id为:

通过表单向SQL中注入 ’,salary = ‘1’ where name=Boby;#,将Boby的salary修改为1.

修改成功:

Task 3.3: Modify other people’ password.

目的:修改Boby的密码登录他的账户。

查看unsafe_edit_backen.php:

php使用SHA-1对输入的密码进行哈希处理后,再存入数据库表的Password字段中。

将Boby密码改为空,首先计算哈希值。

为:da39a3ee5e6b4b0d3255bfef95601890afd80709

通过表单向SQL中注入 ’,Password = ‘da39a3ee5e6b4b0d3255bfef95601890afd80709’ where name=Boby;#,将Boby的Password修改为空.

成功登录:

查看数据库,确实成功修改:

Task 4: Countermeasure — Prepared Statement

将代码和数据混在一起时造成SQL注入攻击的原因,开发者知道这两者之间的界限,但这两段信息混合后会发给SQL解析器,解析器并不能区分。

我们可以使用预处理语句防御SQL注入攻击。预处理语句首先向数据库发送一个SQL语句模板,模板中保留未确定的参数,数据库解析、编译该模板并把它存储下来,之后重复使用,在不同的情况下,只有数据是不同的,做到了使用分开的通道向数据库服务器发送代码和数据。

进入http://www.seed-server.com/defense/

登录,发现显示出用户的信息:

用户输入的数据将被发送到服务器程序getinfo.php,该程序调用一个名为unsafe.php的程序:

可以发现,该程序使用SQL直接查询,这是不安全的。

修改unsafe.php:

首先发送模板sql,sql中有两个?表示两个为数据准备的占位符,通过blind_param()参数绑定需要传递的数据参数eid和pwd,函数的第一个参数制定相关数据项的数据类型,再本任务中,两个数据项都是字符串类型,所以是‘ss'。绑定后执行字符串,使用blind_result()函数绑定结果中的列到变量中,当fetch()函数被执行时,特定列属性的数据就被放到了指定的变量中。

重启docker后,尝试攻击:

攻击失败:

posted @   wajiez  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示