SeedLabs-Web安全-SQL注入实验

本文详述了SeedLabs的Web安全实验,聚焦于SQL注入攻击。通过Task1熟悉SQL语句,Task2展示了利用SQL注入进行SELECT和UPDATE操作,包括网页和命令行攻击。Task3揭示了如何通过注入执行多条SQL语句,而Task4则讨论了防止SQL注入的Prepared Statement策略。
部署运行你感兴趣的模型镜像

SeedLabs-Web安全-SQL注入实验



前言

SQL注入的实验记录,基本的不做赘述


提示:以下是本篇文章正文内容,下面案例可供参考

一、Task1 熟悉SQL语句

1. 进入容器内部

首先查看自己的mysql环境id:docker ps
在这里插入图片描述
然后根据id进入容器内部:docker exec -it 61ce7ad48298 /bin/bash
在这里插入图片描述

2.使用基本的SQL语句

在docker容器中连接localhost数据库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输出credential
在这里插入图片描述

二、Task2 SQL注入攻击之select

2.1 网页SQL注入攻击。

你的任务是作为从管理员的登录页面,可以看到所有员工的信息。我们假设您知道管理员的帐户名是admin,但不知道密码。你需要决定在Username和Password字段中键入什么以成功进行攻击。
查看登录接口unsafe_home.php源码可知在这里插入图片描述

其中SQL语句,直接对用户传参进行拼接,那么完全可以自己合拼单引号,如下
在这里插入图片描述

这样最终在后台的SQL语句会成为:

SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= 'admin' and 1=1 -- and Password='$hashed_pwd'

后面的代码会被注释,where语句恒成立,即可直接登录到系统
在这里插入图片描述

2.2 来自命令行的SQL注入攻击。

来自命令行的SQL注入攻击。你的任务是重复任务2.1,但你需要不要使用网页。可以使用curl等命令行工具发送HTTP请求。值得一提的是,如果您希望在HTTP中包含多个参数请求时,需要将URL和参数放在一对单引号之间;否则,特别用于分隔参数的字符(如&)将由shell程序解释,更改命令含义。下面的例子展示了如何发送一个HTTP GET请求到我们的web申请,附加两个参数(用户名和密码):美元curl www.seed-server.com/unsafe_home.php ?用户名= alice&Password = 11的如果需要在用户名或密码字段中包含特殊字符,则需要进行编码正确地使用它们,或者它们可以改变您请求的含义。如果你想包含单引号字段,您应该使用%27代替;如果您想包含空白,您应该使用%20。在这个任务中,在使用curl发送请求时,需要处理HTTP编码。

curl请求即可,因为是get请求,不需要太多参数配置
在这里插入图片描述

2.3 添加一条新的SQL语句。

在以上两种攻击中,我们只能从数据库;如果我们可以在登录页面中使用相同的漏洞来修改数据库将会更好。一种想法是使用SQL注入攻击将一个SQL语句变成两个,第二个SQL语句是更新或删除语句。在SQL中,两个SQL语句之间用分号分隔。请尽量通过登录页面运行两个SQL语句。有一个对策可以防止您在这种攻击中运行两个SQL语句。请使用SEED的书或网上的资源来找出这个对策是什么,描述你的发现并体现在实验室报告中。

同时运行两个程序,一般是使用分号,或者别名联合查询。常使用预编译、参数化SQL语句来防止这种情况出现
多语句的具体使用情况下在Task3中体现

三、SQL注入攻击之UPDATE

3.1 修改自己的薪水。

如Edit Profile页面所示,员工只能更新他们的昵称、电子邮件、地址、电话号码和密码;他们无权更改他们的的薪水。假设你(爱丽丝)是一个不满的员工,你的老板鲍比没有增加你的今年的工资。控件中的SQL注入漏洞来增加自己的薪水编辑按钮页面。请展示一下你是如何做到的。我们假设你知道工资都存储在名为薪水的列中。

首先我们用Alice账户登录到站点
查看Edit Profile,Save调用接口的源码unsafe_edit_backend.php
在这里插入图片描述
其实也就是在不影响原有语句的情况下插入自己的语句
phonenumber传参:1213’,salary=20001,phonenumber='123

最终sql执行的是

UPDATE credential SET nickname='',email='',address='',
PhoneNumber='1213',salary=20001,phonenumber='123' where ID=$id;

然后看下数据库
在这里插入图片描述
20000修改成了20001,嗯,很符合公司加工资的气质~~~

3.2 修改他人工资

给自己涨工资后,你决定惩罚你的老板Boby。你想把他的工资降低到1美元。请展示一下你是如何做到的。

按照3.1的方式,修改薪资,只不过这次是把name换成Boby,直接在第一个Nickname参数进行注入:
',salary=1 where name = ‘Boby’ –
那最终执行的语句为:


UPDATE credential SET nickname='',salary='1' where name = 'Boby' -- ',email='',address='',PhoneNumber='1213',salary=20001,phonenumber='123' where ID=$id;

查看数据库可看到修改成功
在这里插入图片描述

四、Countermeasure — Prepared Statement

预编译语句,参数化数据

$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= ? and Password= ?");
      $sql->bind_param("ss", $input_uname, $hashed_pwd);

使用?占位,然后预编译语句,最后将参数放到占位符中,这样就无法拼接sql,对于特殊字符拼接(这里列举为单引号),单引号会被转义,不会扰乱原有的单引号,最终语句如下:

SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= ? and Password= ?
-- 进行SQL注入,预编译后的语句为:

SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= 'admin\'or 1=1 -- ' and Password= '1'

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值