728x90
sql injection 쿼리를 분석하다가 공부한 내용이다.
먼저 `order by 0`에 대해 알아보겠다.
order by [상수(리터럴)]: 상수 번째 칼럼을 기준으로 정렬하겠다는 의미다. 이 값은 1부터 시작한다. 따라서 0을 넣게 되면 없는 칼럼을 검색하게 되어 에러가 나오게 된다.
사용 예시를들어보겠다.
SELECT name, age, address
FROM people
ORDER BY 2;
이 정렬은 age를 기준으로 정렬하는 것이다. 위의 예시가 올바른 사용 예시다.
그럼 `order by if(1=1, 0, 0)`에 대해 알아보자.
얼핏 봐서는 항상 참이기 때문에 `order by 0`과 같다고 생각된다. 실제로 사용해보면 정상적으로 수행되는 것을 확인해볼 수 있다.
order by [표현식]: 여기서 표현식으로 정렬되는 값의 우선순위를 정해줄 수 있다. 예시를 들어보겠다.
SELECT name, age, address
FROM people
ORDER BY
CASE
WHEN age = 20 THEN 0
WHEN age = 21 THEN 1
ELSE 2
END;
age가 20이면 0순위
age가 21이면 1순위
그 외는 2순위로 순서를 정해주는 예시다. 위 예시를 살짝 바꿔보겠다.
SELECT name, age, address
FROM people
ORDER BY
CASE
WHEN age = 20 THEN 0
WHEN age = 21 THEN 0
ELSE 0
END;
모든 조건에서 0순위를 부여한다. 따라서 문법적 오류 없이 모든 경우가 0순위이다.
여기서 case문 대신 if문이 들어간 것이 `order by if(1=1, 0, 0)`으로 볼 수 있다.
728x90
반응형
'분류 전 > 개념 노트장' 카테고리의 다른 글
[SQL] information_schema가 필터링 됐을 때 Union SQL Injection (0) | 2024.03.29 |
---|---|
[Node.js] prepared statement 사용 시 주의 사항 (1) | 2024.03.28 |
[SQL] mysql boolean 비교 시 동작 방식과 false injection (0) | 2024.02.23 |
[python] pickle 모듈 간단 사용법 및 취약점 (1) | 2024.02.12 |
[개념] url 인코딩 / 디코딩 정리 (0) | 2023.06.27 |