Wargame/The Lord of the SQLI

Los.Rubiya.kr - goblin write up

9ucc1 2020. 7. 10. 17:00
반응형

문제의 소스코드를 분석해보자

우리가 할 수 있는 건 no 파라미터에 값을 전송하는 것이다. 

하지만 preg_match 함수(문자열 체크 함수)를 살펴보면

'(싱글쿼터) 와 "(더블쿼터), `(백쿼터) 를 막고있는 것을 확인할 수 있다. 

즉, 우린 쿼터 없이 문제를 풀어야 한다. 

 

no 파라미터를 보면 현재 숫자로 입력받는 것을 알 수 있다. 

숫자로 입력을 받는 경우, '(싱글쿼터) 없이 공백으로 no에 들어가는 값을 조절할 수 있다.

?no=1 or id=0x61646d696e %23

no 엔 아무 숫자나 넣고, id가 admin이여야 solve 함수가 실행되므로 id엔 admin 문자열을 넣어줘야 한다.

하지만 id=0x61646d696e 라는 이상한 값을 집어넣어줬다. 

 

이 값은16진수로, string to hex 를 한 것이다.

즉, admin 문자열을 16진수로 바꿔주면 admin = 0x61646d696e가 된다.

 

16진수로 바꿔준 이유는 우리가 admin을 문자열로 넣기 위해선 싱글쿼터가 필요한데,

싱글쿼터를 사용할 수 없으니 16진수로 넣어준 것이다.

php 코드 안에선 자동적으로 16진수가 형변환을 하여 admin으로 바뀌기 때문에

16진수로 바꾸어줘도 상관이 없다. 

 

URL 뒷부분에 저 코드를 넣고 요청값을 보내면,

무언가 잘못되었다. 분명 id를 admin으로 보냈는데 guest 로 로그인이 된 듯 하다. 

쿼리문은 정상적으로 잘 들어갔다. 

 

이것은 no가 1이여서 나타나는 페이지이다. 

현재 guest의 no가 1일 때, guest로 로그인이 되는 것을 알 수 있다.

따라서 no를 1이 아닌 -1로 바꿔주면

?no=-1 or id=0x61646d696e %23

https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=-1%20or%20id=0x61646d696e%20%23

 

admin 정상 로그인이 되며 GOBLIN Clear!

반응형