php社交聊天网站源码分享(php网页聊天源码)

本篇文章给大家谈谈php社交聊天网站源码分享,以及php网页聊天源码对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

翻译自:https://blog.projectdiscovery.io/php-http-server-source-disclosure/

介绍

在多种编程语言内置服务器上测试请求流水线时,我们观察到PHP的奇怪行为。随着我们的深入研究,我们发现PHP中的一个安全漏洞,它可以暴露PHP文件的源代码,就好像它们是静态文件一样,而不是按预期执行它们。

经过进一步测试,我们发现该漏洞在最新的PHP版本中不存在。我们对不同版本的PHP进行了进一步的测试,以确定错误何时修复以及原因。我们的调查将我们带到了PHP7.4.22的修补版本,并且对未修补和修补的代码进行比较使我们能够看到为修复漏洞所做的具体更改。

重要的是要注意,虽然这个问题已经在PHP源代码中得到解决,但Shodan查询揭示了许多公开的内置服务器实例。加入我们,我们将详细介绍我们的发现并分享我们通过分析学到的知识。

PHP7.4.21:https://github.com/php/php-src/compare/PHP-7.4.21…php-7.4.22

根本原因分析

这是未修补和修补的版本gitdiff-https://github.com/php/php-src/compare/PHP-7.4.21…php-7.4.22

为了充分理解该错误及其修复方式,我们编译了启用了调试符号的PHP修补和未修补版本。使用概念验证(PoC)请求,我们触发了源代码泄露错误,并观察了调试器中的代码流。

在线订单请求:

GET/phpinfo.phpHTTP/1.1\nHost:pd.research\n\\r\\n\n\\r\\n\nGET/HTTP/1.1\n\\r\\n\n\\r\\n

对CLI服务器的所有HTTP请求都由处理。跟踪如下所示:php_cli_server_client_read_request

\nmain(…)\n\tdo_cli_server(…)\n\t\tphp_cli_server_do_event_loop(…)\n\t\t\tphp_cli_server_do_event_for_each_fd(…)\n\t\t\t\tphp_cli_server_poller_iter_on_active(…)\n\t\t\t\t\t\tphp_cli_server_do_event_for_each_fd_callback(…)\n\t\t\t\t\t\t\tphp_cli_server_recv_event_read_request(…)\n\t\t\t\t\t\t\t\t\tphp_cli_server_client_read_request(…)\n

该函数调用该函数,顾名思义,用于解析HTTP请求。函数的返回值是成功解析的字节数。此值用于确定已处理的请求量以及待分析的剩余量。php_cli_server_client_read_requestphp_http_parser_execute

当下面提到的请求的第一部分几乎完成解析时:

GET/phpinfo.phpHTTP/1.1\nHost:pd.research\n\\r\\n\n\\r\\n\n

并且HTTP请求不包含标头,在下面的代码中调用。这里是一个宏,它在完成请求消息的处理后调用回调函数。Content-LengthCALLBACK2(message_complete)CALLBACK2php_cli_server_client_read_request_on_message_complete

if(parser->type==PHP_HTTP_REQUEST||php_http_should_keep_alive(parser)){\n/*Assumecontent-length0-readthenext*/\n\t\tCALLBACK2(message_complete);//Here\n\t\tstate=NEW_MESSAGE();//Afterwardsthestateisrevertedbacktostart_state\n}\n

https://github.com/php/php-src/blob/PHP-7.4.21/sapi/cli/php_http_parser.cL31-L37:

L210-L221

设置变量的每个成员都填充了各自的回调函数。

https://github.com/php/php-src/blob/PHP-7.4.21/sapi/cli/php_cli_server.cL1840

同样,有些宏的工作方式几乎相同。CALLBACKCALLBACK_NOCLEAR

因此,导致调用和调用等。CALLBACK2(message_complete)php_cli_server_client_read_request_on_message_complete(…)CALLBACK(path)php_cli_server_client_read_request_on_path(…)

staticintphp_cli_server_client_read_request_on_message_complete(php_http_parser*parser)\n{\n\t…\n\tphp_cli_server_request_translate_vpath(&client->request,client->server->document_root,client->server->document_root_len);\n\t…\n}\n

https://github.com/php/php-src/blob/PHP-7.4.21/sapi/cli/php_cli_server.c39;sworkingdirectoryis.\n\t\t\trequest->path_translated=buf;\n\t\t\t//sotherequest->path_translatedisnow/tmp/php/phpinfo.php\n\t\t\trequest->path_translated_len=q-buf;\n\t\t\t…\n\t\t}\n…\n\n}\n

https://github.com/php/php-src/blob/PHP-7.4.21/sapi/cli/php_cli_server.cL1476-L1491

最后,在请求的解析完成后,我们返回。比较解析的字节长度()和读取的字节长度()的返回值(更多内容在这里)。如果它们相等,则代码流继续,我们进入函数。php_http_parser_executenbytes_consumednbytes_readphp_cli_server_dispatch

staticintphp_cli_server_dispatch(php_cli_server*server,php_cli_server_client*client){\n…\n\tif(client->request.ext_len!=3\n\t||(ext[0]!=&39;&&ext[0]!=&39;)||(ext[1]!=&39;&&ext[1]!=&39;)||(ext[2]!=&39;&&ext[2]!=&39;)\n\t||!client->request.path_translated){\n\n\tis_static_file=1;\n\t}\n…\n}\n

https://github.com/php/php-src/blob/PHP-7.4.21/sapi/cli/php_cli_server.cL2278-L2280

出了什么问题?

这就是错误所在。如前面提到的代码块所示,在解析第二个请求后,设置为并假设没有找到索引文件,将被设置为。但是,仍设置为从第一个请求开始。检查是在第二个请求上执行的,我们输入这个分支和哪个设置。基本上,说将请求的文件视为静态文件而不是PHP脚本。vpath/client->request.extNULLclient->request.path_translated/tmp/php/phpinfo.phpclient->request.extis_static_file1

staticintphp_cli_server_begin_send_static(php_cli_server*server,php_cli_server_client*client){\n\telse\n\tfd=client->request.path_translated?open(client->request.path_translated,O_RDONLY):-1;\n\tL2115-L2159

请注意,此函数将打开并检索存储在其中的文件路径的文件描述符。在我们的示例中,将设置为。这种差异,其中检查发生在第二个请求上,但之后打开文件这是由第一个请求设置的,导致源代码泄露。client->request.path_translatedclient->request.path_translated/tmp/php/phpinfo.phpclient->request.extclient->request.path_translated

现在,由于文件被标记为,代码流现在只需读取fd并将其作为静态文件返回,而不是执行它。is_static_file

补丁

PHP7.4.22中引入了一个检查。此修复程序检查在分析请求路径时结构的成员是否不为NULL。如果它不是NULL,则该函数返回1。vpathrequest

staticintphp_cli_server_client_read_request_on_path(php_http_parser*parser,constchar*at,size_tlength)\n{\n\t…\n\t\t\tif(UNEXPECTED(client->request.vpath!=NULL)){\n\t\t\treturn1;\n\t\t}\n\t…\n\t}\n\treturn0;\n}\n

https://github.com/php/php-src/blob/PHP-7.4.22/sapi/cli/php_cli_server.cdefineCALLBACK(FOR)\\\\\ndo{\\\\\nCALLBACK_NOCLEAR(FOR);\\\\\nFOR_mark=NULL;\\\\\n}while(0)\n\n34;UnsupportedSSLrequest&34;MalformedHTTPrequest&34;<?phpechohtmlentities($_SERVER[&39;])?>&34;/index.php?abcd&34;url&39;contains(body_1,&34;)&39;!contains(body_2,&34;)&34;<?phpechohtmlentities($_SERVER[&39;])?>&34;php&34;-S&34;0.0.0.0:8888&34;-t&34;/var/www/html/”]

dockerbuild.-tphptest\ndockerrun-p8888:8888phptest\n\n[SatJan2820:09:072023]PHP7.4.21DevelopmentServer(http://0.0.0.0:8888)started

结论

总之,研究旨在研究多层架构上的请求流水线。作为研究的一部分,检查了PHP内置服务器,并偶然发现了测试服务器上旧版本的PHP中存在的安全错误。此漏洞可能允许PHP文件的源代码像静态文件一样公开。我们的调查使我们确定该问题已在更高版本的PHP中修复,特别是PHP7.4.22,需要注意的是,尽管PHP团队建议不要在生产中使用CLI服务器,但互联网上仍然存在至少几千个暴露的内置服务器实例。此外,PHPCLI服务器可能位于多个反向代理或负载均衡器后面,这将使利用起来更具挑战性。在我们使用NGINX和Apache等服务器以及PHPCLIServer进行测试时,无法利用该漏洞。

关于php社交聊天网站源码分享和php网页聊天源码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平