Nov
21
这个 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 (这是字段所能显示的最大值)。大家可以写一个文本文档。复制粘贴使用。=>
官方对 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/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
从JBLOG到WP。再到
BLOG等用户福音 - 


