PROBLEM 1-隐式类型转化
在有一次尝试第一关时,输入了如下payload:
http://127.0.0.1/sqli-labs/Less-1/?id=1" and1=2--+
当时并不细心,犯了个很傻逼的错误:发现页面可以正常显示后,认为是单双引号的闭合问题。。。
后来折腾了下,发现 1“ and 1=2--
是被单引号引起来的,由于sql中隐式转化的问题,上述字符串与'1'是等同的。
下面是对隐式转化的详细了解:
- 两个参数至少有一个是
NULL
时,比较的结果也是NULL
,例外是使用<=>
对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换- 两个参数都是字符串,会按照字符串来比较不做类型
- 转换两个参数都是整数,按照整数来比较
- 不做类型转换十六进制的值和非数字做比较时,会被当做
二进制串
- 有一个参数是
TIMESTAMP
或DATETIME
,并且另外一个参数是常量,常量会被转换为timestamp
有一个参数是decimal
类型,如果另外一个参数是decimal
或者整数,会将整数转换为decimal
后进行比较,如果另外一个参数是浮点数,则会把decimal
转换为浮点数进行比较- 所有其他情况下,两个参数都会被转换为浮点数再进行比较
关于字符串转数字:
'a'=0; //true
'32a4b5'=32; //true
也就是说,当把字符串转化为数字时,是从字符串左边开始,将第一个有效数字(连续的多位数字)作为其值,而当字符串第一位即为非数字,则其值为0