题目描述:
小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。
- 先打开场景,果然是php代码审计题目
- 我们可以简单阅读一下这段代码,大概就是通过get方式传入a和b参数的值,然后判断a的值和0是否相等,b的值不能是纯数字或者数字型字符串,而且要大于1234
- 先解决a,
- a和0数字0进行松散比较必须相等,所以a的值为数字0是可以的,其次由于参数a是get方式传进去的值,所以默认是字符串类型,那么在松散比较下,a的值为字符串0和数字0也是true
- 其次字符串0和false比较是否相等
- tips:这里需要知道php在进行比较时,有两种比较方式,当采用双等号(
==
)比较时会进行松散比较,只比较两者的值,而不比较两者类型,
- 比如,当一个字符串和数字比较时,会先将字符串转换为数字,再比较,'1'==1
,这两个是相等的,
- 但是如果不是数字型字符串,而是'a'
,非数字字符串和数字类型比较,php会直接返回0,这就导致'a'==0
是成立的。
- 其次,非空字符串都能通过if条件判断,还有一点就是,如果是这样的字符串123abc
,最终会转化为数字123
- 转化机制是,php在松散比较下,字符串转换为数字规则是,遇到非数值就停止转换,就是123abc
,只会转换到a前面,因为a是非数值,所以就只转换到这里,后续不再转换,如果是abc123
,那就直接返回0,因为开头a是非数值
- tips:这里需要知道php在进行比较时,有两种比较方式,当采用双等号(
- 其次是b的值,b的值也是用弱类型比较,b的值不能是数字类型或纯数字字符串,我们可以想到用
'abcow'
,任意都是,然后要大于数字1234,如果是abc
和数字1234比较,php会将'abc'
返回0。但这里也用了双等号,松散比较,所以我们可以构造'9999abc'
,这样,既不是纯数字字符串,在php松散比较下,又大于1234
6. 这里构造payload?a=任意字母&b=大于1234的数字和任意字母
,例如?a=xxx&b=66666xx
,成功获得flag,本题结束