SQL은 *관계형 데이터 베이스에서 데이터를 관리하고 처리하기 위한 프로그래밍 언어이다.
즉, 데이터베이스에서 저장된 정보를 검색, 삽입, 수정, 삭제하는 데 사용되는 언어이다.
*관계형 데이터 베이스: 데이터가 열과 행의 테이블에 데이터를 저장하는 데이터베이스
1. SELECT - 데이터를 조회할 때
SELET가져올 열을 지정(열_이름, *(모든 열을 가져올때))2. FROM - DB 지정
FROM데이터를 가져올 테이블 이름 지정3. WHERE - 조건식 지정
WHERE조건을 지정해서 필터링4. ORDER BY - 결과 정렬
5. DISTINCT - 중복 제거
ORDER BYASC(오름차순), DESC(내림차순)6. LIMIT - 결과 개수 제한
7. OFFSET - 건너뛰기
SELECT DISTINCT 열1, 열2, ... FROM 테이블명 WHERE 조건 ORDER BY 열 [ASC|DESC] LIMIT 개수 OFFSET 시작위치;8. INSERT - 데이터 추가
INSERT새 데이터를 테이블에 추가9. UNION - 합치기
UNIONSELECT 결과들을 이어붙임
SQL Injection은 사용자 입력값을 검증하지 않는 경우 설계된 쿼리문에 의도하지 않은 쿼리를 임의로 삽입할 수 있는 공격이다. 공격자는 쿼리를 악의적으로 주입하여 데이터베이스의 데이터를 무단으로 탈취할 수 있다.
DVWA 웹 페이지에서 SQL Injection에 들어간다. (보안 레벨은 low로!!)

User ID: 에 1,2,3,4,5를 넣었을때 지정된 First name과 Surname이 나온다.
이때 SQL Injection의 쿼리를 분석해보았을때

전송된 SQL 구문은 다음과 같다.
SELECT first_name,last_name FROM users WHERE user_id = '$id';
이때 $은 PHP 변수 기호이다. 사용자가 URL로 보낸 값(?id=1)을 받아오는 PHP변수이다. (아무런 검증 조치 없이 저장됨)
따라서 WHERE구문을 우회할 수 있는 or 연산자와 언제나 참이되는 값을 입력하여 전송한 결과는 데이터베이스에 저장된 모든 계정의 first_name과 last_name이 출력되는 모습을 확인할 수 있다. (ex -> ' or 1=1-- 입력 ->전송된 SQL구문 = SELECT first_name,last_name FROM users WHERE user_id = '' or 1=1 -- ;

이러한 방식으로 로그인 폼을 우회하여 접속을 할 경우 가장 첫 번째로 생성된 계정의 권한으로 로그인 되는데 보통 관리자 권한의 계정인 경우가 많아 공격에 많이 활용된다고 한다.
ORDER BY를 활용하여 원본 SELECT가 검색하는 열의 개수를 알아내는 공격이다. 해당 공격을 수행하는 이유는 뒤에 나올 UNION을 이용한 공격을 수행하기 위해 우선 열의 개수를 알아내야하기 때문이다.

1' ORDER BY 1 -- 와 1' ORDER BY 2 -- 의 first_name과 last_name의 출력은 잘 나온다. 하지만 1' ORDER BY 3 #을 했을때는

위 내용 처럼 3열을 찾을 수 없다며 에러가 뜬다. 즉, SELECT문이 검색하는 열의 개수는 2개인 것을 확인할 수 있다.
ORDER BY를 활용하여 알아낸 열의 개수를 기반으로 UNION을 작성하고 database()함수와 version(), user()을 입력하여 DB이름, DBMS 정보, 사용자를 조회하는 공격을 수행할 수 있다.


null은 출력 안 되는 자리, database()는 출력될 자리로 선택

다른분들 포스팅 참고하셔서 SQLi 공격유형에 대한 정보도 습득하시면 좋을 것 같습니다. 깔끔하게 정리 잘 하셨네요 너무 쉬우면 레벨을 low에서 medium으로 조정하셔도 됩니다