해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법 대부분 클라이언트가 입력한 데이터를 제대로 필터링 하지 못하는 경우에 발생한다.

자격증 번호를 조회할수 있는 시스템이 있다고하자 기본적인 sql진행은 클라이언트가 무엇인가를 '클릭' 하게되고 그것이 서버로 서버에선 db로 요청이 가게된다. db에선 값을 확인하후 존재한다면 출력 여기서 이름이 blackhat이라는 클라이언트가 자신의 blackhat을 조회해야 하는데 sql 구문을 변경하여 anjinma라는 클라이언트의 자격증 번호를 조회한다.
예를들어 url이 http://license12345.com/mysearch?=anjinma가 된다고 가정하자. 그럼 공격자의 조회는 http://license12345.com/mysearch?=blackhat 이렇게 된다. 여기서 공격자는 가장 뒤에있는 이름을 변경해야하는데 그냥 변경하는것으론 로그인된 자신과 다르기 때문에 웹서버에서 인정하지 않는다 그러므로 특정 쿼리문 'anjinma' or '1'='1' 이렇게 넣게되면 1과 1은 같다는 참이므로 or 진행으로 해당 구문은 참이되어 결과를 출력
논리적 에러를 이용한 SQl 인젝션 앞서 예를든 기법
SELECT * FROM client WHERE name='anjinma' and password='12345';
SELECT * FROM client WHERE name='anjinma' and password=' or '1'='1'
SQL UNION이란 여러개의 SQL문을 합쳐 하나의 SQL문으로 만들어주는 방법이다. UNION과 UNION ALL로 나뉘는데 중복 값을 제외하고 안하고의 차이다.
SELECT name from classa
UNION
SELECT name from classb; 하게되면 A와 클래스 B이름들이 합쳐져서 출력(중복 제외) UNION으로 합쳐지는 두 테이블은 컬럼 갯수가 일치해야만 한다.
UNION 명령어를 이용한 SQL Injection
[외부 입력]
ID: 'test' UNION SELECT 1, 1 --
PW: anything
실행 쿼리대로 하면 users 테이블에 등록된 ID와 PW 목록을 전부 조회할 수 있게 된다.
boolean - boolean based blind sql inection
평범한 sql 삽입과 같이 원하는 데이터를 가져올 쿼리를 삽입하는 기술 이것은 웹에서 sql에 취약하나, db 메시지가 공격자에게 보이지 않을때 사용 하지만 평범한 sql삽입과 다른점은 평범한 sql 삽입은 쿼리를 삽입하여 원하는 데이터를 한번에 얻어내는데 반해 blind 삽입은 쿼리가 참, 거짓일 때의 서버의 반응만으로 데이터를 얻어내는 기술이다. 즉, 쿼리를 삽입하였을 때 쿼리의 참과 거짓에 대한 반응을 구분할 수 있을때 사용한다.

time - time based sql injection
어떤 경우에는 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할수 없는경우 시간을 지연시키는 쿼리를 주입하여 응답 시간의 차이로 참과 거짓여부 판별
blind 인젝션 기법은 쿼리가 참, 거짓일 때 서버의 반응 만으로 데이터를 얻어낼수 있는 기법으로 여러 조건에 대한 과정을 거쳐야 정보를 얻을수 있으므로 자동화 도구 등을 이용하는게 일반적이다.

출처:https://velog.io/@ragnarok_code/DataBase-SQL-%EC%9D%B8%EC%A0%9D%EC%85%98%EC%9D%B4%EB%9E%80
https://github.com/Songwonseok/CS-Study/blob/main/Database/SQL%20Injection.md!