PHP解压缩任意文件夹网!

PHP解压缩任意文件夹网

趋势迷

PHP解压缩任意文件夹

2024-07-20 02:16:52 来源:网络

PHP解压缩任意文件夹

ThinkPHP6 任意文件操作漏洞分析漏洞介绍
2020年1月10日🕷|_🐄,ThinkPHP团队发布一个补丁更新😅_|🌿🤿,修复了一处由不安全的SessionId导致的任意文件操作漏洞😜🍂|⛅️🦔。该漏洞允许攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件🦍🦢|😋,在特定情况下还可以getshell🐩-🤨🧿。
具体受影响版本为ThinkPHP6.0.0-6.0.1😫*‍❄——|🌴。
漏洞复现
本地环境采用ThinkPHP 6.0.1+PHP7.1.20+Apache进行复现🐽-_🐖。在特定情况下执行测试验证程序即可写入一个webshell♥|——😨,如下图🌜🏉|——*🌗:


漏洞分析
根据官方github的commit:

因而推测🐖|-🃏🦁,可能是在存储session时导致的文件写入🏏🍃-🐗🐣。然后🐯——🐨,跟踪🤐🤭——_🌴*:vendor/topthink/framework/src/think/session/Store.php:254😔🀄——-🙁。

这里调用了一个write函数🤬🐷_🐳🐀,跟进一下😻————😇🐝:vendor/topthink/framework/src/think/session/driver/File.php:210🐣——😵🐇。

调用writeFile函数🥏——🦖,跟入🐕‍🦺|😌😋:

果然是写入文件的操作🦄🤖_——🦇。
继续反向看一下文件名是否可控🌎_🦏♣,该文件名来自于最开始的getId()得到的$sessionId的值🐸_|🦍🙂。既然有getId🌵_-🌵🦃,就会有setId😉🐦_😆🐵,看一下函数内容🧩🦓-|🦢😎:

当传入的参数$id满足32位的长度时🎖——|😣🙊,就将该值设为$this->id🤠————🐟。看一下调用setId的地方🤖🐵|——🐍🦆:vendor/topthink/framework/src/think/middleware/SessionInit.php:46🧐-|😗🐩。

这里的$cookieName的值是PHPSESSID🦝🦋|_🏆。

而$sessionId是cookie中名为PHPSESSID的值🎈🙄|🐣🦉,因此是攻击者可控的🐤__🐳😳,从而导致写入的文件名可控😌-🤩。
写入的文件名可控🪴_-♟*,那么写入的内容是否可控呢?分析发现🦉||🐐,写入的内容就是创建session使用的内容🐍👹-_🦋。但是session的创建是由实际的后端业务逻辑来决定的🕊🌼|⛸,而默认环境下并没有创建session🦜😘_-🦚。因此🥈🐇--🦂,默认环境下无法做到任意文件写入🐦🙃——_🤧🐩。
在对该漏洞的深入分析过程中🪀-——🦧,我们发现该漏洞还可以实现任意文件删除*--🌷,且文件删除对后端业务逻辑依赖较低🕊🐗-_🦚。
还是在vendor/topthink/framework/src/think/session/Store.php:254中🤬_-🦛✨:

通过分析验证🪢🦆-😛🎖,我们发现漏洞(如上图)还能导致任意文件删除🐺|——🐋。
总结
在目标环境为Windows且开启session的情况下🐏🐾|🎋,容易遭受任意文件删除攻击*🦙_🐟。
在目标环境开启session且写入的session可控的情况下🌜😗|——*🐷,容易遭受任意文件写入攻击🐁——🙈🎮。
建议相关用户及时升级到ThinkPHP6.0.2版本🕹|☁️😰,以免遭受攻击🏓——🤒☁️。
Gxlcms🌑_——🥉☹️,大量的免费thinkphp入门教程😤*|🤪🦜,欢迎在线学习🐖🍀-|🦔💥!

PHP解压缩任意文件夹

thinkphp6 任意文件创建漏洞复现01 背景
近日奇安信发布了 ThinkPHP 6.0 “任意”文件创建漏洞安全风险通告🌻_——🌤🐡,对此🪳-🎲😐,DYSRC第一时间对该漏洞进行了分析*🐦————🌔,并成功复现该漏洞🐋|🦕。
漏洞影响范围💐🌩|_*😖:top-think/framework 6.x
02 定位问题
根据任意文件创建以及结合近期的commit历史🪶🦎——-🦎,可以推测出 1bbe75019 为此次问题的补丁🐷-🐑。可以看到在补丁中限制了sessionid只能由字母和数字组成🧵_🕊🦁,由此看来问题更加明显🌻_-🐺。

03 原理分析
先抛开上面的问题🎀🐁__🐆,我们看一下thinkphp是如何存储session的🐽|-🦝🎗。
系统定义了接口thinkcontractSessionHandlerInterface

SessionHandlerInterface::write方法在本地化会话数据的时候执行😕🦓——|🌴🐤,系统会在每次请求结束的时候自动执行🐐🌤|🤫*。
再看看thinksessiondriverFile类是怎么实现的🐱||🐺。

先通过getFileName根据$sessID生成文件名🦌|——🌳,再writeFile写入文件😃_🍁。
跟进getFileName😤*-*,直接将传入的$sessID拼接后作为文件名🐩😉——_👽。由于$sessID可控🤫*_——🦙,所以文件名可控*🦅——🎱🐉。

04 演示
分析到这里🎆🦝——_🥎🎐,整个漏洞流程基本上已经很清晰了🥊_——🌩。下面给出本地的演示结果🐓🐹——_😻。

Gxlcms😡_-🙄🐬,大量的免费thinkphp入门教程🥏🌥——🐄🦘,欢迎在线学习🦏|——🦎🐤!

php怎么得到任意四个字符串
php怎么得到任意四个字符串
1🤗——🐁、首先我们写一个getRandomStr函数🔮|😞💀,传入两个参数🍄_|🐐,第一个参数为生成字符串的长度🧨🐓||*,第二个参数为是否需要特殊字符**——_⛳。
2🦎-——🌥、然后我们调用4次getRandomStr函数并打印即可🦊|*🐲。
效果😅🦊|🌷🤡:(这里我生成了4个8位字符串🤒——|🐬🕊,并且不包括特殊字符)
3🦘__🌓🙂、我们也可以通过一个数组来保存4次生成的结果🐌-|🌓。
结果🐈--⭐️🍀:
并使用下标进行单独调用😌|-🦬🎯:
结果😡_🤨:
更多PHP相关知识🐆_|🙁,请访问PHP中文网*_|😭😔!

php如何删除文本文件中的任意行php删除文本文件中的任意行的方法🐥_🙈:1🐿-😉🦗、指定操作文件与要删除的行数🎟🪶|_🤭😍;2🐵🐗——🐸🙄、读取文件数据到数组中😣——🤒🐪;3😤——🦙、删除文件中的指定行🦒🌪__⛳🎱;4*🦏|🐜🎄、重新整理文件数据🍀——-🙀😆;5😝|_🕊😲、将删除数据后的文件重新写入原文件🤪——🏐🐥。

代码实现🦛🤔--😙:
(推荐教程🌓🌒_——😕:php视频教程)
文本文件aaa.txt如下🪡-🍄:

php怎么删除文件中的任意一行
将文件逐行读入数组🦀😓|-🌺,然后遍历数组并把数组各元素的值添加到要保存的字符串中😊_🌘🌻,当处理到对应于要删除的行的数组元素时不读入它⭐️😓——🦖🐸,最后保存文件🎫😫_🐬。
(学习视频推荐🐅🦅|-🐕🌻:java视频教程)
实现方法🀄🦅_🕊🦕:
执行以上PHP程序😅😹——-😮😞,它将删除test.txt文件的第三行🌹🐘——-☘。文件的行序列号从0算起🤓*_🐁,而不是我们通常所理解的从1算起🐜——😹,这与数组元素的下标序号是一样的情形🐌🦂_🦁。
有一个问题需要弄清楚🎯|_🍃,就是所谓的“行”的概念🤓|🐖。让我们用记事本写一个文件🦬🌍-🐭,一行结束后我们打一个回车或者不打🐨——-🪁*,保存该文件后该文件就有了一行😏|_🥀🌴;如果我们打完一行后回车再打一行🐼🦃——-🦌,保存后文件就有两行🤗——|👺。在记事本里🦦——🦙🐊,当我们设置格式为“自动换行”*🦘——-🎊👺,一行文字写到最右端时会自动折行🙁————🐯🥈,但那不是两行🎲🐘——_😨,它依然只是一行*🍂|-🦂🎳。
在记事本里🐥——_🌖⛈,不论有多少文字🥊|——🐡,也不论格式是否为“自动换行”🦚|🦗🏉,如果一直没有回车符🐱😼——_😔,那么就只能是一行🤠🦢_——🦒。换句话说🍃_🌾🌴,行的标志是回车符(PHP记作“"\r\n"”)🐹🐇——🐐。
修改以上程序🦡——🌕,我们还可以轻易地删除文件里所有空的行(只有空格+回车符或只有回车符的行)🤮_🐣:在遍历数组并读入保存字串时用trim检测每一个数组元?
这个程序将删除文件中的所有空行🎿|——🌤🐵,但假若文件的最后一行为空行🦣🐹|-🦝🐈,则会清除其空格符(如果有的话)然后保留一个回车符(它被当作文件末尾的指针标志)🐐-🐚🪢。