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--+

喏,这样不就一目了然了吗,什么?为什么必须要用这个字符的十六进制,不可以直接使用这个字符吗? 你试试不就知道了吗?少年,行动起来吧!

看吧,报错了吧,原理和文章上面的使用%23而不直接使用#的原因是一样的。实践出真知,这句话永远都是没错的,踏足新领域的人从来不满足于别人的经验。阁下哪个地方不懂不妨自己用实践来验证,实在不行就到百度或者CSDN搜一下喽。别人的经验教训也并非一无是处,你说对不对。

罗里吧嗦说了一大堆废话,给我点个赞,谢谢你啦!

sqlilabs第一关懵逼小解答相关推荐

  1. sqli-labs第一关和第二关

    sqli-labs 第一关 一.首先确定是否存在注入 二.找到回显位置 三.在回显位置使用函数或者语句来获取信息 第二关 一.首先确定是否存在注入 二.找到回显位置 三.在回显位置使用函数或者语句来获 ...

  2. sqli-labs第一关的闯关

    第一关:单引号错误 SQL的注入最终是为了拿到数据库的文件或者数据. 刚进页面,显示需要输入id.于是我们使用在地址栏后面加上 ?id=1 第二行的黄色字体是我自己添加的内容,表示被传入mysql执行 ...

  3. sqli-labs第一关

    1.首先要知道查库,查表,查列,查字段的基本语法 查库:select schema_name from information_schema.schemata 查表:select table_name ...

  4. sqli-labs第一关(MySql基础)

    url中#号无效,在url中使用%23代替#,或使用两个减号--代替注释,注意两个减号后常根一个加号+,被解析为空格,以注释掉后面的引号完成闭合 字符串中所有字符都可以使用16进制输入(需要加0x) ...

  5. 电路-第五版-邱关源-习题解答-第一章

    系列文章目录 电路-第五版-邱关源-习题解答-第一章 文章目录 系列文章目录 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 1-11 1-12 1-13 1-14 ...

  6. 最新cocos2d-x 3.0博客教学 小游戏[史上最坑爹的游戏] 002第一关:关闭卡死的电脑

    昨天做了主画面的选择,今天做第一关的关闭卡死的电脑,这个小游戏,这个游戏是很多的小游戏组合起来的,所以我们逐个击破,第一个游戏到底要如何做呢? 看看今天实现第一关的效果 这个第一个游戏不算太难 首先我 ...

  7. 第一关:干掉链表这个小喽啰

    第一关:干掉链表这个小喽啰 文章目录 第一关:干掉链表这个小喽啰 前备知识: 具体代码实现 单链表 循环链表 双向循环链表 相关习题: 前备知识: 链表作为线性数据结构的一种,提它之前必须得讲下:顺序 ...

  8. sqli-labs系列——第一关

    文章目录 判断注入类型 开始注入 判断注入类型 首先判断是什么类型的注入,这里是字符型的: 1' and '1'='1 //正常 1' and '1'='2 //错误 开始注入 末尾的注释符#被过滤, ...

  9. java小游戏超级玛丽:05.第一关的设计

    第一关效果图: 目录 判断是否为第一关 绘制第一关的场景 绘制地面(for循环) 绘制砖块 绘制水管 生成Obstatic列表的getter方法 绘制障碍物 判断是否为第一关 if(sort == 1 ...

最新文章

  1. 洗被套的时候洗衣机里面不要再放其他东西
  2. 输出 100 万字、维护 3 个GitHub 项目,技术大佬的 2019 太燃了……
  3. 蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码
  4. Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)
  5. oracle修改某表中的顺序,oracle 数据库 , 表中字段顺序修改
  6. 【算法分析与设计】寻找假币问题
  7. java基础IO流使用读取一个文件中的文字输出到控制台上
  8. iphone悬浮球怎么设置_OPPO手机怎么截屏?大部分的人只会两种,包括你吗?
  9. Python 数据科学手册 5.7 支持向量机
  10. 从考勤管理需求说起,聊聊场景的思维“工具”
  11. SuperSlidev2.1 轮播图片和无缝滚动
  12. Flutter布局锦囊---简单的应用栏
  13. latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解
  14. 自动驾驶的“天眼”!聊一聊高精地图领域中所有主流的制作方案
  15. 在线vim配色加term与gui统一颜色调整python脚本
  16. 【C语言】统计素数并求和
  17. 手机麦克风结构原理图_麦克风工作原理是什么
  18. 通过mac地址查找ip
  19. 一个简单帆软报表制作基础步骤
  20. [技巧]新版gitbook导出pdf电子书

热门文章

  1. 胡新宇.华为.过劳死 ---转贴---
  2. w ndows10怎么接收无线,教你win10台式电脑没有无线网卡怎么连wifi
  3. 禁止navigationController左滑手势
  4. Oracle VM VirtualBox退出全屏的方法
  5. 超硬核!史上最好的数据库总结
  6. U++ Slate基础小记
  7. 解决ios上传图片被旋转的问题
  8. 奇数魔方阵c语言程序设计,《C语言程序》课程设计报告书魔方阵程序设计
  9. 风储VSG-基于虚拟同步发电机的风储并网系统MATLAB仿真
  10. EasyVolley的使用