본문 바로가기

SWLUG/CTF

[WebHack][WebGoat] SQL Injection (intro)

 

[WebHack][WebGoat] 환경세팅 & Hijack a session

WebGoat 환경 세팅  [WebGoat] 실습 환경 종료 후 컨테이너 재실행WebGoat를 도커 컨테이너에 올려 실습을 진행한 후 실습이 마무리 되어 종료하고 다시 실행할 경우에는 어떻게 다시 WebGoat 실습 환경

keemnh.tistory.com

※ 해당 방법으로 WebGoat에 접속 후, 아래와 같은 페이지에서 실습을 진행하였다.

 

 

 

 

 

SQL 종류

DML (Data Manipulation Language) - 데이터 조작어; 데이터 조작과 관련된 문법

a. 데이터 조회 - Select 
b. 데이터 추가 - Insert
c. 데이터 수정 - Update
d. 데이터 삭제 - Delete


DDL (Data Definition Language) - 데이터 정의어; 데이터 구조와 관련된 문법

a. 데이터 구조(데이터베이스, 테이블 등)를 생성 - Create
b. 구조 수정 - Alter
c. 구조 삭제 - Drop
d. 테이블의 데이터를 삭제(특정 데이터 삭제 불가, 전체 행 삭제) - Truncate
Delete : 데이터 삭제 후에도 데이블이 점유하던 공간을 그대로 유지
Truncate :  점유하던 공간 모두 반납


DCL (Data Control Language) - 데이터 제어와 관련된 문법

a. 사용자에게 권한 부여 - Grant
b. 권한 해제 - Revoke
c. 쿼리로 데이터베이스에서 작업한 결과를 확정해 물리적 디스크로 저장하는 Commit
d. Commit 전에 쿼리를 통해 작업한 결과를 원해 상태로 복원 - Rollback

 

 

9번

 

- Concatenating Strings (문자열을 이어붙이는) 형태로 실행하여 문자열을 이용한 공격

 


: 싱글쿼터를 임의로 입력하여 개발자가 설계한 문자열의 범위에서 벗어날 수 있음

or
: or이 추가된 부분을 기준으로 앞 또는 뒤의 조건 중 하나라도 참이 되는 조건이 있다면 그 조건으로 쿼리가 실행

 


'1' = '1 
: 위의 값을 추가하면 쿼리 끝에 남아있는 원래 개발자가 사용하려던 싱글쿼터가 붙으면서 '1'='1'이라는 조건이 됨
1은 1과 같다는 조건은 모든 행에 참이 되는 조건이므로 저장된 user를 모두 추출할 수 있음

 

 

 

10번

 

- 숫자의 범위를 벗어나 테이블에 존재하는 모든 user를 추출

 

[Login_Count]에 숫자 형태의 SQL Injection이 가능한지 확인하기 위해 공백과 특수문자가 포함된 '123 #' 값을 입력란에 입력한 후 [Get Account Info] 버튼을 클릭한 결과, 숫자 형태인지 검증하고 있어 공백 사용이  불가능함

 

or 연산자를 사용하여, 앞의 조건(userid = 123)이 겆시일 경우에도 뒤의 조건(1=1)이 참이 되어 쿼리가 실행되도록 함.
1=1 은 항상 참이므로, 해당 조건이 만족되어 모든 사용자 정보가 반환됨
원래는 특정 사용자 정보만 반환되어야 하지만, SQL Injection을 통해 모든 사용자 정보를 추출하게 됨

Login_Count = 123

User_id = 123 or 1 = 1

 

 

 

11번

 

 

우선 내 이름과 TAN을 입력하면 아래처럼 계정을 확인할 수 있다.

 

나에 대한 정보는 나오지만 전체 정보를 원하기 때문에 다시 시도하라고 한다.

 

 

쿼리문은 아마도 이런 형태일 것이다.

SELECT * FROM USERS WHERE last_name="" AND auth_tan=""

 

 

employee name은 별로 중요하지 않기 때문에 아무 문자를 입력하고

TAN에 String Injection을 한다.

TAN이 싱글쿼터로 감싸져 있으므로, 이를 해결하기 위해 처음에는 싱글쿼터를 닫아주고, 마지막에는 자동으로 닫히도록 싱글쿼터를 열어주면 된다.

 

 

 

 

12번

 

토비와 밥이 얼마나 버는지 알기 위해 전체 임금 조회를 해야한다.

근데 쿼리문이 주어지지 않아 Select절임을 예상하고 풀어야 한다.

Select * from user where id = '' and pw = ''

 

where 절을 true로 만드는 numeric injection을 사용하여 풀어준다.

 

* numeric injection

: 사용자가 입력하는 데이터에 숫자형 값을 통해 의도하지 않은 SQL 쿼리를 삽입하여 데이터베이스를 조작하거나 해킹하는 공격 방식. 일반적으로 애플리케이션에서 입력 값으로 숫자를 받아서 SQL 쿼리를 실행하는 경우에, 잘못된 입력 검증으로 인해 공격자가 그 입력 값에 조작된 SQL 코드를 포함시켜 쿼리의 실행 결과를 바꾸는 것이 목적이다.

 

 

 

이를 변경하기 위해서는 정보 수정을 update 해야한다.

UPDATE [테이블명] SET [컬럼명] = [원하는 컬럼값] WHERE [조건];

 

원하는 UPDATE절을 실행시키려면 Query Chaining을 이용해야 한다. 

Query Chaining은 쿼리가 끝나는 부분에서 세미콜론을 써서 뒤에 원하는 쿼리문을 하나 더 넣어주는 것이다.

 

 Employee Name에 다음과 같이 입력하고 TAN에는 아무렇게 입력한다.

싱글쿼터로 열려있는걸 1'로 닫아주고 문장을 끝내주는 ; 세미콜론을 쓴 후 UPDATE절을 쓴다. 그리고 마지막에는 주석처리를 해서 뒤에 오는 조건이었던 auth_tan은 무시가 되고, 결과적으로 필요없는 값이 되기 때문에 웹페이지 상에서 TAN 칸에는 아무거나 넣어줘도 된다.

1'; UPDATE EMPLOYEES SET SALARY = 90000 WHERE LAST_NAME = 'Smith';--

 

 

 

 

13번

 

 access_log 테이블을 delete 해야한다.

 

특정 행이 아니라 테이블을 삭제해야 하므로 DROP 절을 사용한다.

 

*DROP

데이터베이스 객체(테이블, 데이터베이스 등)를 완전히 삭제하는 명령어이다. 테이블을 삭제하면 해당 테이블의 모든 데이터와 구조 자체가 제거된다.

DROP TABLE table_name;

 

 

아래와 같이 입력하면 지워진다!

 

1' drop table access_log--

 

 

  • 1':
    • SQL 쿼리의 값 부분에 악의적인 입력을 주입하려고 한다.
    • 여기서 '(싱글 쿼트)는 일반적으로 SQL 쿼리에서 문자열을 닫는 데 사용된다. 이 예에서는 정상적인 SQL 쿼리 문자열을 의도적으로 종료하여 그 다음에 임의의 SQL 코드를 삽입하려는 것이다.
  • drop table access_log:
    • DROP TABLE 명령어는 테이블을 삭제하는 SQL 명령어이다.
  • -- (SQL 주석):
    • --는 SQL에서 주석을 시작하는 기호로, 그 뒤에 나오는 모든 내용은 무시된다.
    • 여기서 --는 원래 쿼리의 나머지 부분을 무시하게 만든다. 

 

'SWLUG > CTF' 카테고리의 다른 글

[CTF/ Dreamhack] sql injection bypass WAF  (0) 2024.10.30
[CTF/ Dreamhack] weblog-1  (0) 2024.10.30
[CTF/ Dreamhack] error based sql injection  (6) 2024.09.30
[CTF/ Dreamhack] blind sql injection advanced  (0) 2024.09.30
[CTF/ Dreamhack] CProxy: Inject  (0) 2024.09.25