Lord of SQL Injection goblin 문제 풀이 후 정리
문제를 보면 쿼리에 id값 까지는 고정이 되어있고, 뒤에 no 칼럼뒤를 통해 결과를 뽑아야 한다
no=1 값을 넣으니 and 조건이 성립되어 Hello guest가 출력됨을 확인
||(OR)조건을 통해 앞을 거짓을 만들고 뒤를 참으로 만들어 결과가 출력 될 수 있도록 수정
→ no=0||id=admin 이렇게 입력시에는 아무것도 출력 되지 않음 (admin을 문자로 만들 ' ' 사용이 불가함)
admin을 16진수로 바꿔 삽입 하면 결과 확인 가능
admin → 0x61645D696E (16진수)
문제는 비교적 간단하게 풀렸지만
여기서 궁금한 부분이 생겼다
id=admin은 안되는데 id= 0x61645D696E는 되는이유
궁금한 부분은 ' '로 감싸지지 않은 16진수도 문자열로 인식이 되서 정상적으로 쿼리가 수행되는 부분
id=admin과의 차이점
일반적으로 SQL 구문에서는 id=admin이라고 작성하면 admin을 컬럼명이나 키워드로 인식하려 하기 때문에 구문 오류가 발생할 수 있다.
따라서 id='admin'처럼 문자열을 감싸야 하지만, 16진수 리터럴은 따옴표 없이도 MySQL에서 문자열처럼 취급되기 때문에 id=0x61646D696E라는 표현이 가능
MySQL에서 16진수 리터럴이 문자열로 자동 변환되는 동작 방식은 MySQL 공식 문서의 **"Numeric Literals"**와 "String Literals" 섹션에서 확인