关于convert()的一点小用法-sql报错注入

xuetu   ·   发表于 2021-07-29 10:53:18   ·   闲聊灌水区

1、简介
这几天在翻乌云漏洞库的时候意外看到这样一个sql注入,通过convert()转换类型的函数将用户名密码暴露出来,这种用法我还是头一次看到,所以自己在mysql、sqlserver两个主流数据库中做了下试验,尝试一下这个函数的适用范围,同时尝试一下oracle中转化数据类型的函数是否也有相同的效果,这里也将试验结果发到论坛供大家参考,如果早知道这种用法的大佬也勿喷勿喷(つд⊂)
https://www.madebug.net/static/bugs/wooyun-2016-0223093.html
上面是乌云漏洞库的地址,其实单看这个漏洞,这个函数的使用范围还是比较窄的,毕竟需要目标系统直接将数据库报错暴露出来,一般系统应该都会对返回信息做一个掩盖的,但是多知道点总是好的。想想这好像也是一种报错注入。
啊,本来想把试验过程也写出来的,想想好麻烦,直接写结果了,图多,直接看最后总结可以
2、SQL Server

如图sql server数据库,新建一个表,id和username均为varchar类型,

之后去创建语句查询

可以看到我们的id和username都在报错中被暴露了出来
但是如果我们将其中一个改为int类型,


那么,当varchar值在前面的才会被报错出来(这里有个中间连接符的问题)
3、Mysql

同样建表,id int,username varchar,

可以看到,mysql中将字符型转化成了0,所以convert在MySQL中不适用

当然,cast也不行
4、oracle

如上图还是新建一个表,两个varchar值,

可以看到,当varchar中内容为非数值型字符串时会报错,但并不会暴露表中信息
5、总结
这种方式基本只适用于sqlserver数据库,当updatexml被禁用的时候不妨试一试
select convert(int,name) from sysobjects
另外关于以上有说中间连接符的问题,当以非数值型字符连接时,如果前面的字段为int,那么就可以将后面的varchar暴露出来,但这里后面的varchar还要是非数值型的字符串,所以这样情况太多,还不如直接以某个非数值字符进行连接,换一下字段的顺序就可以

打赏我,让我更有动力~

1 条回复   |  直到 2021-7-29 | 1100 次浏览

xuetu
发表于 2021-7-29

SQL server: sql server 2014
Mysql:5.7.31
oracle:12C

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.