Wordpress 5.0.0Ô¶³Ì´úÂëÖ´Ðзì϶·ÖÎöÓ븴ÏÖ

°ä²¼¹¦·ò 2019-02-23
1¡¢·ì϶½éÉÜ

2ÔÂ19ÈÕ £¬RipsÔÚ²©¿ÍÉÏÅû¶ÁËÒ»¸ö¹ØÓÚWordpress 5.0.0Ô¶³Ì´úÂëÖ´Ðзì϶¡£¸Ã·ì϶ΪCVE-2019-8942ºÍ CVE-2019-8943×éºÏ·ì϶ £¬·ì϶´úÂëÔÚWordpressÖ÷ÌâÖÐÒÑ´æÔÚÁË6Äê¡£


£¨https://blog.ripstech.com/2019/wordpress-image-remote-code-execution/£©

·ì϶ÓÉÈý²¿ÃÅ×é³É£º


£¨Ö÷ÌâÎÊÌ⣩PostMetaÄܹ»±»¸²¸Ç¡£¹¥»÷ÕßÄܹ»½ÚÔìPOSTÖÐmeta_input×ֶεÄÖµ £¬´Ó¶ø×ÔÓɸü¸Äwp_postmeta±íÖеÄmeta_keyÓëmeta_valueµÄÖµ¡£


¸üи½¼þʱ £¬¹¥»÷Õß¿É×ÔÓÉÉèÖöÔÓ¦¸½¼þµÄ_wp_attached_fileµÄÖµ £¬²¢½áºÏ²Ã¼ôÖ°ÄÜʵÏÖĿ¼´©Ô½ £¬´Ó¶ø½«¶ñÒâͼƬ±£Áôµ½ËÁÒâĿ¼¡£


¸üÐÂÎÄÕÂʱ £¬¹¥»÷ÕßÄܹ»×ÔÓÉÉèÖÃÎÄÕµÄ_wp_page_templateµÄÖµ £¬²¢½áºÏÄ£°åÖ°ÄÜʵÏÖ±¾µØÎļþÔ̺¬ £¬´Ó¶ø×îÖÕÔì³É´úÂëÖ´ÐС£


2¡¢·ì϶·ÖÎö

2.1 Post Meta¸²¸Ç£¨Ö÷ÌâÎÊÌ⣩

µ±±à×ëÒ»¸öPOSTʱ»áŲÓÃedit_post²½Öè £¬wp-admin/includes/post.php:208


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


´Ëʱ»á½«$_POST¸³Öµ¸ø$post_data¡£¶øºó$post_dataµÄÖµÓֻᱻ´øÈëµ½wp_update_postº¯ÊýÖС£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¸ú×Ùwp_update_postº¯Êý £¬wp-includes/post.php:3969


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Ôڸú¯Êýĩβ £¬³ÇÊÐŲÓÃwp_insert_postº¯Êý £¬²¢½«$postarr´«Èëµ½¸Ãº¯ÊýÖÐ £¬wp_insert_postº¯ÊýÂÔ³¤ £¬Ôڸú¯ÊýÖÐÓÐÕâÑùÒ»¶Î´úÂë £¬wp-includes/post.php:3779 ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¶Ô$postarr['meta_input']×öÒ»¸ö±éÀú £¬²¢½«¼üÖµ¶¼´øÈëµ½update_post_metaº¯ÊýÖÐ £¬¸Ãº¯ÊýÄÚÈÝÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃÁËupdate_metadataº¯Êý £¬¶ÔÓ¦µÄ$meta_keyºÍ$meta_value¶¼Êǹ¥»÷Õ߿ɿصÄ¡£¸Ãº¯ÊýÖØÒªÖ°ÄܾÍÊÇwp_postmeta±í½øÐиüкͲåÈë¡£


wp_postmeta±í½á¹¹ÈçÏÂ:


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾

ͨ¹ý¸Ãº¯Êý £¬¹¥»÷ÕßÄܹ»×ÔÓÉÔö³¤ºÍÅú¸Ä¶ÔÓ¦post_idµÄmeta_keyºÍmeta_valueµÄÖµ¡£


2.2 Ŀ¼´©Ô½ÎÊÌâ

Ŀ¼´©Ô½ÎÊÌâÊÇÒÔPost Meta¸²¸ÇΪÆÌµæµÄ¡£ÔÚwp-admin/includes/ajax-actions.php:3520


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÔÚwp_ajax_crop_imageº¯ÊýÖÐ £¬µÚÒ»Ðоʹ«ÈëÁËÒ»¸ö$_POST['id']²ÎÊý¡£¶øºó»¹´«ÈëÁË$_POST['cropDetails']²ÎÊý¡£¶¼Êǹ¥»÷Õ߿ɿصÄ¡£²¢½«ÕâЩֵ´øÈëµ½ÁËwp_crop_imageº¯ÊýÖÐ £¬º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÔÚ28ÐÐ £¬»á½øÈë¸Ãif £¬´«ÈëµÄ$srcÊǹ¥»÷Õ߿ɿصÄ £¬´øÈëµ½get_attached_fileº¯ÊýÖÐ £¬º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃget_post_metaº¯Êý £¬½«wp_postmetaÄÚÍâ¶ÔÓ¦µÄpost_id×Ö¶Îmeta_keyֵΪ_wp_attached_fileµÄmeta_valueÖµ²éÎʳöÀ´²¢·µ»Ø¡£ÓÉÉÏÎÄ¿ÉÖª £¬¸ÃÖµÊǹ¥»÷ÕßÄܹ»×Ô¼º¸²¸ÇµÄ £¬ÊǿɿصÄ¡£


»Øµ½wp_crop_imageº¯Êý £¬·µ»ØºóµÄÖµ¸³Öµ¸ø$src_file²¢ÅжϸÃÎļþ´æÔÚÓë·ñ¡£Èô²»´æÔÚÔòŲÓÃ_load_image_edit_pathº¯Êý £¬¸ú×ٸú¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


½øÈëµÚ¶þ¸öif·ÖÖ§ÖÐ £¬Å²ÓÃwp_get_attachment_urlº¯Êý £¬²é¿´¸Ãº¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÈçÉÏͼ±ê×¢µÄËùʾ £¬×îºóÐγɵÄÊÇÒ»¸öurlÁ´½Ó¡£


ÈôÊÇ £¬¹¥»÷Õß½«meta_value¸ü¸ÄΪ2019/02/evil.jpg#/../../../../../theme-compat/evil.jpg¡£


×îºó £¬ÐγɵÄurl¾ÍÊÇÕâÑùhttp://localhost/wp-content/uploads/2019/02/evil.jpg#/../../../../../theme-compat/evil.jpg¡£


²¢½«Õâ¸öurl²ã²ã·µ»Øµ½wp_crop_imageº¯Êý £¬²¢´øÈëµ½ÁËwp_get_image_editorº¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¸ú×ٸú¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÆäÖÐÓÐÒ»²½Ï¸½ÚµÄ²Ù×÷ÊÇÔÚ_wp_image_editor_chooseÕâ¸öº¯ÊýÖÐ:


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


WordpressÌṩÁËÁ½ÖÖ·½Ê½À´´¦ÖÃͼƬ £¬ImagickÊÇÓÅÏȼ¶×î¸ßµÄ £¬GDÆä´Î¡£Õâ¸ö°¤´Î»áÓ°Ïì×îÖÕ»·¾³µÄÀûÓá£


¶øImagickºÍGD¶ÔͼƬҲÓÐ·ÖÆçµÄ´¦Öãº


Imagick²»»áÈ¥³ýµôͼƬÖеÄexif²¿ÃÅ £¬ËùÒÔÎÒÃÇÄܹ»½«´ýÖ´ÐÐpayload´úÂë²ÎÓëµ½exif²¿ÃÅ¡£


GD»áÈ¥³ýͼƬµÄexif²¿ÃÅ £¬²¢ÇÒÆäÖеÄphpcodeºÜÄÑ´æ»î¡£³ý·Çͨ¹ý¾«ÐÄ»ú¹ØÒ»ÕÅͼƬÄÜÁ¦¹»¡£


ÔÚÕâÀïÎÒÃÇÑ¡ÔñImagick¿â £¬Ñ¡ÔñºÃͼƬ´¦ÖÿâÖ®ºó¾Í·µ»Ø¸Ã¿â²¢Å²ÓÃload²½Öè¼ÓÔØurl£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÕâÀïÓÐÒ»¸ö¿Óµã £¬¾ÍÊÇImagick´¦ÖÃÀàµÄloadº¯ÊýÖÐŲÓõÄÊÇreadImageº¯Êý £¬µ«Ôڸ߰汾µÄImagickÉϸú¯Êý²»Ö§³ÖÔ¶³ÌͼƬÁ´½Ó £¬Òò¶øÎÒѡȡImagick-6.9.7À´¸´ÏÖ £¬»·¾³ÈçÏÂͼ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃÍêloadº¯Êýºó £¬¾ÍÊǶԻñÈ¡µ½µÄͼƬÄÚÈݽøÐвüô´¦Öà £¬¶øºó°ÑÐÂÌìÉúµÄͼƬ½øÐб£Áô £¬²é¿´±£ÁôÐÂÎļþµÄ²Ù×÷£¨Ôì³ÉĿ¼´©Ô½µÄÖյ㣩£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


$dst_fileÊDZ£ÁôµÄÎļþÃû £¬ÌìÉú¹æ¶¨ÈçÉÏͼ±ê×¢Ëùʾ¡£Òò¶øÌìÉú×îÖÕÎļþõ辶Ϊ£ºuploaddir/2019/02/cropped-evil.jpg#/../../../../../theme-compat/cropped-evil.jpg¡£


ÕâÀïÓÐÒ»¸ö°ÑÎȵã £¬¾ÍÊÇ»áÏÈŲÓÃwp_mkdir_pº¯ÊýÀ´´´½¨Ä¿Â¼ £¬¶øºóÔÙŲÓÃsaveº¯Êý±£ÁôÎļþ¡£


saveº¯ÊýÖ÷ÌâÈçÏÂͼ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾

ÕâÀïŲÓÃÁËmake_imageº¯Êý £¬º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÕâÀïÓÖÓÐÒ»¸ö¿Óµã £¬ÕâÀï»áÓÃcall_user_func_arrayº¯ÊýÀ´Å²ÓÃImagickµÄwriteImageº¯Êý £¬²¢½«$filename´«µÝ½øÈ¥ £¬ÖµÍ×ÌùÐĵÄÒ»µãÊǸú¯ÊýÔÚLinuxϲ»Ö§³Ö²»´æÔÚµÄÄ¿Â¼Ìø×ª¡£


µ«ÊÇΪÁ˴ﵽĿ¼´©Ô½µÄÖ÷ÕÅ £¬ÎÒÃÇÕâÀï´«ÈëµÄ$filename¾ÍÊÇuploaddir/2019/02/cropped-evil.jpg#/../../../../../theme-compat/cropped-evil.jpg ¡£


ÓÉÓÚcropped-evil.jpg#ÊǸö²»´æÔÚµÄĿ¼ £¬Òò¶ø¸Ãº¯Êý»áŲÓÃʧ°ÜÅ׳öÃýÎóÖÕÖ¹Á÷³Ì £¬ÌìȻҲÎÞ·¨Å²ÓÃfopenºÍfwrite½øÐÐдÎļþµÄ²Ù×÷¡£


½èÖúÂÅ´ÎÉÏ´«²Ã¼ô¾ÍÄܹ»ÈƹýÕâ¸ö¿Óµã £¬µ«ÊÇÌìÉúµÄÐÂͼƬÓÖÓÐʲôÓÃÄØ£¿


2.3 ±¾µØÎļþÔ̺¬

ÔÚwp-includes/template-loader.php:55


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÕâÀïŲÓÃÁËget_single_templateº¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


µÚÒ»ÐлñȡҪÇóµÄ¶ÔÏó¡£µ±ÎÒÃÇͨ¹ý·ÓÉä¯ÀÀÎÄÕÂʹØâÀï»á·µ»ØWP_Post¶ÔÏó £¬ÆäÖÐÔ̺¬ÎÄÕµÄһЩÊôÐÔ¡£
¶øºó½«¸Ã¶ÔÏó´øÈëµ½ÁËget_page_template_slugº¯ÊýÖÐ £¬º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ƾ¾Ýpost_id´Ówp_postmeta±íÖÐÈ¡³ömeta_key×Ö¶ÎֵΪ_wp_page_templateµÄmeta_valueµÄÖµ²¢·µ»Ø¡£


´ÓÖ÷ÌâÎÊÌâ¿ÉÖª £¬ÕâÀï·µ»ØµÄmeta_valueµÄֵͬÑùÊÇÄܹ»±»¹¥»÷Õß×ÔÓɸ²¸ÇµÄ £¬Òò¶ø¸ÃÖµÊǹ¥»÷Õ߿ɿصÄ¡£


¶øºó½«¸ÃÖµÔö³¤µ½$templatesÊý×éÖв¢´«µÝ¸øget_query_templateº¯Êý¡£º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃlocate_templateº¯Êý £¬º¯ÊýÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÕâÀï×öõè¾¶µÄÆ´½ÓºÍÅжÏ¡£$template_nameÊǿɿصÄ £¬Òò¶ø½áºÏÉÏÎĵÄĿ¼´©Ô½ £¬½«ÐÂÌìÉúµÄͼƬ·Åµ½theme-compatĿ¼Ï¼´¿É¡£


¶øºó·µ»Ø¸Ãõè¾¶ £¬»Øµ½×îÆðÍ·µÄ´¦Ëù£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃinclude½«Í¼Æ¬Ô̺¬ £¬Ö´ÐдúÂë¡£

3¡¢·ì϶¸´ÏÖ

ÕâÀï £¬ÎÒÃÇѡȡmac os+php7.1+wordpress4.9.8+imagick6.9.7½øÐи´ÏÖ¡£


Ê×ÏÈ £¬¹¥»÷Õß±ØÒªµÇ¼һ¸öAuthorȨÏÞµÄÕË»§¡£µÇ¼ºóÔö³¤Ò»¸öÃûΪcreatedir.jpgµÄͼƬ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¶øºó¸üиÃͼƬÐÅÏ¢£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


²¢Ê¹ÓÃburp×¥°ü £¬¸ü¸ÄÈçͼËùʾ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¶øºóÆðÍ·²Ã¼ôͼƬ £¬µã»÷edit Image²¢×¥°üµÃµ½nonce²¢»ú¹Ø±¨ÎÄ¡£

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


³ÖÐøÉÏ´«²¢²Ã¼ôÒ»ÕÅÃûΪfinally.jpgµÄͼƬ £¬³É¹¦´´½¨Îļþ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¶øºóÐÂÔö³¤Ò»ÆªÎÄÕ £¬ÔÚupdateʱ³ÖÐø×¥°ü¸ü¸ÄÈçÏÂͼËùʾ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


½áÊøºó¡£²é¿´¸ÃÎÄÕ £¬³É¹¦´¥·¢phpinfo!

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾

4¡¢²¹¶¡·ÖÎö

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾

Ôö³¤ÁË_wp_get_allowed_postdata²½Öè £¬½«meta_input×ֶδÓPOST±¨ÎÄÖÐÈ¥µôÁË¡£