在wooyun上看到了有人把biweb的shell拿到了: WooYun: BIWEB门户版Getwebshell漏洞 ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。
BiWEB在全局过滤时in_array()使用不当,造成全局过滤可以绕过。
先来看看BiWEB是怎么处理防注入的。首先BiWEB对用户输入进行了全局过滤,过滤的方法在/config/filtrate.inc.php中
然后我们去看看filtrateData(),在/web_common5.8/check.class.php中
可以看到,filtrateData()中有这么一句:if(in_array($key,$arrHtml)) $ParamValue[$key] = trim($value),其中$arrHtml为$arrGPdoDB['htmlspecialchars'] = array('intro','summary','tag'),也就是说当$key是'intro','summary','tag'中的之一时,就不进行htmlspecialchars编码,也就可以绕过全局过滤了。问题在这里,如果$key等于0时,in_array($key,$arrHtml)将返回ture,也就不进行编码!
通过POST提交一个数组,而数组的key是0,1,2...,如通过POST提交一个名为test的数组,test[]=injection_code&test[]=2,这样就可以利用上面代码中in_array()使用不当造成的注入了。
BiWEB这种漏洞有不少,这里列几个出来
这里以/job/adminu/index.php为例进行证明
当$_GET['action']为'moveup'时,则执行这条语句$objWebInit->doInfoAction($_GET['action'],$_POST['select']),我们再去看看doInfoAction(), 在/web_common5.8/php_common.php中
再去看看相同文件中的moveupInfo
可以看到传入的值直接作为id带入了SQL语句,造成了注入。(这里只是拿这个例子来说明in_array()使用不当可以引入单引号,当然这个注入点可以直接用数字型的注入方法注入,可不使用单引号)
单引号这样引入
成功注入,Payload如下
注入成功,管理员的用户名和密码