Nov 21

PhpWind论坛刷分漏洞 不指定

hitsword , 12:59 , 默认分类 , 评论(0) , 引用(0) , 阅读(6048) , Via 本站原创 | |
      这个 Bug 的历史相当古老,从 PW 4.3.2 开始就存在。 我在不少的论坛测试过。都很成功的刷到分。

  官方对 Bug 的描述:MySQL 在自动转换整型数据时存在溢出,导致会员可以提交恶意数据进行刷积分。

  听他的口气好像完全是 MySQL 的错似的。事实上这应该归咎于 PW 程序员没有充分理解 is_numeric 函数的特性。is_numeric 函数不仅支持十进制数字,也支持如十六进制等其他进制的数字。以下输入都能轻松地通过 is_numeric() 的检查:

  100 (整数)
  100.1 (小数)
  +0123.45e6 (科学计数法)
  0xff33669f (十六进制)

  显然这里应当只允许用户输入整数,但是 PW 却在银行插件的多处地方使用了与下面类似的代码:

  InitGP(array('savemoney','btype'));
  if (!is_numeric($savemoney) || $savemoney <= 0) {
    Showmsg('bk_save_fillin_error');
   }

  InitGP 允许用户输入任何类型的数据,然后只判断了数据是否为数字以及是否大于零。当我们输入一个带有很多个 0 的小数,并且这个数小于我们的资产数的时候,就可以通过程序的逻辑检查而交给 MySQL 执行。MySQL 执行的时候数据转换产生了溢出。

  我测试的时候存入 1 个积分,然后取出 1.000000000000  …… (超过一万个 0)……00000 个积分。此时我身上的积分数变成了 2147483916 (这是字段所能显示的最大值)。大家可以写一个文本文档。复制粘贴使用。

作者:hitsword@HITSword's Blog
地址:http://www.hitsword.org/PhpWindsf/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!

Tags: , , , , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]