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ÊÇÉú´æµÄÎļþÃû£¬Éú³É¹æÔòÈçÉÏͼ±ê×¢Ëùʾ ¡£Òò½ñÉú³É×îÖÕÎļþ·¾¶Îª£º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±¨ÎÄÖÐÈ¥µôÁË ¡£