보안/LOS

[LOS] green_dragon

dDong2 2022. 12. 29. 11:58
LOS : https://los.rubiya.kr/

 

✔️ 문제

 

 

문제는 다음과 같다.

이전 order by에서 벗어나 이번에는 예전 문제들과 비슷하게 보인다.

 

 

✔️ 풀이

 

풀이를 위한 코드는 다음과 같다.

 

if($result['id'] == "admin") solve("green_dragon");

 

코드는 다음처럼 간단하지만,

예전 문제들과 다르게 코드의 양이 증가하였고

그만큼 복잡성도 올라간 것으로 보인다.

 

1) 일단 필터링에 온점, 싱글쿼터, 더블쿼터가 걸려있다.

2)  id 결과가 존재하면, if문 내의 query2로 동작하게 된다.

 

id와 pw를 둘 다 입력받을 수 있을때 사용할 수 있는 우회가 존재한다.

일단 어떠한 것이든 시도해보자.

 

 

이전 succubus 문제처럼 역슬래쉬를 활용해서

id 내 값을 문자열로 치환하게 되면 다음처럼 처리할 수 있지만,

우리는 result['id']에 해당하는 id 값을 넣어주어야 하기 때문에

해당 방법에 더한 다른 페이로드 시도해야 한다.

 

이전에 select 구문을 중복하여 검색할 수 있도록 하는 것이

union 구문을 사용한 적이 있는데, 이처럼 두 개의 쿼리문을

반환하기 위해서 union 구문을 사용하여 출력해보도록 하자.

 

 

다음과 같이 두 번째 쿼리문이 등장하는 것을 확인할 수 있다.

그렇다면 해당 두 번째 쿼리의 id가 admin이면 문제가 풀릴 것이고,

기존에 사용한 union 구문을 활용하여 페이로드를 구성해보자.

 

역슬래쉬를 활용하여 첫 번째 쿼리문을 무력화하였고

두 번째 쿼리문도 같은 형태이기 때문에 역슬래쉬로 무력화한 뒤,

마지막으로 union 구문을 추가로 작성하여 이전에

 

select 1 union select 조작구문

 

위와 같은 형태의 페이로드로 작성해보자.

이때, id에 싱글쿼터를 사용하지 못하므로 char() 함수를 사용하자.

mysql에서 char 함수는

 

출처: https://www.habonyphp.com/2019/02/char.html

 

다음과 같이 사용할 수 있다.

admin은 97 100 109 105 110 10진수로 변환할 수 있다.

 

 

다음과 같이 작동되지 않는 것을 확인할 수 있다.

검색해보니, url encoding 단계에서 동작하지 않을때는

구문 전체를 hex encoding 하는 과정을 거친다고 한다.

(참고: https://www.c-sharpcorner.com/article/sql-injection-with-hex-code-and-its-prevention-mechanism/)

 

그렇다면 역슬래시 및 union 부터의 구문을 모두 hex 인코딩하여 보내보자.

 

 

다음과 같이 해결할 수 있다.

 

화이팅 💪