개행

DATE : 2023/11/29

이번에 살펴볼 내용은 WAS에 작성해둔 구문에 개행이 포함되는 경우이다.

이때 개행이 무엇인지 간단히 말하자면, 다른 말로는 줄 바꿈

SQL 내에서는 사용자가 주석을 사용하지 못하도록 하는 장치 라고 표현할 수 있을 듯하다.

지금까지 작성해온 Query와는 달리 개행이 포함되면 말 그대로 Query 내에 줄 바꿈이 일어난다.

> SELECT * FROM member WHERE id='___' and pass='___'

> SELECT * FROM member WHERE id='___' and 
    pass='___'

사실 "엔터 한 번 누른 거 가지고 뭐가 그리 달라지겠어?" 싶지만

Query가 실행된 결과를 보면 생각이 달라질 것이다..!!

...
$sql = "select * from member where id='$user' and 
    pass='$pass'";
$result = mysqli_query($conn, $sql);
$row = mysqli_num_rows($result);
...

개행이 포함된 Query를 미리 서버에 구현해두고 로그인 우회를 시도해보자.

간단하게 주석 처리 해버리면 끝이겠지~ 라는 마음으로 엔터를 누르게 되면

😲😲😲

나오라는 결과는 안 나오고 에러가 뜬다.

에러 내용을 한 마디로 요약하자면

pass='hanhxx1234' 즈음 어딘가 문법 에러 있음^^ 이라는 소리인데

ID : hanhxx' #
PASS : hanhxx1234

> SELECT * FROM member WHERE id='hanhxx'#' and 
    pass='hanhxx1234'

사용자가 입력한 값을 대입해 Query를 생각해보면 일단 혼자 남아 도는 따옴표가 하나 있고

주석으로 뒷 내용이 무효화된다고 치면 개행으로 인해 and만 사라지게 된다.

결과적으로

SELECT * FROM member WHERE id='hanhxx' pass='hanhxx1234'

와 같은 Query가 만들어지게 되기 때문에 에러가 나는 것!

따라서 이런 경우에는 사용자가 SQL injection을 수행하기 위해 사용하는 주석을

막을 수 있게 되는 것이다.

그렇다면 반대로, 주석이 막혀버린 상황에서 로그인을 우회할 수 있는 방법은 없는 걸까?? 🧐

Last updated