sqli第一关

news2024/12/30 2:26:37

1.在下使用火狐访问sqlilabs靶场并使用burpsuite代理火狐。左为sqlilabs第一关,右为burpsuite。

2.输入?id=1 and 1=1 与?id=1 and 1=2试试

可以看出没有变化哈,明显我们输入的语句被过滤了。在?id=1后面尝试各种字符,发现单引号         '   包裹后可以绕过。

 虽然注入成功了,但是这两种结果还是一样的,说明语句没有被执行并且这是字符型注入。报错提示我们说SQL语法错误,哦,原来是后端代码在注入点后还有个'LIMIT 0,1',意思就是从你表中的第0个数据开始只读取一个,此处可以使用--+或者%23来注释掉后面的LIMIT 0,1

--起着注释的作用,将后面的语句注释掉,+ 则代表空格 ,为什么要加一个+而不是单纯的空格呢?因为使用--  (后接一个单纯的空格),在传输过程中空格会被忽略,会导致无法注释,所以在get请求传参注入时才会使用--+的方式来闭合,因为+在SQL语句中会被解释成空格。空格的urlencode编码格式是%20,所以使用--%20也不会报错。

 同理#的urlencode编码格式是%23,那为什么不能直接用#而必须要使用urlencode编码格式呢?这个问题问的好,在url解释执行的时候,url中#号是用来指导浏览器动作的,对服务器端无用,所以我们要将#写成%23来完成注入。那为什么有些注入使用了#呢?这个问题问的也很好,说明小伙子你做事细心,根骨清奇。在get请求时是不可以直接使用#的,如果是post请求,则可以直接使用#来进行闭合。常见的就是表单注入,如我们在后台登录框中进行注入。为什么--后面必须要有空格,而#后面就不需要?哈哈哈哈,这个问题问的有点刁钻,果然阁下是人中龙凤,马中赤兔,不鸣则已,一鸣惊人。且容在下细细道来。在使用--注释时,后面有空格才能形成有效的SQL语句,而#后面有没有空格是不做要求的,简单来说就是,#后面有没有无所谓。

 成功注释了'LIMIT 0,1'之后,阁下就可以大展身手了。接下来我们使用union联合注入。在注入前我们还需要使用order by来确定表中的列数,为什么我们要确定表中字段的列数呢?这就不得不说联合查询特点:

1、要求多条查询语句的查询列数是一致的
2、要求多条查询语句的查询的每一列的类型和顺序最好一致
3、union关键字默认去重,如果使用union all 可以包含重复项

?id=1' order by 1--+
好,那我们开始构造语句如上。

一直往1后面的数字尝试,终于在4的时候发现了错误, 回显说这是一个未知的列,于是我们确定了字段数为3.

 从这里我们使用burpsuite来注入,因为后面的语句太长了而且也不习惯用浏览器的插件,不过使用burpsuite注入跟url直接注入是并没有太大区别的。

 抓取请求后右键发送到Repeater模块更容易操作。

 注意看红框框的地方哈,后面的图就不标啦(单击放大查看图片,单击图片外区域退出,不用谢

 骗你的,那种确实比较费眼睛,在下心疼giegie,这种样式怎么样。

 虽然图片有点失真,不过您就知足吧。

?id=1' union select 1,2,3--+
如上接下来使用联合查询看看有没有回显位。

咦,发生甚么事了,怎么没有动静。定睛一看原来是后端代码没有执行我们的语句,有什么办法让它不执行前面的id=1转来执行后面我们想要它执行的union select 1,2,3呢?好办,让id=一个不存在的值就OK啦。一般都是使用负数或者较大的数,这里0也可以,但我们就按照习惯使用-1好了。

 这个2和3是个是什么意思呢?这是两个回显位啦。喂,能不能讲清楚点?好小子,敢于挑战权威,我欣赏你。返回的结果为2和3,意味着我们可以在2和3的位置输入SQL语句。比如我们试一试查看当前数据库名以及数据库的版本名。

?id=-1' union select 1,database(),version()--+


 好,我们知道了当前数据库名为security,数据库的版本为5.5.24。知道了数据库名接下来我们尝试获取表名,只是知道了当前数据库名怎么构造语句来获取表名呢?嘿嘿,小伙子你不用担心这个,在MySQL中,除了自己新建的几个数据库之外,还有自带的四个数据库,名字分别是

information_schema数据库

保存了MySQl服务所有数据库的信息。具体MySQL服务有多少个数据库,各个数据库有哪些表,各个表中的字段是什么数据类型,各个表中有哪些索引,各个数据库要什么权限才能访问。

mysql数据库

这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。

performance_schema数据库

主要用于收集数据库服务器性能参数,提供进程等待的详细信息,包括锁、互斥变量、文件信息;保存历史的事件汇总信息,为提供MySQL服务器性能做出详细的判断;对于新增和删除监控事件点都非常容易,并可以随意改变mysql服务器的监控周期

test数据库

空的,这里面啥都没有。

另外我们还需要知道这些知识

information_schema.tables:包含了数据库里所有的表

table_schema:数据库名

table_name:表名

column_name:字段名

好的,了解了这些之后我们来试一试构造语句获取表名。
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+


看到这里你是不是又要问了,group_concat()是干嘛的?老夫我早就准备好了,group_concat()是MySQL中的一个函数。它将group by产生的同一个分组中的值连接起来,返回一个字符串结果,并且默认使用逗号分隔。可是group by又是个啥?额,一看你就没学过MySQL,小伙子我这就帮不了你啦,在工作或者学习中,总有很多东西是我们不了解甚至闻所未闻的,这很正常。没有人生而知之,但是你既然遇到了,你就得面对它。记住这样用就行了,还是去了解甚至抽空学习它,都取决于你自己,非学无以广才,非志无以成学。学到的知识都是有用的,它总会在潜移默化中改变你。加油,鲜衣怒马少年时,不负韶华行且知。

 成功啦!它返回了四个表名(这里我们只使用了2这个回显位)。毫无疑问,users表中的内容是我们需要的,接下来我们尝试获取字段名。

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'--+


从两段如此相似的代码中我们可以看出,MySQL查询语句大体是相似的,只需要改变其中的表名,列名以及属性值。

 OK,从返回的结果来看,我们获得了三个字段名,分别是id,username以及password。有一点数据库基础的小伙子都知道,id字段名下的字段一般都是普通的id,对我们并没有实质的意义。而另外两个字段名username和password就不一样,对我们这些练习注入的人来讲,获取这两个字段中的数据无疑就是拿到了钥匙。闲话少说,我们继续构造语句来获取其中的数据。

?id=-1' union select 1,group_concat(username,password),3 from users--+


这一句语句是不是简单多啦,偷着乐吧你。

 诶,看到这里你是不是感觉非常奇怪但是又说不上来。没错,两个字段中的数据连接起来了,group_conccat()函数只是用逗号将每一列分隔开了。这该如何是好呢?不用担心,函数是死的,人是活的嘛。在字段名之间再加上某个字符的十六进制,不就可以通过它将同一列的用户名和密码分隔开了嘛.

?id=-1' union select 1,group_concat(username,0x2a,password),3 from users--+

 到此就结束啦

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

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

相关文章

Linux内核分析与应用4-内存管理

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看 留此记录,蜻蜓点水,可作抛砖引玉 4.1 Linux内存管理机制 lscpu[2] 命令, 类似是优化后的 cat /proc/cpuinfo 实现虚拟内存的几种机制: 当 程序一旦跑起来,那就变成…

IDEA在创建包时如何把包分开实现自动分层

IDEA在创建包时如何把包分开实现自动分层 文章目录 IDEA在创建包时如何把包分开实现自动分层一、为什么要把包分开二、建包时如何把包自动分开三、如何编写配置文件路径? 一、为什么要把包分开 一开始的时候,我也一直以为包连在一起和分开没什么区别&am…

二叉搜索树/二叉排序树/二叉查找树

文章目录 1.概念2.操作3.实现3.1框架3.2BSTree.h3.3test.cpp 1.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,…

python 学习笔记(5)——SMTP 使用QQ邮箱发送邮件

目录 发送邮件 1、准备工作: 2、发送纯文本信息内容: 3、发送 HTML 格式的内容: 4、发送带附件的邮件: 5、群发(一个邮件,发给多个人): 发送邮件 以下都 以 QQ邮箱 为发送方举…

敏捷开发方法管理项目,适应变化,引领未来

​敏捷开发方法是一种灵活且高效的项目管理方法,旨在应对不断变化的需求和快速发展的项目环境。使用敏捷开发方法可以帮助团队更好地应对不确定性,提高项目的质量和效率。以下是使用敏捷开发方法管理项目的具体步骤: 明确项目目标和范围 在…

算法通过村第六关-树白银笔记|层次遍历

文章目录 前言1. 层次遍历介绍2. 基本的层次遍历与变换2.1 二叉树的层次遍历2.2 层次遍历-自底向上2.3 二叉树的锯齿形层次遍历2.4 N叉树的层次遍历 3. 几个处理每层元素的题目3.1 在每棵树行中找出最大值3.2 在每棵树行中找出平均值3.3 二叉树的右视图3.4 最底层最左边 总结 前…

C高级day4(shell脚本)

一、Xmind整理: 二、上课笔记整理: 1.创建一个文件,给组用户可读权限,所属用户可写权限,其他用户可执行权限,使用if判断文件有哪些权限 #!/bin/bash touch 1 chmod 241 1 if [ -r 1 ] thenecho "文件…

为 DevOps 战士准备的 Linux 命令

点击链接了解详情 这篇文章将帮助理解DevOps工程师所需的大部分重要且经常使用的Linux命令。 要执行这些命令,你可以使用任何Linux机器、虚拟机或在线Linux终端来迅速开始使用这些命令。 系统信息命令: hostname - 显示系统主机的名称。 hostid - 显示…

openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema

文章目录 openGauss学习笔记-66 openGauss 数据库管理-创建和管理schema66.1 背景信息66.2 注意事项66.3 操作步骤66.3.1 创建管理用户及权限schema66.3.2 使用schema66.3.3 schema的搜索路径66.3.4 schema的权限控制66.3.5 删除schema openGauss学习笔记-66 openGauss 数据库管…

Codeforces Round 827 (Div. 4) D 1e5+双重for循环技巧

Codeforces Round 827 (Div. 4) D 做题链接:Codeforces Round 827 (Div. 4) 给定一个由 n个正整数 a1,a2,…,an(1≤ai≤1000)组成的数组。求ij的最大值,使得ai和aj共质,否则−1,如果不存在这样的i&#…

github 创建自己的分支 并下载代码

github创建自己的分支 并下载代码 目录概述需求: 设计思路实现思路分析1.进入到master分支,git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…

Python基于Flask的招聘信息爬取、招聘信息可视化系统

招聘信息可视化系统 一、介绍 此系统是一个实时分析招聘信息的系统,应用Python爬虫、Flask框架、Echarts、VUE等技术实现。 二、系统运行图 1、数据概览 将爬取到的数据进行展示,点击公司信息和职位信息可以跳转到相应的网址,支持多条件…

这一次,我顿悟了

大家好,我是苍何。昨晚和编程导航 星球嘉宾也是我的引路人闫(yn) 小林大佬,畅聊了 4 个 小时,至今内心还是久久不能平静。 小林和我一样是跨界转行,他是医学院毕业,大二开始自学编程&#xff0…

【分布式】分布式事务:2PC

分布式事务的问题可以分为两部分: 并发控制 concurrency control原子提交 atomic commit 分布式事务问题的产生场景:一份数据被分片存在多台服务器上,那么每次事务处理都涉及到了多台机器。 可序列化(并发控制)&…

软件设计师学习笔记10-死锁资源数计算+进程资源图+段页式存储

目录 1.死锁资源数计算 1.1死锁 1.2进程管理与死锁资源的计算 2.进程资源图 3.段页式存储 3.1页式存储 3.1.1页式存储组织 3.1.2完整页表及页面淘汰原则 3.1.3页面置换算法(了解一下) 3.2段式存储 1.死锁资源数计算 1.1死锁 (1)死锁的概念:所谓死锁&…

C++-day4

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring> using namespace std; class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10…

mac 13.x 打开第三方应用,提示已损坏无法打开

前排提示&#xff0c;不一定有效 1、先在终端执行下面这个&#xff0c;因为要提权&#xff0c;输入自己的密码 sudo xattr -r -d com.apple.quarantine 具体应用 # 具体应用是一个路径&#xff0c;拖入 访达——应用程序——第三方应用 到终端就行 # sudo xattr -r -d com.app…

在Widows系统下载安装Ubuntu

1.下载VirtualBox Oracle VM VirtualBox 2.下载安装microsoft visual c 2019 进入百度&#xff1a;百度一下&#xff0c;你就知道 出现下面这个页面时&#xff0c;直接点击修复&#xff0c;点击修复后&#xff0c;出现【重新启动】按钮&#xff0c;点击【重新启动】&#xff…

微信小程序基础加强总结

本篇文章给大家带来了关于微信小程序的相关问题&#xff0c;其中主要介绍了一些基础内容&#xff0c;包括了自定义组件、样式隔离、数据、方法和属性等等内容&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 1、自定义组件 1.1、创建组件 在项目的根目录中&…

电机⽮量控制、直接转矩控制、参数辨识

直接转矩控制是一种控制异步电动机转矩的方式&#xff0c;其基本原理是测量和控制异步电动机定子电流矢量。在直接转矩控制中&#xff0c;定子磁链和转子磁链矢量可以表示为&#xff0c;并通过测量空间电角度的大小&#xff0c;来决定电磁转矩&#xff0c;进而实现直接转矩控制…