SQL 인젝션 공격기법중 쿼리 대입문구 의미가 궁금합니다.
' or ''='
' or 1=1--
' or 1=1#
' and ''='
' and 1=1--
' and 1=1#
SQL 인젝션 취약점 공격 중 위의 쿼리들이 어떻게 해석되는 것인지 이해가 잘 안됩니다...
쿼리문으로 예시로 혹시 설명좀 부탁 드립니다 ㅜ
로그인 하는 경우를 예로 들어보겠습니다. 별 생각 없이 대충 만들면 아래 쿼리처럼 될 수 있습니다.
SELECT user_id FROM users WHERE username = '$id' AND password = '$pw'이런 쿼리에서 단순히 $id와 $pw를 적절한 escape 없이 바꾸기만 한다면 $pw에 ' or ''='를 넣을 경우
SELECT user_id FROM users WHERE username = 'admin' AND password = '' or ''=''결과적으로 이런 쿼리가 만들어질 수 있습니다. 비밀번호를 몰라도 어떤 아이디로든 로그인을 할 수 있게 되죠!
AND보다는 OR이 더 확실합니다. --와 #은 그 뒤 부분을 주석으로 처리하겠다는 뜻입니다.
SQL 인젝션은 웹에서 아이디,암호등을 입력받을때 인젝션 공격에 대한 방어를 하지
않을경우 해커가 데이타베이스 명령을 통해 서버의 정보등을 빼앗아 가는건데요
보편적으로 위 질의를 통해, 인젝션 공격이 가능한지 불가능한지 알아볼수 있습니다
우선 아이디와 암호를 UID 와 UPASS로 받는다고 가정을 하구요
$sql = "select uid from members where uid='$uid' and upw = '$upass' ";
서버단에서는 보통 위 소스처럼 사용자 인증을 하게 됩니다
만약 $uid = "test" , $upass = "1231312" 라고 들어오면 저 $sql 은 아래처럼 변화됩니다
$sql = "select uid from members where uid='test' and upw = '1231312' ";
그래서 해당 아이디와 암호를 동시에 만족하는 레코드 가 있다면 참이 되는것이고
해당 아이디를 출력해주는거죠
만일 없다면? 출력되는것이 없으니, 아~ 암호 또는 아이디가 잘못되었다는걸 사용자에게 경고메세지를
통해 출력을 해줍니다
근데 sql 인젝션으로 공격을 할때 해당 아이디가 hong 이라는걸 알고 있다묜?
아이디에 hong , 암호부분에 ' or 1=1 -- 를 입력합니다
그러면 서버단은
아래처럼 해석을 하게 되죠
$uid = "hong" , $upass = "' or 1=1 --"
$sql = "select uid from members where uid='hong' and upw = '' or 1=1 --' ";
즉, 위 sql 명령은 아이디에 hong 이 있다면 무조건 참!
결국 암호를 몰라도 hong 으로 로그인이 가능하게 됩니다
결국 이렇게 명령문을 통하여, 나머지 필드의 모든 내용도 전부 해킹할 수 있는것입니다