0基础学习SQL注入之万能账号密码(BUUctf例题-[极客大挑战 2019]EasySQL1)

news2024/11/30 12:34:01

做题

借助例题[极客大挑战 2019]EasySQL1来理解SQL注入中的万能账号密码。

我们现解题,解题过程中的知识点在后面都会说到。

 打开网址,我们看到的是这个界面。根据题目提示应该是属于SQL注入类型的

1.寻找注入点,很明显,输入用户名和密码的地方应该就是注入点

2.判断闭合方式是字符型还是数字型

我们输入1 1' 1" 查看界面回显,可以发现

在用户名处输入1' 1"时候,界面的回显是一样的

回显界面都是下面的这个

 当我们输入1'后,回显就是这样的

 可以判断出单引号为起闭合方式

一般情况下,SQL语句闭合方式为单引号

输入1、1"时,没有SQL语句报错,只是提示我们输入的值是不对的,因此我们可以先假设SQL语句闭合方式是单引号

username输入1时,形成的sql语句是

SELECT*FROM table_name WHERE username='1'and password='123';

username输入1"时,形成的sql语句是正确的

SELECT*FROM table_name WHERE username='1"'and password='123';

username输入的是1',形成的sql语句是错误的

SELECT*FROM table_name WHERE username='1''and password='123';

第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错。

所以可以推出SQL语句闭合方式是单引号。

假设SQL语句是双引号闭合的情况

username输入1时,形成的sql语句是正确的 SELECT*FROM table_name WHERE username="1"and password="123";

username输入1"时,形成的sql语句是 SELECT*FROM table_name WHERE username="1""and password="123"; 正确的SQL语句不可以出现一对双引号包含双引号的。所以上面这条应该出现SQL报错,但实际没有报错,因此我们假设的双引号闭合方式是不成立的。

username输入的是1',形成的sql语句是正确的,不会报错 SELECT*FROM table_name WHERE username="1'"and password="123"; 而然实际上这条语句报错了,因此我们假设的双引号闭合方式是不成立的。

综上,我们可以推出SQL语句闭合方式是单引号

3.尝试万能账户和密码解题

一般来说,有账号密码登陆的题,在判断完闭合方式后,可以尝试先用万能账号密码解题

(用户名和密码至少有一个输入万能密码即可获得正确的flag)

 可以看到得到了flag

 知识点

1.造成SQL注入的原因

在没有对用户的输入进行过滤、检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句。利用SQL注入:由于系统没有对输入的数据进行过滤、检测,就带入到数据库中执行SQL语句,那么当用户输入一条恶意的数据,使其与原SQL语句拼接、重组得到一条恶意的SQL语句,当数据库执行这条恶意的SQL语句时,就会把数据库中的信息暴露出来,从而泄露信息。

2.防止SQL注入的措施

1、SQL语句的执行代码使用预编译 PreparedStatement 。

2、确定每个数据的类型,比如是数字,数据库则必须使用int类型来存储。

3、限制传入数据的长度,这能够在一定程度上防止sql注入。

4、严格限制用户使用数据库的权限,能够在一定程度上减少sql注入的危害。

5、避免直接响应一些 sql 语句执行异常的信息。

6、过滤参数中含有的一些数据库关键词。

3.判断SQL语句闭合方式原理:

MYSQL数据库的包容性比较强,如果你输错了数据的类型,MYSQL数据库会自动将其转换成正确的数据类型,比如输入1)、1"、1-等,只要数字后面的字符不是闭合符的,数据库都会把你输入的错误的数据转换成正确的数据类型。

但是,若输入的数字后面的字符恰好是闭合符,则会形成闭合,若闭合后形成的sql语句是错误的,那么sql语句执行就会错误,从而造成页面显示错误。

例如:在Mysql数据库下,代码如下:

$id=$_GET[‘id’];
$sql=“SELECT * FROM name WHERE id=’$id’ LIMIT 0,1”;

可以看到’(单引号)就是这条语句的闭合符 当,id输入的是1),那么拼接成的sql语句就是:“SELECT * FROM name WHERE id=‘1)’ LIMIT 0,1”; 按理来说这个sql语句应该是错误的,执行会报错,但是因为是在Mysql数据库环境下,它会自动把错误的数据1)转换成合法的数据1,从而使得sql语句执行成功,相同的输入1-、1"也一样。

但是,若id输入的是1’,那么形成的sql语句就是:“SELECT * FROM name WHERE id=‘1’ '(两个单引号) LIMIT 0,1”; 那么第1个单引号就和第2个单引号形成闭合,然后还剩下一个多余的第3个单引号,从而报错。

只要在输入的数据中,形成了新的闭合,且组成的sql语句不正确,那么就会报错。

相反SqlServer、oracle数据库对数据类型很严格,输错数据类型不会自动转换成正确的数据类型,所以只要输入的数据类型不正确就会出现报错信息。 以此特性就可以进行bool盲注。

 4.万能账户密码

一、什么是万能账号密码

我们平时登录账号时,如果是第一次登录,系统会提示我们注册账号,并将我们注册的账号和密码保存到数据库中。当我们再次登录时,系统会将我们输入的账号和密码和数据库中的数据进行匹配,匹配成功能登录。这就意味着我们需要知道一个已经注册过并且正确的账号和密码才能进行登录,那如果我不小心忘记了我的账号或者密码,或者我压根就不知道账号和密码,还有没有办法登录呢?答案是肯定的,那就是 【万能账号密码】

万能账号密码是指 【万能账号】和 【万能密码】,顾名思义,就是可以 【登录任意网站】的账号和密码

1、万能账号

当我们不知道用户的账号并且不知道用户的密码时,可以使用万能账号。

万能账号并不是一个真正意义上的账号,它是一种【拥有不同变体的格式】

需要注意的是,以下所有万能账号中的 a 可以是自定义的数字或字母,比如 1,2,3,b,c,d

【数值型万能账号】

a or true #              a or ture #
a or 1 #                 a or 1 #
a or 1 -- a             (注意第2个a前面有个空格)
a or true -- a          (注意第2个a前面有个空格)

【单引号字符型万能密码】

a' or true#
a' or 1#
a' or 1 -- a(注意第2个a前面有个空格)
a' or true -- a(注意第2个a前面有个空格)

【双引号字符型万能密码】

a" or true #
​
a" or 1 #
​
a" or 1 -- a
​
a" or true -- a

1.1 万能账号的使用

账号输入 【万能账号】, 比如 a or true #

密码随便输入,比如 123456

一个网络安全意识淡薄的网站,其登录功能的SQL语句大概是下面这个样子

select * from user where username='user' and password='pass'

1、万能账号原理

当我们在登录界面输入 【万能账号】比如 a’ or true # 以后,后端会将我们输入的参数拼接到SQL中,然后去数据库中查询账号和密码,SQL语句大概是下面这样

select * from user where username='a' or true #' and password='pass'

由于 # 在SQL中是注释符,注释符后面的内容不起作用,所以真正执行的SQL语句大概是下面这样

select * from user where username='a' or true

or true 会使SQL语句恒成立,从而查询出数据库中的所有账号和密码,从而使我们成功登录

1.1 注释符

除了 # 以外, -- 也是SQL中的注释符,但SQL的语法格式规定--和后面的注释内容必须间隔一个空格,所以这需要使用 a' or 1 -- a 而不是 a' or 1 -- 其原理和 a’ or 1 # 大同小异,拼接到SQL中大概是下面这样

select * from user where username='a' or true -- a' and password='pass'

注释后面的内容不生效,真正执行的SQL大概是下面这样

select * from user where username='a' or true

SQL语句恒成立,从而登录成功

换句话来说,a' or true -- a经过SQL的转化后,结果等价于 a’ or true #

1.2 比较运算符

SQL中规定,非布尔类型的数据参与比较运算时,会转化为布尔类型再参与运算。比如 or 1 或者 or 1=1 ,会转化为布尔类型的 true 再参与 or 的比较运算,也就是变成 or true ,同样能使条件恒成立,从而登录成功

简单来讲就是:a' or 1 # 或者 a' or 1=1 # 这里1转化为布尔类型就是true ,1=1转换为布尔卡类型也是true,等价于 a' or true #

2、万能密码

当我们知道用户的账号,但不知道用户的密码时,可以使用万能密码,万能密码并不是一个真正意义上的密码,而是一个【拥有不同变体的格式】

需要注意的是:万能密码中的 admin,必须是真实的用户名

【数值型万能密码】

admin #

admin -- a(a前面有空格)

【单引号字符串型万能密码】

admin' #

admin' -- a(a的前面有空格)

【双引号字符串型万能密码】

admin” #

admin" -- a(a的前面有空格)

2、万能密码原理

当我们在登录界面输入 【万能密码】 比如 admin’ # 以后,后端会将我们输入的参数拼接到SQL中,大概是下面这样

select * from user where username='admin' #' and password='pass'

由于 # 在SQL中是注释符,注释符后面的内容不起作用,所以真正执行的SQL大概是下面这样

select * from user where username='admin'

SQL只会在数据库中查询用户名,而不是同时查询用户名和密码,这就意味着,只要用户名正确,就可以登录成功

2.1 注释符

除了 # ,-- 在SQL中也是注释符,SQL的语法格式规定 --后面必须使用空格来间隔后面的注释内容,所以需要将 --写作 -- a,后面的 a 可以是任意数字或者字母

简单来件就是 admin' – a 等价于 admin'#

使用HackBar进行SQL注入

Load URL(加载网址):将网址“框”下来 Split URL(切分网址):自动切分网址,便于快速找出需要修的地方 Execute(执行):相当于F5

image-20240313162759457

/check.php?username=a' or true %23& password=1

添加check.php是因为

跳转到check.php页面,可知此页面与数据库产生交互。

GET传参要经过url编码,所以使用url进行输入时,不能使用#,而应该使用其url编码%23

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1602834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JDK17的Mybatis-Plus报错问题

添加 --add-opens java.base/java.langALL-UNNAMED

物理机安装centos7并配置基本环境,网络配置,docker配置

1.首先下载镜像Download 2.下载UltraISO 安装docker 第1步:卸载当前版本docker yum erase docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \do…

unity制作拼接地图

前段时间有个朋友问我想要制作一款地图编辑器,最开始我还想着在一个平面用节点切割制作地图编辑器这倒是也行,但不太好控制每一个点,如果未来项目大了,更加不好维护。 偶然间翻到一篇文章:unity地图边缘检测 或许我们…

升级啦!探索全新 StarRocks 中文社区与高效使用秘籍!

眼尖的朋友可能已经注意到,StarRocks 中文社区最近换上了全新的皮肤。是的,我们 StarRocks 的聚集地升级了!🎉 自成立两年半以来,StarRocks 中文社区不断壮大,现已发展成为一个拥有数万名成员的活跃社区。…

2024年团队程序设计天梯赛模拟赛 L1 + L2

目录 L1 - 6 剪切复制 L1 - 8 小偷踩点 L2 - 1 推宝塔 L2 - 2 含茶量 L2 - 3 到底爱不爱我 L2 - 4 寻宝图 L1 - 6 剪切复制 使用计算机进行文本编辑时常见的功能是剪切功能(快捷键:Ctrl X)。请实现一个简单的具有剪切和粘贴功能的文本…

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明:本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时,总是出错的背景下,不得已搜索和整理了一下,如何用命令行进行sql server 数据库和用户管理的方法,作为从Access2019 直接导出数据到sql server 数据库…

低噪声放大器是如何实现低噪声放大的功能的

灵敏度作为接收机最重要的指标之一,直接决定了接收机能分辨的最小信号。接收机的灵敏度计算公式如下所示。 Psensitivity=-174dBm+NF+10*lg(BW)+SNR 由接收机灵敏度的计算公式可知,影响接收机灵敏度的指标有噪声系数、带宽和信噪比,因此一旦带宽和信噪比确定了,那么能决…

图像基础—图像分类

图像通常分为二值图像、灰度图像和彩色图像 图 1-3 二值图像、灰度图像和彩色图像 (1)二值图像 二值图像又称为黑白图像,图像中任何一个点非黑即白,要么为白色(像素 为 255),要么为黑色&#x…

制作一个RISC-V的操作系统十一-定时器中断

文章目录 CLINT定时器中断mtimemtimecmp机制总体框架流程时间节拍系统时钟代码 CLINT 产生软件中断和定时器中断 定时器中断 mtime 类似计数器,按照硬件对应的固定频率递增 上电后会自动复位为0,有硬件自动完成 mtimecmp 需要自己设置&#xff0…

Docker安装Oracle之踩坑记

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

ai免费打造写真大片!3个宝藏工具!

随着科技的飞速发展,人工智能(AI)已经渗透到我们生活的方方面面,包括摄影和图像处理领域。今天,我们就来揭秘那些能够让你轻松打造出专业级写真大片的AI工具,让你的摄影作品惊艳全场! 迅捷图片转…

机器学习理论入门---线性回归从理论到实践

线性回归是机器学习里面最简单也是最常用的算法,理解了线性回归的推导之后对于后续的学习有很大帮助,所以我决定从这里开始深入学习相关的机器学习模型。 本篇首先从矩阵求导开始切入,然后介绍一次线性回归的推导,再到代码实现。本…

2024第十五届蓝桥杯JavaB组省赛部分题目

目录 第三题 第四题 第五题 第六题 第七题 第八题 转载请声明出处,谢谢! 填空题暂时可以移步另一篇文章:2024第十五届蓝桥杯 Java B组 填空题-CSDN博客 第三题 第四题 第五题 第六题 第七题 第八题 制作不易,还请点个赞支持…

PyTorch深度学习之旅:从入门到精通的十个关键步骤

在人工智能的浪潮中,深度学习框架扮演着至关重要的角色。PyTorch作为其中的佼佼者,以其简洁、直观和灵活的特性,吸引了众多开发者与研究者。本文将引导您逐步掌握PyTorch,从基础概念到高级应用,让您在深度学习的道路上…

LLM推理框架Triton Inference Server学习笔记(二): Triton模型部署流程(stey by stey)

官方文档查阅: TritonInferenceServer文档 1. 写在前面 上一篇文章对triton inference server进行了一个整体的介绍,解答了三个经典问题what, why, how。 这篇文章就开始转入实践, 从实践的角度整理Triton模型部署的全流程, 如果我有一个训…

一篇文章带你快速认识边缘计算(必看)

引言 5G时代带来了万物互联的飞跃,但随之而来的是数据量爆炸性增长与集中式数据中心处理模式的瓶颈:响应延迟、带宽压力、安全隐忧。边缘计算应运而生,借鉴生物智能分布式原理,将计算与分析推向数据源头,有效解决了以上…

Promise模块化编程ES6新特性

文章目录 Promise&模块化编程1.Promise基本介绍2.快速入门1.需求分析2.原生ajax jQuery3.Promise使用模板 3.课后练习1.原生ajax jQuery2.promise 4.模块化编程基本介绍5.CommonJS基本介绍6.ES5模块化编程1.题目2.示意图3.代码实例—普通导入导出function.jsuse.js 4.代码…

一文搞懂Kotlin符号处理接口KSP

公众号「稀有猿诉」 原文链接 一文搞懂Kotlin符号处理接口KSP Kotlin符号处理(Kotlin Symbol Processing)即KSP是可以用于开发轻量级编译器插件的一套API。是Kotlin原生的,Kotlin语法友好的编译器插件。使用简单且易于上手&#xff0c…

同城货运系统的开发与货运搬家软件的技术性探讨和市场分析

一、市场前景展望 随着城市化进程的加快和电商物流的蓬勃发展,同城货运市场展现出了巨大的潜力。尤其是在快节奏的生活环境中,个人和企业对于快速、便捷、可靠的货运搬家服务需求日益增长。同城货运系统与货运搬家软件作为连接货主与货运司机的桥梁&…

2024还想走c++后端的同学,该如何准备才有机会成功上岸拿到offer

c后端,一个被网上说没有市场的c方向。但是对于想从事c后端的同学该如何准备呢? 就目前的市场需求来说,c后端的需求市真不大,中小厂基本没有,大部分集中在大厂。 那么,如果大家想求职c后端,第一…