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'
本文详述了SeedLabs的Web安全实验,聚焦于SQL注入攻击。通过Task1熟悉SQL语句,Task2展示了利用SQL注入进行SELECT和UPDATE操作,包括网页和命令行攻击。Task3揭示了如何通过注入执行多条SQL语句,而Task4则讨论了防止SQL注入的Prepared Statement策略。
5309

被折叠的 条评论
为什么被折叠?



