SQL注入-关于注入点闭合的问题(数据库是MySQL)

当前正在学习渗透方面的知识,记录一下学习上面的体会。

关于怎么构造输入来让符号闭合其实一直都没怎么搞懂,也就导致了给我一个URL从一开始就不知道怎么做了,缺乏一个解题的思路。在网上也查了很多怎么找注入点的方法,基本上就告诉你一个一个的去试各种符号,从出错的信息中找,但我觉得要想有一个清楚的概念必须从根源出发。于是我在想,构造输入不就是把我写的东西写入进SQL语句中让后台数据库执行的嘛,那么我直接打开数据库从命令行来实验一下我所写的SQL,看一下结果不就行了?所以说有了下面的思考:

一般注入点闭合无非是 ' , " , ') , ")等各种组合(逗号是分隔符),那来看一下如果是‘ ’这种情况该怎么办了?

从前台输入id,id的值传递给后台的sql语句,该id用' '包裹起来。接下来就从数据库中来执行一下这条语句:

假定我输入的id=1,结果如上。现在要使其闭合,假如我输入1" :

依旧找出了id=1的数据(说明页面没有变化),说明输入的1"和1是等价的,也就是说"没有起到闭合的作用。同理不论在1后面输入什么字符(输入数字不行,因为输入数字不就是和1构成数字了嘛),结果和输入1的结果是等价的。接下来看一种"复杂"情况:

从上图看出这一长串的字符都没有起到闭合作用。而当输入' 的时候再来看一下:

SQL语句并没有执行成功,导致页面显示错误,这也就显示了为什么输入' 就能使其闭合。本来到此为止了,但我在想为什么输入那么一长串字符都没有起作用,而输入一个' 就可以了?

这其实和类型转换相关,假如我们输入的数据是1,经过' ' 包装后变成了一个字符串1,而id='1' 的左边是数字类型就会把字符串转为数字类型的数据来进行比较,而对于其转换规则要用到cast()函数,参考https://www.cnblogs.com/-lpf/p/5863892.html

从上面就可以看出转换的规则:从字符串最左边开始,如果第一个不是数字那么结果就是0,如果第一个是数字那么就继续往右边遍历直到遇到不是数字为止。也就是说我们上面输入的很长一段的字符全都被干掉了就只剩下了1存在,所以SQL执行的结果是一样的。

以上是我的理解,欢迎大家来交流!

发布了10 篇原创文章 · 获赞 5 · 访问量 3034

猜你喜欢

转载自blog.csdn.net/qq_36896220/article/details/94129125
今日推荐