CmsEasy最新版5.5_UTF-8_20140802,前面被雨神饶了三次
http://**.**.**.**/bugs/wooyun-2014-053198
http://**.**.**.**/bugs/wooyun-2014-053737
http://**.**.**.**/bugs/wooyun-2014-054220
最新的里面也修复了,但是修复不完整,这是第四次补丁了
继续绕过,进行SQL注入
来看看文件:archive_act.php
这里调用了$status = $payobj->respond();
进入respond函数看看:
文件alipay.php:
这里直接带入$_POST的内容
过滤了=,<,>,'这些
然后当trade_status=WAIT_SELLER_SEND_GOODS时,进入了pay::changeorders($order_sn,$_GET);
继续跟进看看changeorders函数:
这里$where['id']=$id=$order_sn=str_replace($_GET['subject'],'',$_GET['out_trade_no']);
最后进入了rec_update($where,$id)
进入sql_update($tbname,$row,$where)
$where及我们可控的,传入的参数
但是到最后进入SQL时,只在condition函数中处理了,前面一直没处理
到condition这里时,都是存在问题的,只要condition里面通用没有处理,或者处理不完整时,就可以导致注入了,我们来看看$this->condition($where);。
从上面可以看到
当我们输入的内容为数字型时,就加上单引号,这里前面过滤了单引号,当数字型时无法利用
当我么的内容恒等于true是,返回true
当不是上述情况时,如内容为字符型,则进行过滤:
preg_match('/(if|select|ascii|from|sleep)/i', $condition)
通过上面的几次过滤,有特殊符号过滤,有关键字过滤
这里连if,ascii都过滤了,貌似是没办法了,其实不然,继续搞起!!!
我们先随便输入一个数字型字符串试试:
这里加单引号保护了,因前面过滤单引号,所以没办法利用了
再来输入一个字符串看看:
看到了,这里没有加单引号,有希望!
但是上面过滤了很多关键的东西,但是我们都可以绕过!
过滤了=号,我们用-号,或者用like
过滤了if,我们用case 1 when 2 then 3 else 4 end
过了assic,我们用hex
过了了substr,我们用mid
过滤了sleep,我们用benchmark
这些东西足够我们使用了
这里使用两种方法:
第一种方法,使用hex和-号:
这里会延迟3秒,将benchmark修改为:benchmark(20000000,md5(1)),会延迟6秒
第二种方法,使用like搞定
或者
都会延迟6秒返回
这样就达到盲注的目的了,over!