问题出在plus/weixin.php
其中$lat和$lng是从$data变量获取的。然后$data变量又是从
文件中引进的。那这个文件怎么生成的呢。在receiveEvent函数中生成的。
这边没有过滤,就直接把数据写入到文件中。$object参数是从responseMsg函数中带入
可以看到$postObj直接获取post的数据没有过滤带到了receiveEvent中,然后receiveEvent函数把用户提交的post数据写入到文件中,然后clickNearbyJobs函数读取文件中的数据带入到数据库查询,最后造成注入。
用户分两次提交数据,第一次先构造好数据把payload写入到文件中
其中FromUserName要是注册用户,并且要和第二次提交的FromUserName一样
这边有个验证Signature的步骤,不正确,会导致程序退出。
跟进checkSignature函数
这边变量都是可控的,就可以自己随便生成正确的一个就好。其中$token是不可控,但是默认为空。我以$timestamp=a生成代码如下$nonce=b生成代码如下
然后提交地址
提交上面的xml的post数据就能成功提交
第二次提交的数据是为了能让程序读取上面生成的文件数据带入到数据库执行,这边
有检查微信公众号开了没,默认是没开,不过无所谓,因为该函数最后返回了,并没有没有开微信号就让程序退出,所以对下面程序的执行没有影响,可以忽略不计。
第二次数据提交地址依然是
提交post数据
这边要绑定个人帐号
但是只要在这个地址http://localhost/74cms_v3.7_20160329/m/binding.php,填上正确的注册用户密码即可
这边绑定并不需要管理员权限等,但是你要绑定的用户要和你上面要提交的FromUserName的用户一致
然后讲讲payload的构造,由于74cms查询的时候也会有过滤,过滤函数如下
过滤了注释符,还有sleep盲注使用的一些函数。由于变量是在中间,不是在结尾,不能有注释符,有没有回显,参考了 http://**.**.**.**/bugs/wooyun-2010-0150114 绕过waf,构造的payload如下
如果IF(ord(mid(user(),1,1)) = 114,1,1E308*2)条件正确,就会进入到这边
这边查询是错误的,列会不匹配,但是没事,报错结果是不一样的,这边报错是
如果IF(ord(mid(user(),1,1)) = 114,1,1E308*2)条件错误,1E308*2超出范围,直接报错了,不会进入到下面执行了,这边的报错信息是
那我们就可以直接根据报错信息的不同获取数据了