[LoS] WriteUp 03: Goblin

marceline·2024년 1월 28일
0

[LoS]

목록 보기
4/5

Lord of SQLInjection 사이트의 3번 문제인 Goblin 에 대한 WriteUp 을 작성했다.

Analyze

php 문은 다음과 같다.

이번 문제는 쿼터도 사용할 수 없기 때문에 임의로 문자열을 종료시킬 수 없다는 것을 알 수 있다.
쿼터를 사용할 수 없다는 것은 문자열 형식이 아니라는 것 !
no -> 즉, 숫자를 입력해야한다.

id는 guest 로 고정되어있으나, 문제는 id=admin 일 경우에만 solve() 가 실행된다.
즉, "id 조건을 수정할 수 없는 상황에서 문자열의 사용없이 로그인에 성공하는 것" 이 문제의 의도라 할 수 있다.

Try

Try1

no=1 을 대입해본다.

"Hello Guest" 문구와 함께 guest 사용자로 로그인 된 것을 알 수 있다.
즉, guest 의 no=1 이라는 결론을 낼 수 있다.

id=aa&no=1

그렇다면 no 에는 무조건 1이 아닌 값이 들어가야만 조건을 거짓으로 만들 수 있을 것이다.

admin -> (ASCII) 97 100 109 105 110
이므로
'admin' = char(97, 100, 109, 105, 110)
일 것 이다.

Try2

id=char(97, 100, 109, 105, 110) or no=[1이 아닌 정수]
url encode >
id%3Dchar%2897%2C%20100%2C%20109%2C%20105%2C%20110%29%20or%20no%3D[1이 아닌 정수]

Try3

편의상 no=4 라 가정한다.
no=4 or id=char(97, 100, 109, 105, 110)
url encode>
no%3D4%20or%20id%3Dchar%2897%2C%20100%2C%20109%2C%20105%2C%20110%29
변화가 없다. 이유에 대해서 생각해보니 char() 내부의 공백 때문인듯 하다.

Payload

no=4 or id=char(97,100,109,105,110)

GOBLIN Clear! 문구가 정상적으로 출력됐다.

< 추가 >
쿼터를 사용할 수 없을때, 16진수를 이용하여 문자열을 입력할 수 있다고 한다.
해당 방법을 사용하면 공격구문은 다음과 같다.
no=4 or id=0x61646d696e

그 이유는 MySQL 에서 16진수를 받으면 자동으로 ASCII 코드표와 대조하여 문자로 바꿔주는 기능이 있기 때문이라고 한다.

Reference

권현준. 『누구나 쉽게 따라하며 배우는 웹 해킹 첫걸음』. 비제이퍼블릭, 2022.

0개의 댓글