protected/controllers/payment.php,36行
首先定位到82行
看到$total_fee没有单引号觉着有戏,往上跟
$total_fee = Req::post('total_fee');
直接post过来的也没有做任何处理,继续往下走
56行:
$return['total_fee']也就是post来的,但是这里判断是否小于0,所以无法直接传负数的方式加钱了,但是注意到这里floatval操作,如果我们传入52+10000呢,floatval取到的是52,这样可以绕过这个判断了,继续往下看
73行:
想要进入最开始那个update操作,需要满足一个条件:sign==mysign,上面一大堆的代码,其实主要关键是在$paymentInfo['partner_key'],这个参数是在数据库中存在,开始觉得希望不大了,因为一般这样的东西都不是固定的,抱着试一试的心理,在不同机器上安装tinyshop,发现partner_key居然一样,也就是
这样下来只要我们还原mysign,并将他的值替换到sign中,我们就可以给自己加钱了,当然也可以注入,但是太麻烦了,每买一次商品,order_no都不一样,用来注入太麻烦。
同时要注意这里78行:
由于是字符串比较所以想让payload通过这里,需要你的余额与payload之前比较是通过的:
比如下面测试的时候,我的余额是630,payload=52.00+100,这样两个字符串按位比较就可以通过了。
1.首先买一件商品到付款页面
2.截包获取的order_no放到写好的exp里面还原出对应的mysign并替换到sign
比如这里的order_no=20140904163119891372
还原算法:
total_fee 设置成你想要加的钱 比如total_fee=52.00+100
结果: