PHPæµ ======================================== 简介 ---------------------------------------- æµï¼ˆStreams)的概念是在php 4.3引入的,是对æµå¼æ•°æ®çš„æŠ½è±¡ï¼Œç”¨äºŽç»Ÿä¸€æ•°æ®æ“作,比如文件数æ®ã€ç½‘络数æ®ã€åŽ‹ç¼©æ•°æ®ç‰ã€‚ æµå¯ä»¥é€šè¿‡fileã€openã€fwriteã€fcloseã€file_get_contents〠file_put_contentsç‰å‡½æ•°æ“作。 å°è£…åè®® ---------------------------------------- PHP 带有很多内置 URL é£Žæ ¼çš„å°è£…å议,å¯ç”¨äºŽç±»ä¼¼ fopen()〠copy()〠file_exists() å’Œ filesize() 的文件系统函数。支æŒçš„åè®®å¯ç”¨ ``stream_get_wrappers()`` 查看。 - ``file://`` 访问本地文件系统 - ``http://`` 访问 HTTP(s) ç½‘å€ - ``ftp://`` 访问 FTP(s) URLs - ``php://`` 访问å„个输入/输出æµï¼ˆI/O streams) - ``zlib://`` åŽ‹ç¼©æµ - ``data://`` æ•°æ®ï¼ˆRFC 2397) - ``glob://`` 查找匹é…çš„æ–‡ä»¶è·¯å¾„æ¨¡å¼ - ``phar://`` PHP å½’æ¡£ - ``ssh2://`` Secure Shell 2 - ``rar://`` RAR - ``ogg://`` éŸ³é¢‘æµ - ``expect://`` 处ç†äº¤äº’å¼çš„æµ PHPæ”¯æŒæµ ---------------------------------------- PHP æä¾›äº†ä¸€äº›è¾“å…¥/输出(IO)æµï¼Œå…许访问 PHP 的输入输出æµã€æ ‡å‡†è¾“入输出和错误æè¿°ç¬¦ï¼Œå†…å˜ä¸ã€ç£ç›˜å¤‡ä»½çš„临时文件æµä»¥åŠå¯ä»¥æ“作其他读å–写入文件资æºçš„过滤器。 éœ€è¦æ³¨æ„的是,æµä¸å— ``allow_url_fopen`` é™åˆ¶ï¼Œä½†æ˜¯ ``php://input``〠``php://stdin``〠``php://memory`` å’Œ ``php://temp`` å—é™äºŽ ``allow_url_include`` 。 è¾“å…¥è¾“å‡ºæµ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``php://stdin`` 〠``php://stdout`` å’Œ ``php://stderr`` å…许直接访问 PHP 进程相应的输入或者输出æµã€‚æ•°æ®æµå¼•用了å¤åˆ¶çš„æ–‡ä»¶æè¿°ç¬¦ï¼Œæ‰€ä»¥å¦‚果在打开 ``php://stdin`` 并在之åŽå…³äº†å®ƒï¼Œä»…是关é—了å¤åˆ¶å“,真æ£è¢«å¼•用的 STDIN å¹¶ä¸å—å½±å“。 å…¶ä¸ ``php://stdin`` 是åªè¯»çš„, ``php://stdout`` å’Œ ``php://stderr`` 是åªå†™çš„。 fd ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ php://fd å…许直接访问指定的文件æè¿°ç¬¦ã€‚例如 ``php://fd/3`` 引用了文件æè¿°ç¬¦ 3。 memory与temp ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``php://memory`` å’Œ ``php://temp`` æ˜¯ä¸€ä¸ªç±»ä¼¼æ–‡ä»¶åŒ…è£…å™¨çš„æ•°æ®æµï¼Œå…许读写临时数æ®ã€‚两者的唯一区别是 ``php://memory`` 总是把数æ®å‚¨å˜åœ¨å†…å˜ä¸ï¼Œè€Œ ``php://temp`` 会在内å˜é‡è¾¾åˆ°é¢„定义的é™åˆ¶åŽï¼ˆé»˜è®¤æ˜¯ 2MB)å˜å…¥ä¸´æ—¶æ–‡ä»¶ä¸ã€‚临时文件ä½ç½®çš„决定和 ``sys_get_temp_dir()`` 的方å¼ä¸€è‡´ã€‚ ``php://temp`` 的内å˜é™åˆ¶å¯é€šè¿‡æ·»åŠ ``/maxmemory:NN`` æ¥æŽ§åˆ¶ï¼ŒNN 是以å—节为å•ä½ã€ä¿ç•™åœ¨å†…å˜çš„æœ€å¤§æ•°æ®é‡ï¼Œè¶…过则使用临时文件。 input ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``php://input`` 是个å¯ä»¥è®¿é—®è¯·æ±‚的原始数æ®çš„åªè¯»æµã€‚ POST 请求的情况下,最好使用 ``php://input`` æ¥ä»£æ›¿ ``$HTTP_RAW_POST_DATA``ï¼Œå› ä¸ºå®ƒä¸ä¾èµ–于特定的 php.ini æŒ‡ä»¤ã€‚è€Œä¸”ï¼Œè¿™æ ·çš„æƒ…å†µä¸‹ ``$HTTP_RAW_POST_DATA`` 默认没有填充,比激活 ``always_populate_raw_post_data`` æ½œåœ¨éœ€è¦æ›´å°‘的内å˜ã€‚ ``enctype="multipart/form-data"`` 的时候 ``php://input`` æ˜¯æ— æ•ˆçš„ã€‚ filter ---------------------------------------- ``php://filter`` 是一ç§å…ƒå°è£…å™¨ï¼Œè®¾è®¡ç”¨äºŽæ•°æ®æµæ‰“开时的ç›é€‰è¿‡æ»¤åº”用。PHP默认æä¾›äº†ä¸€äº›æµè¿‡æ»¤å™¨ï¼Œé™¤æ¤ä¹‹å¤–,还å¯ä»¥ä½¿ç”¨å„ç§è‡ªå®šä¹‰è¿‡æ»¤å™¨ã€‚ filter有resource, read, writeä¸‰ä¸ªå‚æ•°ï¼Œresource傿•°æ˜¯å¿…é¡»çš„ã€‚å®ƒæŒ‡å®šäº†ä½ è¦ç›é€‰è¿‡æ»¤çš„æ•°æ®æµã€‚ readå’Œwrite是å¯é€‰å‚数,å¯ä»¥è®¾å®šä¸€ä¸ªæˆ–多个过滤器å称,以管é“符(|)分隔。 过滤器列表 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ å¯ä»¥é€šè¿‡ ``stream_get_filters()`` 获å–å·²ç»æ³¨å†Œçš„过滤器列表。其ä¸PHP内置的过滤器如下: - å—符串过滤器 - string.rot13 - string.toupper - string.tolower - string.strip_tags - 转æ¢è¿‡æ»¤å™¨ - convert.base64-encode - convert.base64-decode - convert.quoted-printable-encode - convert.quoted-printable-decode - convert.iconv.* - 压缩过滤器 - zlib.deflate - zlib.inflate - bzip2.compress - bzip2.decompress - åŠ å¯†è¿‡æ»¤å™¨ - mcrypt.``ciphername`` - mdecrypt.``ciphername`` 过滤器利用tricks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - LFI - ``php://filter/convert.base64-encode/resource=index.php`` - XXEè¯»å–æ–‡ä»¶æ—¶ä¼šå› è€Œè§£æžæŠ¥é”™ï¼Œå¯ç”¨base64ç¼–ç - base64ç¼–ç 会弃掉未在ç 表内的å—符,å¯ç”¨äºŽç»•è¿‡ä¸€äº›æ–‡ä»¶æ ¼å¼ - 部分 convert 会有大é‡çš„èµ„æºæ¶ˆè€—,å¯ç”¨ä½œDoS - rot13 / convert è½¬æ¢ è¿‡WAF