주의사항 : 이 포스팅은 개인 학습 및 교육적 목적으로 작성되었으며, 제공하는 정보를 악용하여 불법적인 행위를 하는 것은 엄격히 금지되어 있습니다. 웹 취약점 진단은 해당 웹사이트의 소유자의 명시적인 허가 없이는 수행해서는 안되며, 웹 취약점을 발견하였을 경우 즉시 해당 웹사이트의 소유자나 관리자에게 알려야 합니다.
SQL Injection
: 웹 보안 취약점을 이용해 SQL 쿼리문을 실행시켜서 공격자가 원하는 데이터베이스의 비정상적인 동작을 일으키는 공격이다. SQL Injection으로 DB에 조작된 명령을 실행할 수 있기 때문에 인증 우회 , 데이터 탈취 및 변조, 서버 장악 등이 가능하다.
- Normal SQL Injection : 무조건 참이 되게 하는 구문을 입력 후 이후 문장을 주석처리하여 원하는 SQL문을 실행시킨다.
- Error based SQL Injection : 논리적 에러가 있는 구문을 삽입하여 생성된 에러 메세지를 통해 DB정보를 알아낸다.
- UNION based SQL Injection : 얻고자 하는 릴레이션과 같은 컬럼 수를 가지는 임의의 릴레이션을 생성하여 UNION 연산 후 이후 문장은 주석처리하여 원하는 SQL문을 실행시킨다.
- SELECT문의 order by가 컬럼의 index번호로 정렬할 수 있으므로, 컬럼 갯수 보다 큰 수로 order by 정렬하면 에러가 발생한다.
- Boolean based Blind SQL Injection - 데이터베이스 메시지가 공격자에게 보이지 않을 때 사용한다. subString 함수 등을 이용하여 조건을 임의적으로 조작하면서 참인 경우(페이지가 뜨는 경우 등)만 간추려서 DB구조를 파악하거나 테이블명, 컬럼명 등을 특정하는 방법이다.
- Time based Blind SQL Injection - 응답의 결과가 항상 동일하여 해당 결과만으로 참과 거짓을 판별할 수 없는 경우에 사용한다. sleep() 함수 등을 이용해서 참이면 몇 초 뒤 페이지 출력, 거짓이면 바로 출력되는 식으로 참거짓을 판별한다.
점검 절차
- 게시판에서 게시물 번호 등에 해당하는 파라미터에 참/거짓 쿼리문을 입력하여 서로 다른 결과 페이지가 출력되는지 확인한다.
- 취약점이 존재하는 경우 참에 해당하는 쿼리문에서는 일반적으로 게시물 내용이 출력되고, 거짓에 해당하는 쿼리문에서는 게시물 내용이 안보이거나 에러가 발생한다.
- 참/거짓에 대한 결과가 보이지 않는 경우, 블라인드 인젝션을 이행하여 DB 버전, DB 이름, DB 사용자 정보 획득이 가능한지 확인한다.
보안 대책
- php에서 prepare 함수 등을 사용하여 사용자의 입력과 쿼리문을 분리하거나 Prepared Statement를 사용하여 사용자의 입력을 문자열로 인식하도록 한다.
- DB 계정에 최소한의 권한을 부여한다.
- 에러 발생 시 웹 서버 또는 WAS에서 통일된 에러 페이지를 출력하거나 아예 에러 페이지를 출력하지 않도록 설정하여 에러 정보와 DB 정보 노출을 방지한다.
출처
https://m.blog.naver.com/PostView.naver?blogId=lstarrlodyl&logNo=221837243294&navType=by
https://hanuscrypto.tistory.com/entry/SQL-Injection-Error-Based-SQL-Injection
https://blog.naver.com/shackerz/220449932926