登高的资格,永远不是别人的肩膀!|

Running_J

园龄:2年11个月粉丝:10关注:1

伪协议与preg_replace /e模式

题目

解读:使用get传入参数,要求使用file_get_contents读取text内容,需要和I have a dream全等,之后检查file的参数是否有flag,还有下面包含了next.php文件

知识:

  • 函数

    1. file_get_contents:将文件读入一个字符串

    2. 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

  • 协议

https://www.bilibili.com/read/cv18271529

  1. 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.

本文作者:Running_J

本文链接:https://www.cnblogs.com/ArcherCY/p/16826156.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Running_J  阅读(73)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起