前言:朋友在做授权项目的时候,遇到一个sql server数据库的注入点,没办法解决,让我帮忙看看,因为是授权项目,所以就可以帮助测试下。
内容如下:
单引号,很明显的错误,因为是时间格式:2020-6-2,所以这里肯定是字符型的。
接着测试:‘--
还是语法错误,那么可能因为有括号的原因,接着测试:‘)--
这里出现了关键性的第一个错误:‘CAST‘ 附近有语法错误,需要 ‘AS‘。
百度该错误,找到一篇文章:
http://cn.voidcc.com/question/p-rwhjaknf-bnr.html
看到了这样一段模板代码,类比一下,差不多我们的注入点就在这里。
接着测试:‘+AS+DATETIME)--
然后出)附近有错误,以为有多个括号,所以测试:‘+AS+DATETIME))--,还是一样的错误。
在这里卡了会儿,因为不知道到底是我们思路就错了,还是那个小地方错了,摸着石头过河莫办法。
后面只有继续fuzz了,先猜测是 -- 注释符没用(被过滤等),然后我们就只有手动闭合后面的语句了。
测试:‘+AS+DATETIME)AND+CAST(CONVERT(NVARCHAR,CAST(getdate()+AS+DATE))+%2b+‘
经过多次测试发现是AND那个位置出了问题,在百度找了相关错误,这篇文章说的很好:https://blog.csdn.net/huyuyang6688/article/details/38322005
意思也就是说:如果 AND 后面接的一个布尔值类型,中间不能有空格,因为CAST( 函数返回的结果是布尔值,成功或失败。
但是ANDCAST( 这样,去掉中间的空格,语法都错误了。所以只有:AND 1=CASE( 这样就好了。
不明白为啥会出这个错误,当把这个时间改成和上面一样的:‘2020-6-2 这种格式后,会爆另外一个错误:
因为提示了超出范围,所以我直接改成了:‘0 然后就成功了。这里发现直接为空也可以,就是+%2b+‘ 就完事了,如上面几张图。
最后爆@@version的语句:
多熟悉几个sql模板语句,在注入的时候,猜测sql语句还是大有帮助的。