网络攻防技术-Sql注入实验(SQL Injection Attack Lab)
1 作业题目
SQL注入是一种代码注入技术,它利用web应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在web应用程序中正确检查时,就会出现此漏洞。许多web应用程序从用户处获取输入,然后使用这些输入构造SQL查询,这样web应用程序就可以从数据库中获取信息。Web应用程序还使用SQL查询在数据库中存储信息。这些是web应用程序开发中的常见做法。如果未仔细构造SQL查询,则可能会出现SQL注入漏洞。SQL注入攻击是对web应用程序最常见的攻击之一。
在本实验室中,我们创建了一个易受SQL注入攻击的web应用程序。我们的web应用程序包含许多web开发人员所犯的常见错误。学生的目标是找到利用SQL注入漏洞的方法,演示攻击可能造成的损害,并掌握有助于抵御此类攻击的技术。
2 实验步骤及结果
Lab Environment Setup
在Linux下的/etc/hosts中添加下面的映射

进入Labsetup根目录,运行dcbuild构建容器,dcup启动容器。然后访问http://www.seed-server.com即可进入实验环境

Task 1: Get Familiar with SQL Statements
进入MySQL程序并使用SQL库、展示表项及一句话打印表


退出

Task 2: SQL Injection Attack on SELECT Statement
Task 2.1: SQL Injection Attack from webpage.
登录网址www.seed-server.com后,观察 unsafe home.php,看到里面有如下判断:

我们只需要把判断 Password 的部分屏蔽即可,而且我们知道该数据库的管理员名字叫做admin,所以在USERNAME中输入以下内容,就可以把判断 Password 的部分屏蔽,然后登录上admin的账号。

登录成功,查到了所有员工的信息

Task 2.2: SQL Injection Attack from command line.
curl 是一个命令行工具,用于在终端或命令行界面下发送 HTTP 请求并获取响应。它支持多种协议,包括 HTTP、HTTPS、FTP、TELNET 等。
除了在网页完成注入攻击,我们还可以使用python脚本或者curl工具来完成SQL注入,这些方法相比较直接在网页注入的优势是可以自动化完成任务,curl工具也可以编写shell脚本来完成自动化注入,因此比较适合盲注的情况。
这里的登录参数传递方式是GET,因此使用curl的话命令格式比较简单。注意这里需要将单引号和#号转化成URL编码。这样就会响应我们请求的网页的源代码。

Task 2.3: Append a new SQL statement.
联合查询将两个或多个 SELECT 语句的结果合并成一个结果集,如果我们要执行UPDATE或者DELETE语句,可以使用;将两条语句分割,故可以构造payload如下,修改Alice的薪水。

但是无法执行,这是因为对于大多数数据库连接库,为了安全,$conn->query($sql)方法默认只能执行一条SQL语句,不支持在同一个字符串中使用分号分隔多个SQL语句。因此我们在前端注入UPDATE语句无法成功。

Task 3: SQL Injection Attack on UPDATE Statement
Task 3.1: Modify your own salary.
登入Alice的账户

观察 unsafe edit backend.php,看到有如下判断。

刚刚通过;方式分割SQL语句执行两条SQL语句的方法修改Alice的薪水行不通。我们可以尝试构造修改信息的参数来修改Alice的薪水。填写表单如下,点击Save。

这样后端执行的SQL语句就是这样,可以成功设置salary字段

返回个人信息页面后发现修改成功。

Task 3.2: Modify other people’ salary.
要修改其他人的薪水,可以用上述方法登录其他人的账号修改,也可以在Alice账号中构造Phonenumber参数如下

这样经过拼接后的SQL语句如下所示,可以修改Boby的薪水为1

查看数据表,修改成功

Task 3.3: Modify other people’ password.
查看代码,看到密码采用的是 sha1,我们随便找个在线转换网站转换一下就好了。

然后注入

提交参数,点击Save后,发现可以用密码‘888888’登录Boby账号

Task 4: Countermeasure — Prepared Statement
SQL语句的执行处理,分为即时语句和预处理语句。即时语句,顾名思义,一条SQL语句直接是走流程处理,一次编译,单次运行,此类普通语句被称作Immediate Statements(即时语句)。预处理语句(Prepared Statements,也称为参数化语句)只是一个SQL查询模板,其中包含占位符而不是实际参数值。在执行语句时,这些占位符将被实际值替换。预处理语句用于执行多个相同的SQL语句,并且执行效率更高。
预处理语句能够有效地防御SQL注入
相比于直接执行SQL语句,预处理语句有如下优势:
·预处理语句大大减少了分析时间。一个预处理语句可以高效地重复执行同一条语句,因为该语句仅被再次解析一次。
·绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
·使用不同的协议将参数值与查询分开发送到数据库服务器,保证了数据的合法性,有效地防范了SQL注入。因此预处理语句被认为是数据库安全性中最关键的元素之一。
进入Labsetup/image_www/Code/defense中的unsafe.php,将参数与查询分离,做如下改动:

重新构建环境后,可以看到,攻击失败了。

3 实验总结
实验属于最简单的 SQL injection。主要的收获在于最后一个 Task,以前只知道怎么注入,现在知道了怎么防御。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号