SEED:SQL Injection Attack Lab
你可以到SEED官网获取实验资料:Buffer-Overflow Attack Lab (Server Version)
SQL注入概述
…….
一、 作业题目
SQL注入实验
二、 实验步骤及结果
1. 实验环境
拓扑结构
本次实验镜像有两个容器,其中一个是Web服务器,另外一个则用于托管Web程序的数据库。
Web服务器的IP地址为:10.9.0.5
域名:
Web服务的URL地址为:http://www.seed-server.com
为了确保这个URL地址能够被解析,你需要查看/etc/hosts文件,确保该URL条目绑定Web服务器IP地址。如果不是,使用root权限修改这个条目。
MySQL数据库:
数据库服务器的IP地址为:10.9.0.6
Web应用程序:
这是一个简单的员工管理应用程序。员工可以通过此web应用程序查看和更新数据库中的个人信息。该web应用程序主要有两个角色:管理员是一个特权角色,可以管理每个员工的个人资料信息;员工是一个正常的角色,可以查看或更新他/她自己的个人资料信息。所有员工信息如表1所示。
2. 熟悉SQL语句
在SQL服务器已经创建了一个名为sqllab-users的数据库,其中包含一个称为credential的表。该表存储每个员工的个人信息(如eid、密码、工资、ssn等)。操作该数据库进行练习。
首先进入到SQL服务器:
连接一个MySQL服务:
使用某个数据库,需要注意的是SQL语句通常情况下需要分号“;”结束:
发现数据库虽然存在,但是没有表和数据,查看容器启动信息,发现容器对于sqllab_users.sql文件权限被拒绝,向该文件添加可执行权限,虽然容器启动没有警告了,但是数据库依然没有内容。
将sql文件复制到容器:
……
然后搞定了
查询alice的所有信息:
在前面已经知道表的结构和数据,因此根据id查询Alice的信息即可:
下面发现镜像文件有问题,容器启动后web服务器无法工作
3. 基于SELECT的SQL注入
使用www.seed-server.com的登录页面执行此任务。登录页面要求用户提供用户名和密码。web应用程序根据这两条数据对用户进行身份验证,因此只有知道其密码的员工才能登录。作为攻击者,您的工作是在不知道任何员工凭据的情况下登录web应用程序。
以下内容展示了Web服务器如何对账号密码进行验证:
可以看到后端通过GET方法获取参数username和password这代表大概率可以直接在URL中键入SQL注入的语句。
验证的思路是是否查询到数据库中是否有条目满足账号密码都等于用户的输入。
1) 从网页进行SQL注入
网页上的账号密码表单在点击提交以后,通过http协议传输到后端,后端解析账号密码参数时进行注入。
一般的账号密码验证都是通过数据库语句返回条件情况进行判断,构造下面输入:
(这里“单引号”是因为用户名是字符串类型)
那么数据库执行语句为:
这条语句使得登录验证的逻辑始终为真,后端程序误以为登录验证为真,使得用户直接绕过登录验证。
2) 从命令行进行SQL注入
这里只需要在请求URL中构造下面命令即可,参数会被自动带入后端程序进行执行,注意需要对字符进行URL编码。
使用“curl”运行下面命令即可:
(或者直接在地址栏中输入相应的内容也可以)
- 添加一条新的SQL语句
如果需要执行其他语句,首先想到联合查询和“分号”。
如果联合查询让前一个查询条件失效,那么便可以随便构造SQL语句进行执行。
对于“分号”,那么数据库会执行后面的SQL语句。
通过“分号”构造下面语句,同时注释后面的内容:
但是这里数据库并不允许同时运行多条SQL语句。
4. 基于UPDATE的SQL注入
相比于“SELECT”语句的注入,UPDATE注入语句可能更加危险,因为可以允许直接修改数据库信息。
1) 修改自己的工资
这里不允许修改工资选项,但是SQL语句是这样:
只需要选择nickname作为注入点,然后附带需要修改的信息,这样薪水修改部分就可以被附加执行了:
修改其他人的工资
这个问题其实和上面的思路一致,需要设置ID为boby的数字,同时注释后面部分:修改其他人的密码
这里密码会经过hash以后存储到数据库中,因此构造注入语句时需要注入hash以后的密码:
- 应对策略-预编译
SQL注入的根本原因是违背了“数据和代码隔离”的原则,对于用户的输入并没有限制在数据水平。预编译可以有效解决这个问题,当SQL语句被执行预编译以后,只会保留未被填入的数据部分,攻击者无法再更改SQL注入语句的结构,智能填入对应类型的数据,从而有效避免这类攻击。
- 改修复Web应用SQL漏洞
在index页面中键入的数据将被发送到服务器程序unsafe.php,这是一个不安全的程序,对SQL注入攻击没有防御机制。
现在新建一个safe.php文件修复该漏洞,同时将index中的链接指向该程序此php程序即可(unsafe.php程序位于image_www/Code/adefense文件夹中;同时可能需要重启容器以更新配置)。
主要更改SQL语句部分,增加预编译的逻辑: