Single

[WUSTCTF2020]WEB做题记录4 min read

buu冲冲冲🚀🚀🚀~

[WUSTCTF2020]朴实无华

首页只有一句HackMe,尝试查看robots.txt,得到关键信息:

User-agent: *
Disallow: /fAke_f1agggg.php

仔细看响应头,得到f14g.php,访问:

<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);

//level 1
if (isset($_GET['num'])){
    $num = $_GET['num'];
    if(intval($num) < 2020 && intval($num + 1) > 2021){
        echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
    }else{
        die("金钱解决不了穷人的本质问题");
    }
}else{
    die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
   $md5=$_GET['md5'];
   if ($md5==md5($md5))
       echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
   else
       die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
    die("去非洲吧");
}

//get flag
if (isset($_GET['get_flag'])){
    $get_flag = $_GET['get_flag'];
    if(!strstr($get_flag," ")){
        $get_flag = str_ireplace("cat", "wctf2020", $get_flag);
        echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
        system($get_flag);
    }else{
        die("快到非洲了");
    }
}else{
    die("去非洲吧");
}
?> 

level 1:传入的数既要小于2020又要+1后大于2021,可以用科学计数法来绕过。比如1e9。intval函数有个特性:“直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换”。而intval($num + 1)则涉及到字符和数字的相加,因为num是科学计数法形式,它会先转成数字形式再加1。

<?php
$num = '1e9';
echo intval($num);    //1
echo "\n";
echo intval($num + 1);    //1000000001
?>

level 2:有点懵,传入的值和传入的值的md5要相等。可以用一个0e开头的字符串进行碰撞,当它的md5值开头也为0e,并且仅由数字组成的时候就可以绕过了。

然后nmd,爆了好久:

import hashlib
import re

for i in range(0,1000000000000):
    strr = "0e"+str(i)
    md5 = hashlib.md5(strr.encode('utf-8')).hexdigest()
    if (re.findall('^0e(.*?)',md5) and md5[2:].isdigit()):
        print(strr+": "+md5)
#0e215962017: 0e291242476940776845150308577824

get flag:过滤空格和cat的命令执行,cat可以用我最爱的strings来代替,空格可以用${IFS}来代替。

最后的payload如下:

/?num=1e9&md5=0e215962017&get_flag=strings${IFS}fllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaag

[WUSTCTF2020]颜值成绩查询

[WUSTCTF2020]CV Maker

没有robots.txt,扫描敏感路径也无果,在首页注册一个账号,然后登录:

仅有上传头像这里是可以交互的,测试一下文件上传。这道题检测了exif_imagetype,所以文件前面要加上GIF89a。(我太讨厌文件上传题了Q Q

上传成功,复制图像地址,然后连接:

根目录下找到flag:

[WUSTCTF2020]easyweb(未完成)

可以任意上传文件,但是无法执行。随便上传一张图片,返回路径如下:

文件包含漏洞常见的参数名就是file,看到这个参数名就试一下,不过不好使qwq

尝试直接读取/etc/passwd成功:

学习了一下别的师傅的WP,可以配合幽灵猫漏洞文件包含,这里我这几天再学习补充一下:

幽灵猫漏洞不仅可以文件读取,还可以文件包含(某些PoC只能读取不能包含)。我们可以任意上传JSP木马并得知路径,只要通过AJP包含这个jsp就能执行里面的代码,就通过文件包含实现了RCE。

CVE-2020-1938幽灵猫利用脚本下载:

https://github.com/00theway/Ghostcat-CNVD-2020-10487

这道题还存在一个非预期解,不过这个非预期在BUU上已经复现不了了。BUU这道题需要使用内网的 Linux Lab 靶机来访问本题的 8009 端口,尝试了下,不知道VNC怎么拖文件,内网也下不了这个脚本,还望师傅们指点我一下这道题T T。

[WUSTCTF2020]Train Yourself To Be Godly

这道题真nm酸爽。

给了一个Apache Tomcat WebSocket Examples(。。?

参考官方WP学习了新知识点,这道题首先考了TOMCAT 目录穿越

上图可知,Nginx 会解析 /a;evil/b/,并认为这是一个合法的目录请求,而 Tomcat 做解析的时候会自动忽略掉脏数据 ;.*,所以 Tomcat 对此的解析是 /a/b/。也就是说我们从可以通过写 ;+脏数据的方式绕过 Nginx 的反向代理,从而请求本不应该能请求到的非法路径。对于本题来说,我们可以构造路径 /..;/,Nginx 会认为我们要访问服务器的 /..;/ 目录下的内容,从而将这个请求视为合法请求发送给后端的 Tomcat 解析,Tomcat 接受之后认为 ; 是脏数据,从而过滤掉,解析的路径就变成了 /../ 也就是上级目录。所以访问 /..;/manager/html 之后我们就成功进入了后台界面。

Tomcat的默认后台路径就是http://…/manager/html,根据上述内容,构造/..;/manager/html,成功弹出后台登录框。

Tomcat的默认口令如下:

账号:admin 密码:admin或空;

账号:tomcat 密码:tomcat

这道题输入账号tomcat密码tomcat即可,成功进入Manager后台,开始部署jsp大马。Tomcat默认支持热部署(就是不用重启就能执行你部署的war包)。

WAR file to deploy部署,抓包后返回404,原因是url里自动加了个examples,删掉继续,返回了401。

这个地方涉及一个知识点:Authorization Bassic是401验证,用base64加密的,格式为Authorization: Basic base64-encode(username:password),所以这道题应该加一个

Authorization: Basic dG9tY2F0OnRvbWNhdA==

很好,这次返回403啦。。

返回403的原因是没有权限,需要抓到Set-Cookie,这里卡了好久,非!常!感!谢Match师傅教会了我一个骚操作(猫猫头

访问/..;/manager/html/然后刷新,f12,存储这里修改一下:

把Path改成如图的/..;/manager,再上传war包部署,别忘记Authorization验证和这个Cookie。

因为war包叫test2.war,里面的内容是2.jsp,所以访问/..;/test2/2.jsp即可。