ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2주차 수업 정리
    웹 해킹 2024. 4. 28. 17:29

    복습 시간에 말씀해 주신 것들 중에 몰랐던 것

     

    1. docker 컨테이너 삭제할 때 id의 앞 두글자만 입력해도 삭제 됨.

    2. header()함수로 http 헤더에 특정 값을 설정 가능. 예를 들면 location도 지정할 수 있는데, header("location:login.php");로 설정해서 특정 path로 이동할수 있게 할 수 있음. 그리고 만약 내가 로그인이 되었는지 안되었는지 확인한 후에 만약 되지 않았다면 특정 path로 이동한다고 할때, header함수 뒤에 exit;을 써서 본 코드가 노출되지 않도록 해야한다. Burp suite으로 확인해본 결과, exit을 쓰지 않았을 때는 로그인이 되지 않음에도 불구하고 코드가 노출되어 보안상 위험이 있었다. 실제로 모의해킹에 이런 취약점이 많이 발견된다고 한다.

    3. 개발 하다 오타때문에 에러가 날 때가 있다. 어디에서 잘못되었는지 확인하기 어렵기 때문에 php를 이용할 때는 error출력이라는 기능이 있기에 그것을 활용하는 방법이 있기도 하다. 다른 방법으로는 echo와 같은 함수로 코드 중간중간에 출력을 해서 어디까지는 실행이 제대로 되는지 확인해서 디버깅 하는 방법이 있다.

     

    2주차 주제 : Database

     

    데이터베이스는 데이터를 관리하는 역할을 한다. 그리고 WAS(Web Application Server)와 대화를 하면서 필요에 따라 데이터를 출력, 저장, 수정, 삭제를 할 수 있다. 데이터 베이스 안에는 table이라는 개념이 있다. 한 엑셀 파일에 sheet가 여러개 있을 수 있듯이, 한 데이터 베이스 안에도 여러 table이 있을 수 있다. 그리고 그 table을 나누는 기준은 관련된 개념이다. 만약 내가 관리하는 사이트의 데이터베이스라고 한다면, 회원정보 table이 있을 수 있고, 또한 게시물 table, 차단된 이용자 table이 있을 수 있다. 이렇게 여러 table이 모여서 한 데이터 베이스가 된다.

    그렇다면 table은 어떻게 이루어져 있을까? table은 하나의 표라고 생각할 수 있다. 

     

    column과 row라는 개념이 있는데 먼저 column을 알아보겠다. column은 '열', '세로 데이터', '데이터 종류', '카테고리'라고 생각하면 된다. 표에 보이는 idx, name, score, pass가 column에 해당한다. 이 column은 데이터를 관리하기 위해서 특정한 값을 선택할 때 사용된다. 만약 내가 name이 필요하면 name column을 특정 방법으로 이용하면 된다.

     

    그 다음 row는 '행', '가로 데이터'라고 할 수 있다. 1, shadow, 80, 1234가 한개의 row 라고 생각하면 된다.

     

     


    실습

     

    제공해주신 docker에서 GUI로 db를 만들기 위해서는 ip주소/phpmyadmin이라고 입력하면 된다. 그러면 GUI 페이지가 나오고 거기서 미리 설정된 아이디와 비밀번호를 입력한 후에 로그인 하면 관리 페이지가 나온다.

     

    새로운 database를 만들고 table을 만들 수 있으며, 그 table에 필요한 column 내용을 지정할 수 있다. 해당 값들은 어떤 이름을 가지고, 데이터형이며, 길이가 어떻게 되는지 세부적으로 설정이 가능하다. 만약 index와 같이 자동으로 값이 증가해아하는 column이 있다면 A.I.(Auto Increment)를 설정하면 새로운 데이터가 삽입될 때마다 알아서 값이 증가한다. 또한 꼭 삽입할 때 필요한 데이터가 있다면 index를 Primary로 설정할 수 있다.

     

    그리고 GUI상으로 데이터 삽입 출력이 가능하다.

     

    이때까지는 GUI로 값을 관리했지만 SQL(Structured Query Language)이라는 데이터베이스 언어로 관련 작업을 할 수 있다. 이 수업에서는 select, insert, 그리고 where 이라는 키워드로 출력, 삽입에 관해서만 배웠다.

     

    먼저 select 문법은 다음과 같다.

    select [column 이름] from [table 이름]

    각 값 사이에는 띄어쓰기가 있어야 하며, 대괄호 안에는 특정 값이 삽입되면 된다.

    예를 들어 내가 위에서 삽입한 test_table이라는 이름을 가진 table에서 name과 score를 출력하고 싶다고 가정했을 때, 그 값을 출력하는 query문은 다음과 같다.

    select name,score from test_table

    이 경우는 내가 여러 column을 관리하고 싶었기 때문에 반점(,)으로 여러 column을 표현했다. 그렇다면 만약 모든 column을 가져오고 싶다면 어떻게 해야할까? 바로 * 을 쓰면 된다. column 자리에 *을 쓰면 모든 column을 지칭한다.

     

     

    그 다음은 insert 문법이다.

    insert into [table 이름] (column 이름) value (값)

    이 경우 소괄호() 는 써줘야 하며, 여러개를 써야하면 그 사이에 반점(,)으로 구분해주면 된다. 만약 내가 위의 table에 특정 값을 입력해주고 싶다고 가정하면 써야하는 문장은 다음과 같다.

    insert into test_table (name,score,pass) value ('john','99','2222')

    만약 모든 column에 다 넣고 싶다면 이번에는 *이 아니라 그냥 생략하면 된다. 만약 a.i로 증가되는 값이 있을 경우에는 NULL을 삽입하면 된다.

     

    또한 이제 where 키워드를 이용해서 정교한 출력이 가능하다. 앞에서 그냥 select 문만 썼을 때는 해당되는 모든 column의 내용이 다 출력되었다. 하지만 where 키워드로 조건을 설정해줄 수 있다. where의 위치는 select문의 맨 마지막에 위치하며 뒤따르는 조건이 필요하다.

    정리하자면, select [column 이름] from [table 이름] where [조건]

    이 조건에는 특정 column의 값을 지정할 수 있다. 만약 내가 name이 'shadow'라는 row만을 출력하고 싶다면 이렇게 쓸 수 있다.

    select * from test_table where name='shadow'

    그리고 이 조건에서는 다른 프로그래밍 언어와 비슷하게 논리 연산자도 쓸 수 있다. 예를 들면 and와 or이 있다.

    만약 and를 쓰고 싶다고 가정하면 조건이 다 참이 되는 row만 출력이 된다. 실제로 'shadow'의 'score'는 80이기 때문에 다음과 같이 명령하면 값이 출력되지 않는다.

    select * from test_table where name='shadow' and score='90'

    하지만 or 연산자를 쓰면 name='shadow' 조건이 참으로 만족되어 출력이 되고 score='90'을 만족하는 'normaltic'의 값 또한 출력된다.

     


    이제 sql문법을 php에서 사용하는 방법을 알아보겠다. 이 단계에서 주의해야 할 점은, 실무에서 실제로 database와 webserver는 다른 컴퓨터에서 분리가 되어 있기 때문에 특정 ip주소를 따로 사용하지만, 지금 실습할 때는 한 컴퓨터에서 local으로 실행하기 때문에 ip주소가 localhost로 설정되었다.

     

    우리가 db를 이용해서 하고 싶은 것은 결국 db속의 데이터를 이용하는 것이다. 그렇게 하기 위해서는 db에게 사용권한이 있는지 인증을 받아야 한다. 아무나 요청한다고 실행을 다 해준다면 보안에 매우 큰 문제가 있기 때문이다. 그래서 php에서는 connector를 발급받는 관련 함수가 존재한다.

     

    먼저 db와 대화하고 싶은 php파일을 연 뒤에 상단에 다음 코드를 삽입한다.

     

    <?php
    	define(‘DB_SERVER’, ‘localhost’); //선언.  원래는 localhost에 ip주소를 써야함. define으로 상수 설정
    	define(’DB_USERNAME’, ‘admin’);
    	define(‘DB_PASSWORD’, ‘student1234’);
    	define(‘DB_NAME’, ‘test’);
    	$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME,  DB_PASSWORD, DB_NAME ); // db에 로그인 하는 함수. 로그인하면 티켓(커넥터)를 받아서 변수에 저장
    
    	if($db_conn) {					// 커넥터 있는지 확인
    	echo “DB connect”;
    } else {
    	echo “DB connect fail”;	
    }
    
    ?>

     

    결국 db에 연결하기 위해서 꼭 필요한 것은 mysqli_connect()함수이다. 다른 define함수는 편하게 사용하기 위해서 상수화하기 위해 사용했을 뿐이고, 아래의 if문도 커넥터를 발급받았는지 아닌지 확인하는 용도이다.

    그리고 그 발급받은 커넥터는 $db_conn 함수에 저장을 했고, 추후에 query문을 실행할 때마다 사용된다.

    그리고 이 코드의 중요한 점에서 한가지는 바로, 이 코드에 db의 아이디, 비밀번호가 있기 때문이다. 앞서 db와 연결하기 위해서는 인증을 받아야 한다고 했다. 인증을 받기 위해서 필요한 것은 바로 아까 GUI에서 로그인했듯이 아이디와 비밀번호이다. php코드에서도 마찬가지로 연결을 하기 위해서 아이디와 비밀번호가 존재한다. 그래서 webserver가 노출되면 db도 자연스레 노출된다고 할 수 있다. 

     

    그 다음 select 문을 실행하는 법을 알아보겠다. 

     

    $sql = "select * from test_table";
    $result = mysqli_query($db_conn, $sql);

     

    $sql 변수에 실행할 쿼리문이 string 형태로 저장되었고, mysqli_query함수로 실행된 값을 저장한다. 이때 아까 발급받은 connector와 $sql 변수가 사용된다. 이 결과는 통째로 객체를 저장하기 때문에 뽑아진row들을 사용하기 위해서는 추가적인 과정이 더 필요하다.

     

    $row = mysqli_fetch_array($result);

    이렇게 실행하면 $row에 아까 $result 객체에 들어있는 최상위 row가 저장된다. 만약 똑같은 $result에 똑같은 과정을 더 실행하면 두번째 row가 저장될 것이다. 

     

    그리고 이 row에서 특정 column을 출력하고 싶다면? 예를 들면 name

    echo $row['name'];

    이것을 실행하면 된다. 대괄호 [] 안에 특정 column 이름을 적어준다.

     

    그렇다면 특정 row를 설정하고 싶다면 어떻게 해야할까? 바로 아까 배웠던 sql문에 where 키워드를 사용해서 입력하면 된다.

    $sql = "select * from test_table where name='shadow'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result);
    echo $row['name'] . "'s score is " . $row['score'] . "!";

     

    이 코드를 실행하면 shadow's score is 80! 이라는 문자열이 출력될 것이다.

     

    만약 로그인 기능을 구현하고 싶다면 앞서 배운 것들을 활용하면 될것이다.

     

     


    간단 과제.

    ** 학생의 점수는 ** 입니다 라는 페이지를 get방식으로 전송해서 db를 출력하는 페이지를 만들기.

     

    코드 내용

     

     

    아무것도 입력하지 않았을 때

     

     

    normaltic을 name으로 입력했을 때 90점이 출력된다.

     

     

     

     

    shadow를 입력했을때 100이 출력된다. 앞에서 말한 80점에서 100으로 수정함.

     

     

    다음 과제는 다음 글에서 작성하겠다.

    '웹 해킹' 카테고리의 다른 글

    Login Logic Case 분석  (0) 2024.06.16
    3주차 수업 정리  (0) 2024.05.03
    2주차 과제  (0) 2024.04.28
    1주차 수업 정리  (1) 2024.04.19
Designed by Tistory.