본문 바로가기

Hacking & Security/Web

소스코드 점검기준 & 취약점 - 1

소스코드 점검기준 & 취약점 - 1


웹 취약점 및 시큐어코딩의 점검기준은 보안관련 기관에서 제공되는 정보를 바탕으로 국내의 환경에 따라 재정의하여 사용되고 있다.

국내의 경우, CWE에서 제공되는 점검기준 일부를 발췌하여 소프트웨어 보안약점 47개로 재활용되고 있다.

항목 보안 약점 개수
입력 데이터 검증 및 표현 프로그램 입력 값에 대한 부적절한 검증 등으로 인해 발생할 수 있는 보얀약점 15
보안 기능 인증, 접근제어, 권한 관리 등을 부적절하게 구현할 경우 발생할 수 있는 보안약점 16
시간 및 상태 멀티 프로세스 동작환경에서 부적절한 시간 및 상태관리로 발생할 수 있는 보안약점 2
에러 처리 불충분한 에러 처리로 중요 정가 에러 정보에 포함되어 발생할 수 있는 보안약점 3
코드 오류 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점 4
캡슐화 불충분한 캡슐화로 인가되지 않은 사용자에게 데이터가 노출될 수 있는 보안정책 5
API 오용 부저거절하거나, 보안에 취약한 API 사용으로 발생할 수 있는 보안 약점 2

1) SQL Injection


악의적인 외부 입력값에 의한 DB 쿼리구조가 변조되어 데이터 조회, 변조 및 삭제 등이 가능해지는 취약점을 의미한다.

..
string userName = ctx.getAuthenticatedUserName();
string query = "SELECT * FROM items WHERE owner = '" + userName + "' AND itemname = '" + ItemName.Text + "'";
..

위 예시의 2번라인을 보면 외부로 부터 값을 입력받는 userName 변수가 3번 라인의 WHERE 조건절에 직접적으로 사용되고 있기 때문에 이로 인하여 악의적인 userName ' OR 'a'='a구문을 통해 쿼리의 구조를 변조시킬 수 있다.

해당 취약점의 포인트는 외부로부터 입력받은 값이 저장되는 변수가 WHERE 조건절에 직접적으로 사용되는지에 대한 여부이다.

2) Command Injection


외부의 입력값 형태로 운영체제 명령어 등의 삽입 및 실행되는 취약점을 의미한다.

...
  public String coordinateTransformLatLonToUTM(String coordinates)
{
   String utmCoords = null;
   try {
       String latlonCoords = coordinates;
       Runtime rt = Runtime.getRuntime();
       Process exec = rt.exec("cmd.exe \C latlon2utm.exe -" + latlonCoords);
   }
}
...

2번 라인 메소드의 파라미터 coordinates로 위험 요소의 입력값이 유입될 수 있고,
입력받은 값은 6번 라인에서 latlonCoords에 초기화 된다.
그 이후, 8번 라인에서 cmd.exe에 사용될 것이다.

결국, 운영체제 명령어 실행
(ex : cmd.exe \C latlon2utm.exe & net user add test test)이 가능한 구조이다.

해당 취약점의 포인트는 Runtime.getRuntime().exec() 메소드에 외부 입력값이 삽입되어 실행되는지에 대한 여부이다.

Classic Buffer Overflow


버퍼(Buffer)는 데이터가 저장되는 공간을 의미하며 정의된 크기보다 큰 데이터를 저장하는 경우 오버플로우가 발생한다. 이를 통해 명령어 실행 등의 취약점을 야기한다.

대표적으로, scanf, gets, sprintf, strcpy 와 같은 함수들처럼 입력값에 대한 길이를 검증하지 않고 입력값을 그대로 사용하는 함수들이 BOF취약점을 가지고 있다.

...
char last_name[20];
printf("Enter your last name: ");
scanf("%s", last_name);
...

위 예시의 경우,

2번 라인에서 길이 20의 문자열 공간을 할당하였으나, 4번 라인에서 해당 변수에 앞서 할당 해놓은 길이 20이상의
문자열을 입력이 가능하기 때문에 BOF취약점이 존재한다.

해당 취약점의 포인트는 입력값을 검증하지 않는, 즉 BOF취약점이 존재하는 함수들의 사용여부이다.

Cross-Site Script


외부 입력값에 삽입되는 스크립트에 대한 필터링 혹은 변환과정 없이 그대로 스크립트를 출력에 사용하는 경우,

임의의 악의적인 자바스크립트 실행이 가능하며 이를 XSS취약점이라고 한다.

이를 통해 로그인 사용자가 가지고 있는 쿠키값 탈취 등으로 응용될 수 있다.

'''
$username = $_GET['username'];
echo '<div class="header"> Welcome, ' . $username. '</div>';
'''

2번 라인에서 GET방식을 통해 외부로 부터 전달받은 입력값을 username이라는 변수에 초기화 한 뒤,

이를 3번 라인에서 바로 출력한다.

Missing authentication for critical function


특정 권한 및 명령 실행시, 특정 사용자가 해당 권한을 가지고 있는지에 대한 검증 절차가 누락되어 발생하는 취약점이다.

아래의 예시에서도 creeateBankAccount메소드로 전달되는 파라미터인 accountNumber, accountType, accountSSN, balance를 검증하지 않고 은행계좌를 바로 생성하고 있다.

...
  public BankAccount createBankAccount(String AccountNumber, String accountType, String accountName, String accountSSN, double balance) {
   BankAccount account = new BankAccount();
   account.setAccountNumber(AccountNumber);
   account.setAccountType(AccountType);
   account.setAccountOwnerName(accountName);
   account.setAccountOwnerSSN(accountSSN);
   account.setBalance(balance);

   return account;
}
...

Use of Hard-coded Credentials


소스코드 내에 주요정보(계정 및 암호 등)가 하드코딩 된 취약점을 의미한다.

아래 예에서도 2번 라인에 Admin계정의 비밀번호 문자열이 하드코딩 되어있으며, 입력된 암호값과 비교하는 로직이 존재한다.

int VerifyAdmin(char *password) {
   if (strcmp(password, "y30j4eng!")) {
       printf("Incorrect Password");
       return 0;
   }
}
...

Missing Encryption of Sensitive Data


주요정보(계정 및 암호 등)를 암호화 과정 없이 저장하거나 전송함을 의미한다.

아래 예에서는 입력된 계정과 암호를 이용하여 쿠키값을 생성하고 있기에 쿠키 값 변조 등 이차적 취약점이 발생할 수 있다.

...
function persistLogin($username, $password) {
   $data = array("username" => $username, "password" => $password);
   setcooke("userdata", $data);
}
...

소켓 사용시에는 암호화를 위한 SSL 소켓 생성이 필요하다.

File Upload


실행 가능한 파일을 업로드하고 이를 실행하여 웹 서버 장악 위험이 존재하는 취약점을 의미한다.

아래 예의 경우, move_uploaded_file 메소드를 통해 업로드 파일을 저장하고 있으나 확장자 검사, 바이너리 값 검증 등의 검증 루틴이 존재하지 않기 때문에 임의의 실행파일을 업로드할 수 있는 취약점을 가지고 있다.

...
$target = "pictures/" . basename($_FILES['uploadedfile']['name']);

//move the uploaded file to the new location.
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target))
{
   echo "The picture has been successfully uploaded.";
}
...

CSRF(Cross-Site Request Forgery)


악의적 스크립트를 통해 일반 사용자가 공격자를 대신하여 특정행동을 수행하도록 하는 기법을 의미한다.

아래 예시에서는 사용자 정보를 업데이트 하는 페이지이지만, 외부에서 전달되는 값 firstname, lastname, email등 을 검증없이 업데이트하는 취약점을 가지고 있다.

아래 코드를 이용하여 타 사용자 정보를 업데이트하는 악의적 스크립트를 작성하여 특정 게시판에 등록한다. 이후 방문자가 해당 게시판을 클릭시 타 사용자의 정보가 변조될 수 있는 취약점을 가지게 될 것이다.

...
<form action="/url/profile.php" method="post">
   <input type="text" name="firstname"/>
   <input type="text" name="lastname"/>
   <br/>
   <input type="text" name="email"/>
   <input type="submit" name="submit" value="Update"/>
</form>

Directory Listing


외부 입력값 (ex: ../../../../../)을 통해 시스템에 접근하기 위한 경로를 삽입하여 내부 시스템 정보에 접근하는 행위를 의미한다.

아래의 경우 외부에서 입력된 경로는 /safe_dir로 시작하는 경우에만 입력경로를 제거하도록 구성되어있다.

그러나, 이런 경우 외부 입력값에 대한 검증 로직이 없기 때문에 /safe_dir/../../../../../../../dir/data.dat 패턴을 이용해 임의의 파일 /dir/data.dat에 접근하여 제거가 가능하다.

...
String path = getInputPath();
if (path.startsWith("/safe_dir/")){
   File f = new File(path);
   f.delete()
}
...

'Hacking & Security > Web' 카테고리의 다른 글

SQL Injection - 1  (0) 2019.12.30
소스코드 점검기준 & 취약점 - 2  (0) 2019.12.27
운영체제 명령 실행 취약점 진단  (1) 2019.03.03
웹 취약점 진단제거 가이드  (0) 2019.03.03
SQL Injection  (0) 2017.11.27