완료됨
이번 강의에 딸린 퀴즈 3번의 답이 잘 이해가 안 됩니다.

SELECT *FROM accounts WHERE user_id='admin' and user_pw='(A)' 에서 (A)에 들어갈 수 있는 로그인 우회 방법을 모두 고르라는 퀴즈 말인데,

답에 '+(select user_pw from accounts where user_id='admin')+' 이 포함되더군요.
하고자하는 의미는 이해가 가는데 SQL DML 명령문에 '+'나 '('가 포함되어도 되는지 의아합니다. 굳이 있어야 하는지도요.
그냥 ' select user_pw from accounts where user_id='admin'' 이런 식으로 하는건 안되는 걸까요?

#웹해킹 #서버 #sql
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2
avatar
p6rkdoye0n
대표 업적 없음

질문자님 말씀처럼 원래는 +문자는 잘 쓰지 않죠 ㅎㅎ 웹 해킹 심화에서 나올텐데 union sql injection이라는 공격이 있어요. sql구문을 합쳐서 결과를 만드는 공격인데 굉장히 많이 사용합니다. 질문자님이 아래에 +기호 빼고 쓰신 구문은 올바르게 실행이 안됩니다. 대신 앞에 union이라는 문자만 추가하고 뒤에 주석처리 해주면 올바르게 실행이 돼요! 그리고 괄호를 친 것은 하나의 결과를 묶으려고 쓴 것입니다. 아직 저 커리큘럼에서는 union공격을 설명하기에는 너무 많다고 생각해 빼버린거 같습니다.

2023.02.07. 17:49

오래된 글이지만 혹시나 다른분들도 볼까싶어 작성합니다!
먼저, 해당 쿼리문을 확인하면 사용자 로그인 페이지에서 전달되는 쿼리문이라는 것을 유추할 수 있습니다. 해당 페이지는 구조적으로 Union based를 사용할 수 없습니다. 로그인 페이지에서 데이터를 화면에 출력하진 않으니깐요. 그리고 로그인 페이지라는 것을 감안했을 때 문제에서 원하는 답은 Error based나 blind based를 통한 데이터 출력을 위한 쿼리문이 아닌 인증우회를 위한 쿼리문을 의도했을겁니다. 하지만, 작성자님이 작성한 쿼리문인 ' select user_pw from accounts where user_id='admin'' 이거는 삽입되면 아무현상도 발생하지 않습니다. 실제로 보여드리면 작성자님이 작성한 쿼리문을 기존 쿼리문에 삽입해서 확인해보면 아래와 같이 DB에 전달될 것입니다.
SELECT * FROM accounts WHERE user_id='admin' and user_pw=''select user_pw from accounts where user_id = 'admin' ''
보이시나요? 작성자님이 작성한 쿼리문은 기존 쿼리문에 삽입된것이 아닌 별도의 select 문을 하나 더 작성한 것 뿐입니다. 그러니 마찬가지로 로그인이 안되겠죠 그러면 이제 정답에서 작성한 쿼리문을 기존 쿼리문에 삽입하고 확인해보면 아래와 같이 DB에 전달됩니다.
SELECT * FROM accounts WHERE user_id='admin' and user_pw=''+(select user_pw from accounts where user_id = 'admin')+''
보이시죠? 정답에서는 +를 통해 문자열 결합을 하고있습니다. 그러면 결과가 어떻게 될까요? 당연히 앞에 있는 ''는 공백이고 그 뒤에 select 문을 통해 admin의 패스워드를 뽑았습니다. 그리고 뒤에 있는 공백과 다시 합쳐지죠. 즉, 해당 쿼리문은 기존 쿼리문에 삽입되어 user_pw에 admin의 패스워드를 전달하게 됩니다. 그러면 실제로 한번 DB에서 실행해볼까요?

먼저, 테스트를 위해 accounts라는 테이블을 만들고 컬럼은 user_id와 user_pw만 적용하였습니다. 그리고, admin 계정과 guest계정의 데이터가 들어있습니다. 테이블 내용은 아래와 같습니다.

이제 해당 테이블에 쿼리문을 전달해봅시다. 일단 작성자님의 쿼리문을 삽입하여서 예제와 똑같이 전달하겠습니다. 쿼리문은 아래와 같습니다.
SELECT * FROM accounts WHERE user_id='admin' and user_pw=''select user_pw from accounts where user_id = 'admin' ''

결과를 보시면 작성자님의 쿼리문은 기존 쿼리문에 삽입되지 않고 별도의 select 문으로 동작하는 것을 볼수있죠? 그러면
퀴즈의 정답인 쿼리문을 한번 전달해볼까요? 쿼리문은 아래와 같습니다.
SELECT * FROM accounts WHERE user_id='admin' and user_pw=''+(select user_pw from accounts where user_id = 'admin')+''

이번엔 제대로 기존 쿼리문에 삽입되어 admin의 데이터를 출력하는 것을 확인할 수 있죠? 차이점은 +로 문자열 결합을 했냐 안했냐의 차이밖에 없습니다. 같은 궁금증을 가지신 분들한테도 도움이 되었으면 좋겠네요 좋은 질문이였습니다!!

2024.05.10. 11:31