2023-01-04 · 2분
[소전] 모의해킹
' and db\_name 1 -- -
2021-06-03 · 4분
이 글은 작성된 지 2년이 넘었어요. 내용이 오래됐을 수 있어요.
SQL Injection이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입해 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위입니다.
논리적 에러를 이용한 SQL Injection

위 사진에서 보이는 쿼리문은 일반적으로 로그인 시 많이 사용되는 SQL 구문입니다. 해당 구문에서 입력값에 대한 검증이 없을 때 악의적인 의도로 임의의 SQL 구문을 주입하였습니다. **' or 1=1--**로 WHERE 절에 있는 싱글 쿼터를 닫기 위한 싱글 쿼터와 or 1=1라는 구문을 이용하여 WHERE 절을 모두 참으로 만들고, -- 를 넣어줘 뒤의 구문을 주석 처리해주고 있습니다.
간단한 방법이지만 이 방법이 성공하게 되면 가장 먼저 만들어진 계정으로 로그인에 성공하게 됩니다. 대부분 가장 먼저 만들어진 계정은 관리자 계정이기 때문에 관리자 계정으로 로그인할 수 있게 됩니다.

Union 명령어를 이용한 SQL Injection
2개 이상의 쿼리를 요청하여 결과를 얻는 UNION이라는 SQL 연산자를 이용한 SQL Injection 공격을 말하며 공격자는 이 연산자를 이용하여 원래의 요청에 한 개의 추가 쿼리를 삽입하여 정보를 얻어냅니다.
UNION 연산자를 사용하여 둘 이상의 SELECT 문 결과를 단일 결과 집합을 결합할 수 있습니다.
단 UNION 연산자를 사용하여 결합된 결과 집합은 모두 같은 구조를 가져야 합니다.

위에 보이는 쿼리문은 Board라는 테이블에서 게시글을 검색하는 쿼리문이다. 입력값을 title과 contents 칼럼의 데이 터랑을 비교한 뒤 비슷한 글자가 있는 게시글을 출력합니다. 여기서 입력값으로 Union 키워드와 함께 맞춰서 SELECT 구문을 넣어주게 되면 두 쿼리문이 합쳐져 하나의 테이블로 보이게 됩니다. 위와 같은 인젝션이 성공할 경우 id와 password를 요청하는 쿼리문이기에 사용자의 개인정보가 게시글과 함께 화면에 보이게 될 것입니다.
Blind SQL Injection은 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용합니다. 로그인 폼에서 SQL Injection이 가능할 때 서버가 응답하는 로그인 성공, 실패 메시지를 통하여 DB의 테이블 정보를 추출해 낼 수 있습니다.

위 주입 문은 데이터베이스의 테이블 명을 알아내는 방법입니다. 인젝션이 가능한 로그인 폼을 통하여 악의 적인 사용자는 임의로 가입한 abc123이라는 아이디와 함께 abc123’ and ASCII(SUBSTR(SELECT name FROM information_schema.tables WHERE table_type=‘base table’ limit 0,1) 1,1)) > 100 --이라는 구문을 주입했습니다.
해당 구문은 MySQL에서 테이블 명을 조회하는 구문으로 limit 키워드를 통해 하나의 테이블만 조회하고 SUBSTR 함수로 첫 글자만, 마지막으로 ASCII를 통해서 아스키코드로 변환해 줍니다.
Time Based SQL Injection도 마찬가지로 서버로부터 특정한 응답 대신 참 거짓의 응답을 통해 데이터베이스의 정보를 유출하는 기법입니다.

MySQL에서 Sleep() 함수를 이용하여 5초 후에 쿼리 결과를 얻도록 공격 문자열을 삽입했을 때 만약 5초 후 쿼리 결과가 화면에 출력된다면 취약점이 있다고 판단할 수 있습니다.
저장 프로시저는 운영상 편의를 위해 만들어둔 SQL 집합 형태이며, 특히 MS SQL에서 사용할 수 있는 xp_cmdshell은 윈도 명령어인 netstat -an을 삽입하고 있다.

GET, POST 요청 필드, HTTP 헤더 값, 쿠키값 등에 특수문자(싱글 쿼트(') 혹은 세미콜론(;)) 삽입 시, SQL 에러가 발생된다면 취약 점이 있다고 판단할 수 있다.
<table style="border-collapse: collapse; width: 100%; height: 120px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: center; height: 20px;"><b>문자열</b></td><td style="width: 50%; text-align: center; height: 20px;"><b>설명</b></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">'</td><td style="width: 50%; text-align: left; height: 20px;">문자 데이터 구분 기호</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">;</td><td style="width: 50%; text-align: left; height: 20px;">쿼리 구분 기호</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">--, #</td><td style="width: 50%; text-align: left; height: 20px;">해당 라인 주석 구분 기호<br><span style="color: #1b711d;">-- : Oracle, MSSQL</span><br><span style="color: #1b711d;"># MYSQL</span></td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">/* /</td><td style="width: 50%; text-align: left; height: 20px;">/ 와 */ 사이 구문 주석</td></tr><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">||</td><td style="width: 50%; text-align: left; height: 20px;">문자 연결 <span style="color: #1b711d;">(Oracle만 해당)</span></td></tr></tbody></table>
참고 :
https://noirstar.tistory.com/guestbook
https://kk-7790.tistory.com/74
https://m.blog.naver.com/koromoon/120172851234
https://tar-cvzf-studybackup-tar-gz.tistory.com/84
원문: tistory — 2021-06-03 발행, 이 블로그로 이전됨.
…