운영체제 명령 실행이란?
적절한 검증절차를 거치지 않은 사용자 입력값이 운영체제 명령어의 일부 또는 전부로 구성되어 실행 되는 경우, 의도하지 않은 시스템 명령어가 실행되어 부적절하게 권한이 변경되거나 시스템 동작 및 운영에 악영향을 미칠 수 있다. 일반적으로 명령어 라인의 파라미터나 스트림 입력 등 외부 입력을 사용하여 시스템 명령어를 생성하는 프로그램이 많이 있다. 하지만 이러한 경우 외부 입력 문자열은 신뢰할 수 없기 때문에 적절한 처리를 해주지 않으면, 공격자가 원하는 명령어 실행이 가능하게 된다.
운영체제 명령 실행 점검
점검 내용 | 웹 사이트 내 운영체제 명령 실행 취약점 존재 여부 점검 |
점검 목적 | 적절한 검증절차를 거치지 않은 사용자 입력 값에 의해 의도하지 않은 시스템 명령어가 실행되는 것을 방지하기 위함 |
점검 대상 | 웹 애플리케이션 소스코드, 웹 방화벽 |
1. 에러 페이지 또는 HTTP 응답 헤더에 노출되는 웹 서버 버전 정보를 수집하여 운영체제 명령 실행 관련 알려진 취약점 검색
개발자 도구 > Network에 들어가서 응답 헤더에서 서버 버전을 확인했다.
해당 서버는 Apache 2.4.52 버전을 사용하고 있다.
다음은 Apache Struts 2 RCE 취약점 참고사이트이다.
https://cwiki.apache.org/confluence/display/WW/Security+Bulletins
Security Bulletins - Apache Struts 2 Wiki - Apache Software Foundation
Security impact levels The Apache Struts Security Team rates the impact of each security flaw that affects Struts. We've chosen a rating scale quite similar to those used by other Apache projects in order to be consistent. Basically the goal of the rating
cwiki.apache.org
CVE와 NVD에서도 공개적으로 알려진 취약점을 검색할 수 있다.
http://cve.mitre.org/cve/search_cve_list.html
CVE - Search CVE List
Search CVE List You can search the CVE List for a CVE Record if the CVE ID is known. To search by keyword, use a specific term or multiple keywords separated by a space. Your results will be the relevant CVE Records. View the search tips. Attention: CV
cve.mitre.org
https://nvd.nist.gov/vuln/search
NVD - Search and Statistics
Search Vulnerability Database Try a product name, vendor name, CVE name, or an OVAL query. NOTE: Only vulnerabilities that match ALL keywords will be returned, Linux kernel vulnerabilities are categorized separately from vulnerabilities in specific Linux d
nvd.nist.gov
2. 웹 애플리케이션에 전달되는 파라미터 값에 공개적으로 알려진 운영체제 명령 실행 코드 삽입 후 명령어가 실행되는지 확인
http://localhost/gnuboard/bbs/board.php?bo_table=test_table&wr_id=1write.action?redirecthttps://www.kisa.or.kr
코드를 삽입했으나 효과가 없었다.
효과가 있었다면 kisa 페이지로 넘어갔을 것이다.
보안 설정 방법
- 웹 방화벽에 모든 사용자 입력 값을 대상으로 악용될 수 있는 특수문자, 특수 구문 등을 필터링 할 수 있도록 규칙을 적용한다.
- 애플리케이션은 운영체제로부터 명령어를 직접적으로 호출하지 않도록 구현한다.
- 명령어를 직접 호출하는 것이 필요한 경우에는, 데이터가 OS의 명령어 해석기에 전달되기 전에 입력 값을 검증하고 확인하도록 구현한다.
- 입력 값에 대한 파라미터 데이터의 "&", "|", ";", "`" 문자에 대한 필터링 처리를 한다.
- 웹 서버 및 웹 애플리케이션 서버는 공개적으로 알려진 취약점이 제거된 상위 버전으로 업데이트 해야 한다.
- 클라이언트에서 전송되는 요청(Request) 값에 대한 엄격한 필터링 적용 및 OGNL (Object Graph Navigation Language) 표현식 사용을 금지하여 원격에서 임의의 명령어가 실행되지 않도록 구현해야 한다.
- KISA 인터넷 보호나&KrCERT 보안공지를 참고하는 것이 좋다.
“&”, “|”, “`” 문자 설명
문자 | 설명 |
& | 윈도우 명령어 해석기에서 첫 번째 명령이 성공했을 경우만 두 번째 명령어를 실행 |
| | 첫 번째 명령어가 성공하는지에 상관없이 두 번째 명령어를 실행 |
` | 쉘 해석기가 명령어를 해석하다 역 작은따옴표(`) 내에 포함된 명령어를 만나면 기존 명령어를 계속 실행하기 전에 역 작은따옴표로 둘러싸인 명령어를 먼저 실행 (예) `ls –al` |
코드 예제
아래 코드는 외부입력값을 검증하지 않고 그대로 명령어로 실행하기 때문에 공격자의 입력에 따라 의도하지 않은 명령어가 실행될 수 있다.
String date = request.getParameter("date");
String command = new String("cmd.exe /c backuplog.bat");
Runtime.getRuntime().exec(command + date);
운영체제 명령어 실행 시에는 아래와 같이 외부에서 들어오는 값에 의하여 멀티라인을 지원하는 특수문자(| ; & :)나 파일 리다이렉트 특수문자(> >>)등을 제거하여 원하지 않은 운영체제 명령어가 실행될 수 없도록 필터링을 수행한다.
String date = request.getParameter("date");
String command = new String("cmd.exe /c backuplog.bat");
//외부로부터 입력 받은 값을 필터링으로 우회문자를 제거하여 사용한다.
date = date.replaceAll("|","");
date = date.replaceAll(";","");
date = date.replaceAll("&","");
date = date.replaceAll(":","");
date = date.replaceAll(">",""); Runtime.getRuntime().exec(command + date);