분류 전체보기
![2-2 정규화와 성능](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQvobL%2FbtqB2HJVMlz%2FIsLJjDk2EqEpDNeKD5YVFk%2Fimg.png)
2-2 정규화와 성능
정규화Normalization 정규화는 최소한의 데이터 중복, 데이터의 일관성, 최대한의 데이터 유연성을 위해 데이터를 분행하는 과정이다. 따라서 데이터 중복을 제거하고 데이터 모델의 독립성을 확보하는 방법이다. 정규화를 통해 업무 상의 변화가 생겨도 데이터 모델의 변경을 최소화할 수 있다. 제1정규화부터 제5정규화까지 있지만 실질적으로는 제3정규화까지만 수행한다. 위 그림의 왼쪽 테이블에서 새로운 직원이 추가된다고 가정하자. 만약 부서 정보가 없으면 부서코드를 임의로 채워넣어야 한다. 즉 불필요한 정보를 꼭 추가해야 한다. 새로운 부서도 마찬가지인데, 사원 정보가 없기 때문에 임의의 값으로 사원번호를 입력하지 않으면 추가할 수 없다. 이를 이상현상Anomaly이라고 하며 테이블 분해가 필요하다. 오른쪽..
![2-1 성능 데이터모델링의 개요](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBXkc2%2FbtqB3qgUxsA%2FCXIKIwPqU8jSh4ZLUFdDO1%2Fimg.png)
2-1 성능 데이터모델링의 개요
성능 데이터 모델링의 정의 성능이 저하되는 데이터 모델의 경우 크게 세 가지 경우를 고려하여 그 성능을 향상시킬 수 있다. 데이터 모델 구조에 의해 성능이 저하될 수도 있고 데이터가 대용량이 됨으로 인해 불가피하게 성능이 저하되어 나타나는 경우도 있다. 인덱스 특성을 충분히 고려하지 않고 인덱스를 생성함으로 인해 성능이 저하되어 나타나는 경우도 있다. 일반적으로 성능이라고 하면 데이터조회의 성능을 의미한다. 데이터입력/수정/삭제는 일시적이고 빈번하지 않고 단건 처리가 많은 반면 데이터조회의 경우는 반복적이고 빈번하며 여러 건을 처리하는 경우가 많기 때문이다. 이러한 특징은 일반적인 트랜잭션의 성격이 조회의 패턴을 가지고 있다는 것이다. 하지만 어떤 업무의 경우에는 데이터 입력/수정/삭제에 대한 성능이 중..
![1-5 식별자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc21KWV%2FbtqBVeJvJmV%2FlUgYWRxyHaUVYnbKFRWYA0%2Fimg.png)
1-5 식별자
식별자Identifiers의 개념 식별자는 엔터티 내에서 인스턴스들을 구분하는 구분자로, 엔터티를 대표하는 속성이다. 따라서 하나의 엔터티에는 반드시 하나의 유일한 식별자가 존재한다. 보통 식별자와 키Key를 동일하게 사용하는데, 논리 데이터 모델링 단계에서는 업무적으로 구분이 되는 '식별자'로, 물리 데이터 모델링 단계에서는 DB 테이블 접근을 위핸 매개체로서 '키'를 사용한다. 식별자의 특징 유일성: 주식별자에 의해 엔터티 내 모든 인스턴스들이 유일하게 구분된다. 최소성: 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수이다. 불변성: 지정된 주식별자의 값은 자주 변하지 않는다. 존재성: 주식별자가 지정되면 반드시 값이 들어와야 한다. Null 값도 안된다. 대체식별자의 특징은 주식별자의 ..
![1-4 관계](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWfy5u%2FbtqBXHcBoC5%2FRCYjc7JugjJDIKHIkGqEj0%2Fimg.png)
1-4 관계
관계의 정의 관계는 엔터티 간의 관련성을 의미하며 존재 관계와 행위 관계로 분류된다. 관계의 패어링 관계는 엔터티 안의 인스턴스가 개별적으로 관계를 가지는 '관계 패어링Relationship Paring'의 집합이다. 따라서 개별 인스턴스가 각각 다른 종류의 관계를 가진다면 두 엔터티 사이에 두 개 이상의 관계가 형성될 수 있다. 관계의 분류 관계를 연결할 때 어떤 목적으로 연결되었느냐에 따라 존재에 의한 관계와 행위에 의한 관계로 구분된다. 1. 존재 관계 -엔터티 간의 상태를 의미한다. -'소속된다'라는 의미는 행위(이벤트)에 의해 발생되는 의미가 아니라 황경빈 사원이 DB팀에 소속되어 있기 때문에, 즉 존재에 의해 형성된 의미이다. -UML 클래스 다이어그램의 관계 중 연관관계Associatinon..
![1-3 속성](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgvgSz%2FbtqBXVhmEtl%2FLBVh9c0DRJIgeNuvLnrYD0%2Fimg.png)
1-3 속성
속성Attribute의 개념 속성은 "업무에서 필요로 하는 인스턴스로, 의미상 더 이상 분리되지 않는 최소의 데이터 단위"이다. 예를 들어 생년월일은 하나로서 의미가 있다. 이를 생년/생월/생일로 구분한다면 사실상 하나의 속성을 관리목적에 따라 구분했다고 할 수 있다. 그래서 S/W 비용을 계산하는 기능점수(Function Point)를 산정할 때, 이렇게 분리된 속성은 하나의 속성(DET)으로 계산한다. 하지만 만약 서로 관련이 없는 이름, 주소를 하나의 속성인 ‘이름주소’로 정의하면 어떻게 될까? 이것은 하나의 속성의 두 개의 의미를 갖기 때문에 기본속성으로서 성립되지 않는다. 이렇게 정리된 속성은 그냥 값의 의미로, 속성보다는 내역으로서 정의하여 관리할 수는 있다. 엔터티, 인스턴스, 속성, 속성값..
![1-2 엔터티](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr04yB%2FbtqBYeOw36n%2FJVk9YKnkOT5kN3dJ0tqzkk%2Fimg.png)
1-2 엔터티
엔터티의 개념 엔터티는 "업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합적인 것(Thing)"이다. 엔터티는 그 집합에 속하는 개체들의 특성을 설명하는 속성Attribute을 갖는데, 이 속성은 엔터티 인스턴스 전체가 공유할 수 있는 공통 속성일 수도 있고 일부에만 해당하는 개별 속성일 수도 있다. 또 집합의 특성을 가지며 순수 개체이거나 행위 집합이다. 엔터티와 인스턴스에 대한 내용과 표기법 엔터티는 대부분 사각형으로 표현한다. 엔터티와 엔터티 사이의 ERD는 다음과 같다. 엔터티의 특징 1. 반드시 해당 업무에서 필요하고 관리하고자 하는 정보이다. 업무에서 관리되어야 하는 집합이다. 2. 유일한 식별자에 의해 식별 가능하다. 3. "두 개 이상"의 인스턴스의 집합이다. 4. 엔터티는 업무 ..
![Challenge old 56 (250)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV186s%2FbtqBWqIgkUs%2FctBWqEoMEjJK2Nw2QErLfK%2Fimg.png)
Challenge old 56 (250)
readme를 눌렀을 때 hi~를 눌렀을 때 readme가 admin이 쓴 게시물인 것 같고 acess denied가 뜨는 것으로 보아, 어떻게든 권한을 얻어서 그 게시물을 보면 플래그가 있을 것으로 추정된다 테이블 밑에는 검색창이 있다 먼저, 1부터 9까지 검색해봤을 때는 아무 것도 검색되지 않았다 0을 검색해보니 두 게시글 모두 검색되었다 이번엔 a부터 알파벳을 넣어보자 a를 검색해봤을 때는 readme가 검색되었다 검색된 알파벳들이다 a, c, d, e, f, g, h, i, k, l, m, n, o, s, t, u, y 하늘색은 readme, hi~가, 검정색은 readme만 검색된 알파벳이다 이후 저 위 글자들로 조합할 수 있는 몇 개의 예상 단어들을 검색해봤다 no, id, admin, htm..
![Challenge old 53 (350)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS1Z0F%2FbtqBRu6OGeZ%2F0xvWJDJw1z4Vr5efVEGC80%2Fimg.png)
Challenge old 53 (350)
$hidden_table로 표현된 숨겨진 테이블 명과 answer 쿼리가 같으면 풀리는 문제인 것 같다.일단 select 문에서 val와 a를 언급하고 있으니 ?val=1부터 넣어봤다.val=1일 때, 1이 그대로 출력되었다이는 2, 3, 4 동일했으며 0과 5는 아무 반응이 없었다.?val=a로 넣었을 때도 1이 출력되었다. 별 의미 없겠지만 테이블을 추측할 수 있다.aval11223344 테이블명은 Blind SQL Injectinon으로 알 수 있을 것 같다.UNION SELECT table_name FROM information.schema.tables를 사용하여 테이블명을 알아낼 수 있지만select가 필터링 되기 때문에 procedure analyse()를 사용해보자. select a from..
![Challenge old 51 (250)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI0WHZ%2FbtqBVMEHR7b%2FjWZoKKWK6iUiND2JnMhjt1%2Fimg.png)
Challenge old 51 (250)
초기 화면에는 Webhacking.kr 내 ID와 비번이 들어있고 제출을 눌러보면 Wrong 이 뜬다
![Challenge old 48 (350)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKL13y%2FbtqBVfGJpLW%2F6RXqEoP2SHUqtMjFkvb6QK%2Fimg.png)
Challenge old 48 (350)
일단 메인 화면에 들어가면 알 수 없는 사람 사진과 시간, 문자가 리스트로 찍혀있습니다 저도 파일을 선택해서 넣어볼게요 바탕화면에 있는 jpg 파일과 asdf라는 문자열과 함께 Send를 눌러보겠습니다 Send한 시간과 제 ID, 문자열이 뜨고 upload file을 누르면 제가 선택한 이미지 파일이 새 창으로 떠요 Delete를 누르면 아래 페이지로 넘어가며 이 목록이 삭제됩니다 그런데 별다른 파일을 업로드하지 않았을 때 삭제를 시켜보면, 위 페이지로 넘어가지 않고 고냥 삭제가 되네요 이 사진이 4.jpg라는 것도 알아냈습니다.. 힌트는 파일 업로드 후 삭제 페이지에 있었는데요, 다음은 그 페이지의 URL 입니당 mode=del..? 이 뭘까 찾아봤어요 첨에는 del mode가 있는 건지 알곸.. 검색..
![Challenge old 47 (150)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxZuG%2FbtqBSPWJjL4%2FUd7NCgqS6iSA5HaP8xV0uk%2Fimg.png)
Challenge old 47 (150)
메인 화면은 위와 같고, 소스는 별거 없습니다 메일 폼은 post 방식이며 input 박스의 최대 길이는 50이라는 것! 일단 그대로 send 버튼을 눌러볼게요 이런 게 뜹니다 또 넣어보려고 하니 10초 제한이 뜨네요^^ 10초가 지난 뒤 flag?라는 문자열을 넣어보니 위와 같이 떴습니다. 표시된 날짜와 시간은 임의로 정해진 것 같네요 도대체 눈치가 안와서 구글링을 해보고 "Mail Header Injection" 문제라는 것을 알아냈슴다.. PHP에서 메일을 보내는 함수, 즉 mail()은 다음과 같은 인자를 갖는데요 mail(수신자, 제목, 내용, 옵션) 여기서 옵션은 헤더라고도 하고, 이 헤더 부분을 조작하는 공격이라 Mail Header Injection인 겁니다 이제 헤더에 무언가를 추가하여 ..
![Challenge old 46 (300)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpjca%2FbtqBUTjz0oD%2FN7k24FvDrxR5R2sMi1tq20%2Fimg.png)
Challenge old 46 (300)
소스를 보면 다음과 같습니다. get방식의 lv라는 변수에 대해서 말하고 있네요 addslashes() 라는 함수는 싱글/더블쿼터, 역슬레시, 널문자 등을 예외처리 시켜 쿼리 작성에 혼동이 오지 않게 합니당 그 밑을 보면 공백, /, *, %, preg_match()의 각종 단어들은 모두 필터링을 하고 있고요 어쨌든 id가 admin이면 풀립니다! 그럼, 첫 화면인 lv 1 부터 쿼리를 넣어볼게요 그리고 밑 세 사진은 2, 3, 4를 각각 넣은 화면입니다 0과 5 이상부터는 아무 일도 없었어요. 따라서 chall46이라는 이름의 테이블을 추측할 수 있습니다. id cash Itusy 1100 udnrg 800 fvvcg 1200 bzrbo 700 admin ? 하지만 위 테이블이 어떻게 생겼는지는 사실 ..