Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

HW_chick hacker

웹 개발 및 SQL Injection - SQL Injection (2) 본문

Activity/Hawkis

웹 개발 및 SQL Injection - SQL Injection (2)

{{HW}} 2023. 2. 4. 14:41

- Node.js를 이용해 웹 페이지 제작 후 SQL Injection을 이용한 테이블 삭제

1. Node.JS + MySQL을 이용하여 간단한 웹 페이지 제작(시큐어코딩 x)

2. form, input, button 태그 활용

3. 웹서버 오픈을 위한 Express 모듈 활용 및 Mysql DB 연동

4. 다중쿼리 설정

5. SQL Injection을 활용한 DROP TABLE 사용

 


1. SQL Injection이란? (기초)

사용자의 입력값이 서버측에서 코드로 실행되는 '코드 인젝션'  공격 기법 중 하나이며, 서버의 데이터베이스를 대상으로 하는 공격이다.

 

공격의 핵심은 클라이언트 측에서 SQL 쿼리에 신뢰할 수 없는 데이터가 입력되었을 때, 데이터가 쿼리 로직의 일부로 해석되어 DB에서 실행될 때 발생한다.

 

 

admin' or '1' = '1

-> 공격자는 로그인 입력칸에 기본 SQL 공격 구문을 입력을 합니다.

SELECT * FROM users WHERE id='admin' or '1'='1' AND password='anything';

-> 패스워드에 anything을 입력했다고 가정했을 때 공격자가 입력한 아이디와 패스워드의 값은 HTTP 요청을 통해 서버로 전달됩니다. 

-> 이 SQL 쿼리는 웹 애플리케이션에 admin이라는 사용자 계정이 존재한다면 패스워드가 일치하는지 여부와는 상관없이 admin 계정으로 로그인하게 됩니다. 바로 SQL 쿼리의 논리 연산을 조작하여 무조건 참(TRUE)이 되었기 때문입니다.

 

보시는 바와 같이 공격자가 조작한 SQL 쿼리의 WHERE절에는 OR, AND 두 개의 논리 연산자가 있고, 각 논리 연산자의 좌우로 조건식이 배치되어 다음과 같은 총 3개의 조건식이 있습니다. 

구분 내용 조건식의 참/거짓 여부
조건식1 id='admin' TRUE       (admin 계정이 있다고 가정하므로 '참'입니다.)
조건식2 '1'='1' TRUE       (누가 봐도 '참'입니다.)
조건식3 password='anything' FALSE     (admin 계정의 틀린 패스워드이므로 '거짓'입니다.)

-> AND 연산자의 우선순위가 OR 연산자보다 높이 있습니다.

연산자 우선순위에 따라 조건식2와 조건식3의 AND 연산이 먼저 수행되고, 그 결과와 조건식1이 OR 연산을 수행하면 WHERE절 논리 연산의 결과는 최종적으로 TRUE가 됩니다. (admin 계정 로그인 성공)

 

 

- 공격 목적

SQL 구문에 추가 절을 삽입하게 되면 쿼리의 의미가 변경되고 의도하지 않은 데이터의 유출, 변조가 가능하다.

 

1. 정보 유출(Information Leakage)

2. 저장된 데이터 유출 및 조작(Disclosure & Manipulation of stored Data)

3. 원격 코드 실행(Remote Code Excution)
    일부 데이터베이스의 경우 확장 프로시저를 이용하여 원격으로 시스템 명령의 실행이 가능하다. 시스템 명령의 실행은 원격 자원 접근 및 데이터 유출, 삭제가 가능하다.

4. 인증 우회(Bypassing authorisation controls)
    공격의 대표적인 경우로 로그인 폼 등에서 발생한다. 상위 권한을 가진 사용자의 권한으로 인증 절차를 우회하여 로그인 정보 없이 로그인할 수 있다.

 

2. 다중쿼리 설정

쿼리문을 한번에 여러 쿼리문을 실행하기 위해 다중쿼리를 사용한다.

 

mysql 공식 문서에 따르면, 다중 선언은 보안 문제로 disalbed 되어 있으므로, (SQL Injection 공격이 발생할수도 있다) 사용하려면 다음과 같이 수정을 하였다.

 

SELECT * FROM mydb.customers WHERE name='${id}';

ex) 예시로 SELECT 구문에서 id값을 입력할 때  ';을 사용하여 쿼리문을 하나 만들고 drop table mydb.customers; SQL문을 삽입하면 두개의 쿼리문을 사용 할 수 있다고 짐작할수 있다.

 

- index.js

var con = mysql.createConnection({ 
    host: "127.0.0.1",
    port: "3306",
    user: "root",
    password: "1234",
    database: "mydb",
    multipleStatements: true, // 다중쿼리 허용
});

-> 다중 쿼리를 'true'로 허용 하였다.

 

3. SQL Injection 실습 - Insert문

만들어 져 있는 테이블에 'drop table'기능을 사용하여 쿼리문을 실행 시켜 보겠다.

 

'); drop table my.db.customer;#

-> 주소에 탈출 시키는 문자와 'drop table'을 이용하여 테이블을 삭제하고 #(주석)을 통하여 뒤에 있는 문자란을 무효시킨다.

 

insert into mydb.customers (name, address) VALUES ('1', ''); drop table my.db.customer;#')

-> 기존 insert 구문을 탈출 시키고 다른 SQL문을 삽입하여 데이터를 날려보았다.

 

4. SQL Injection 실습 - Serect문

Serect 구문 공격을 위해 다른 테이블을 생성해 보았다.

'; drop table mydb.customers;#

-> insert구문처럼 serect구문을 탈출 시켜 'drop table'을 하였다.

SELECT * FROM mydb.customers WHERE name='1' AND address = ''; drop table mydb.customers;#';

-> 기존 serect 구문을 탈출 시키고 다른 SQL문을 삽입하여 데이터를 날려보았다.

-> insert문과 다르게 ()괄호가 있고 없고의 차이이다.

5. 마무리 및 검토

- 개발 영역

1) 웹 페이지 화면을 좀 더 많은 기능을 구현하고 싶음

2) Inert 구문과 Serect 구문을 함께 이용하여 편하게 데이터가 등록, 확인, 수정, 삭제 등 게시판 구현을 하고 싶음.

3) JS파일을 하나로 만들어 보안문제에 취약하여 각 영역을 더 나눠 견고하게 만들 필요가 있음.

 

- SQL 인젝션 영역

1) 좀 더 많은 종류의 SQL 인젝션 공격을 소개하고 실습해 보고 싶음.

2) 공격으로 인해 내가 예방하고 대처할수 있는 방법인지 생각해 볼 필요가 있다고 생각하게 됌.

'Activity > Hawkis' 카테고리의 다른 글

Plz Recovery - CTF문제  (0) 2023.07.05
babyforms, babysheet - CTF문제  (0) 2023.07.05
과유불급 문제 - CTF문제  (0) 2023.06.07
웹 개발 및 SQL Injection - 개발 및 DB연동 (1)  (1) 2023.02.03
어셈블리어 - 이름 출력  (0) 2023.01.08