sql注入中遇到的入门函数介绍

本文深入讲解SQL注入技术,包括常用数据库函数如version(), database(), user()等的使用,以及concat(), concat_ws(), group_concat()函数的功能与应用。此外,还详细解析了floor报错注入、updatexml报错注入的原理,以及rand(), floor(), length(), substr(), ascii()等函数在SQL注入攻击中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于之前的博客应付差事,在此做出深刻检讨并进行一些函数说明上的补充(重新做人就在今天-.-)

首先这里先普及三个基本的函数

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

database()  返回当前连接的数据库名

user()  返回当前连接的用户(是当前的用户不是当前的数据表)

@@datadir 读取数据库路径

@@basedir MYSQL获取安装路径

然后下面说一些数据库中的表

在这之前先说一下  information_schema   这是系统数据库,记录了当前数据库所有的库,表,用户,权限等信息

schemata 表:记录了数据库所有的库名,编码路径等;

tables表:记录了所有的表名,和表的基本信息等;

columns表:记录的所有的字段名(列名),和列的基本信息等;

若需详细了解请看:http://wenku.baidu.com/link?url=bIA38Slp-g2Bob4VDuTSVY8e04Beqq9Xac4I90UMC9ziQuzxiukpEh5abPK-woB9tuQ4DuY_KhKW-eTHH6ACSiMJmRhctiHvijOEFmENBbS

接下来再讲三个函数:

concat(str1,str2,...)  连接两个或多个数组

例如:concat('Hop','scot','ch') 将会返回Hopscotch

注:若 concat() 中有一个参数为null,则结果会返回null

concat_ws(str1,str2,str3,...)  在我的理解来看是上面 concat() 函数的升级版,它的作用是用str1将str2和str3等数组连接起来

例如:concat(‘_’,'Hop','scot','ch') 将会返回Hop_scot_ch

注:若 concat_ws() 中分隔符为null,则结果会返回null。并且函数会忽略任何分隔符后的null值

例如 concat_ws(null,'Hop','scot','ch') 将会返回null

        concat_ws('_','Hop','scot',null,'ch') 将会返回Hop_scot_ch

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

默认用逗号分隔,这里不给出例子了

若需详细了解请看:https://www.cnblogs.com/yingmo/p/6148360.html

下面简单说两个个查询语句:

order by   本人的理解就是按字段进行排序,后面用于指定排序的依据可以是字段名也可以是字段别名

group by 按一定的依据进行分组,一般与上面的聚合函数一起使用

接着说一下floor报错注入

在此之前还要普及几个函数    

rand() 随机数函数,返回一个0~1之间的随机值

rand(x): 每个x对应一个固定的值,但是如果连续执行多次值会变化,不过也是可预测的

floor(x) 取整函数,返回不大于x的整数

接着给一个payload进行理解

http://localhost/sqli-labs/Less-5/?id=1%27%20union%20select%20count(*),1,%20concat((select%20database()),%20floor(rand(0)*2))%20as%20a%20from%20information_schema.tables%20group%20by%20a%20--%20#

这里出现了 floor(rand(0)*2) ,结合上面对这些函数的介绍,这个整体随机返回0或1,并且有规律可循(011011...)

数据库会先建立一张虚表,floor(rand(0)*2)第一次计算,返回0,在虚表中未找到等于0的数据,插入,插入过程中进行第二次计算,返回1,将数据1插入虚表,然后floor(rand(0)*2)进行第三次计算,结果为1,由于表中已有等于1的数据,所以只对数据个数加1,接着进行第四次floor(rand(0)*2)的计算,返回0,表中没有为0的数据,进行插入,插入过程中会进行第五次floor(rand(0)*2)的运算,返回1,将1插入数据表--------这时就出现问题了,之前已经插入了值为1的数据,这里又插入了一次,就会出现主键沉余的错误,这便是floor报错注入的原理了

接着继续介绍函数:

length(str)  返回str的长度;

例如 length(Hopscotch)  返回9

substr(str,num1,num2)  从num1位置开始截取str,截取num2个字符;

例如substr(++Hopscotch,3,9)  返回Hopscotch

mid(str,num1,num2)与substr(str,num1,num2)用法一样;

ascii(str)  返回第一个字符的ascii值;

例如:ascii('Hopscotch')  返回72

ord(str)与ascii(str)用法相同;

然后介绍一个语句

if(a,b,c)  当a为真时,返回b,当a为假时,返回c;

例如:if(1>2,'ture','flase')  返回flase

sleep(x)  将进程挂起x秒时间,也就是x秒之后再运行;

下面说一下updatexml报错注入原理

先来了解一下  updatexml()  函数的作用

updatexml(XML_document, XPath_string, new_value)

第一个参数  XML_document:string格式,为XML文档对象的名称;

第二个参数  XPath_string:Xpath格式的字符串,为XML文档对象的路径;

第三个参数  new_value:string格式,为更新的语句;

这里给出一个payload:select username from security.user where id=1 and (updatexml(‘anything’,’/xx/xx’,’anything’))

通过分析,这里面updatexml函数第二个参数的格式为一个普通的string格式,不满足要求,必然报错;

extractvalue报错注入也是相同的原理,这里就不多做说明了;

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值