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地址。
清除以前的容器:
创建容器:
开启容器:
登陆网站:
成功。
数据库表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后,尝试攻击:
攻击失败:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理