목록Web Hacking (59)
Information Security
서버를 조금씩 변경해서 각각 어떻게 정보를 가져올지 알아볼 것이다. 1. news.php에서 내용을 출력할 때 사용한 while 문을 없앴다. -> mysql_fetch_array()는 쿼리의 실행 결과 중 한 줄만 가져오는 함수이다. -> SQL Injection으로 DB 정보를 얻어올 때도 한 줄만 가져올 것이다. -> 쿼리에 limit을 추가하여 몇 번째 줄의 정보를 가져올지 정해야 한다. ex) union select 1, column_name, table_name from information_schema.columns limit 10, 1 2. 이번에는 컬럼의 내용이 화면에 출력되지 않도록 변경했다. -> title, news 컬럼으로 DB 정보를 출력할 수 없는 상황이다. -> 이럴 땐 정보..
SQL 취약점 - Blind SQL Injection 1. 예제 작성 DB 구성: blind news: no (int), title (text), news (text) no의 값을 GET 방식으로 전달받아 blind DB에 저장된 내용을 출력하는 news.php를 작성한다. 2. 취약점 확인 이 사이트는 no의 값을 마음대로 변경할 수 있기 때문에 numeric injection 취약점이 존재한다. no의 값으로 위와 같이 아무렇게나 입력하면 쿼리 에러가 발생해서 화면이 하얗게 출력된다. 로그를 통해서 수행된 쿼리를 확인한다. -> 공백을 기준으로 앞은 값, 뒤는 쿼리로 인식한다. -> 뒤에 새로운 쿼리를 삽입할 수 있다는 것이다. ※ string injection news.php에서 위와 같이 전달받는..
SQL을 이용한 취약점 - SQL Injection(PHP file download) 1. 취약점 확인 게시글에서 파일 다운로드를 클릭할 때마다 Download의 횟수가 올라간다. ★ 이 부분에 취약점이 존재한다. 페이지 소스를 확인 -> 다운로드를 클릭하면 download.php를 호출하면서 GET 방식으로 값을 전달하는 것을 알 수 있다. download.php 확인 -> update 쿼리를 통하여 Download의 횟수가 올라간다. -> 실제 수행되는 쿼리를 예상해 볼 것이다. download.php에는 변수를 정의하고 있는 부분이 없고, lib.php를 확인 했다. lib.php에서 $t_board 변수가 정의되어 있다. 나머지 변수들은 download.php를 호출할 때 GET 방식으로 외부에서..
Server Side vulnerability - PHP File Upload 1. PHP File Upload 게시판에서는 사진 파일을 업로드하고 다운로드를 할 수 있다. 다운로드를 클릭해 보면 URL을 통해 파일이 업로드된 경로를 알 수 있다. 업로드한 파일은 모두 data 디렉터리에 위치한다. 만약 악의적인 php 파일을 업로드해서 실행이 된다면? -> 서버에 php 파일을 업로드할 수 있는 것만으로도 취약점이 된다. 2. PHP File Upload 공격이 가능하려면? 1) php 파일을 서버에 업로드할 수 있어야 한다. 2) 웹 브라우저를 통해서 접근이 가능해야 한다. 악의적인 php 코드를 작성하고, 파일 업로드를 시도해본다. 위와 같은 메시지를 출력하며 파일 업로드를 실패한다. 제로보드는 w..
Client Side vulnerability - XSS(Cross Site Scripting) 사이트를 교차해서 스크립트를 실행할 수 있다는 뜻이다. -웹 상에서 가장 기초적인 취약점 공격 방법이다. -1995년에 자바스크립트가 도입되고, 2000년에 자바스크립트를 이용한 최초의 공격이 발생했다. (Myspace라는 소셜 사이트의 회원 정보를 바꾸는 공격) -2005년에 악성코드의 형태로 발견되었다. -현재까지 다양한 변종과 함께 계속해서 공격이 활발하게 이루어지고 있다. 17년 동안 막는데 실패했다. -XSS 공격은 크게 두가지로 유형을 나눌 수 있다. 스크립트를 저장시켜 놓고 공격하는 stored XSS, 스크립트를 저장하지 않고 URL에 입력하면 바로 실행되어 공격하는 refletced XSS가 ..
-웹 기초에 대한 공부는 마치고 이제 취약점을 분석할 것이다. -취약점 분석을 위해 제로보드라는 공개 게시판을 사용할 것이다. 환경 설정 제로보드 설치 페이지 install.php에 접속한다. -> 뭐라고 써있는지 알 수가 없다. 크롬 웹 스토어에서 char encoding 프로그램을 추가한다. 설치 페이지에서 오른쪽 버튼을 클릭하면 설치된 프로그램이 보인다. -> 한국어를 선택한다. 이제 알아볼 수 있다. -> 퍼미션을 조정하라는 경고 메시지가 출력된다. 원래 zboard 디렉터리의 퍼미션은 위와 같다. 퍼미션을 707로 조정한다. [퍼미션 조정하였습니다.] 버튼을 클릭하면 설치를 시작할 수 있다. 제로보드에서 사용할 DB zboard를 생성한다. DB 설정을 해준 후 [설정 완료]를 클릭한다. 버전이..
7. 게시글 확인: view.php -메인 페이지의 게시글 목록에서 [제목]을 클릭하면 게시글을 확인할 수 있다. -로그인한 사용자만 게시글을 확인할 수 있다. 1) 로그인하지 않은 사용자가 게시글을 보는 경우 -> 로그인 요구 -> 뒤로가기 2) 로그인한 사용자가 게시글을 보는 경우 -조회수 증가 -내용 출력 -일단 메인 페이지에서 제목을 클릭하면 view.php 페이지로 이동하여 글을 확인할 수 있도록 할 것이다. -> main.php에서 게시글의 목록을 출력하는 태그에서 제목 부분에 링크를 추가한다. -> 링크를 클릭하면 설정된 경로로 GET 방식으로 DB에서 현재 no의 값을 전달한다. -view.php 페이지를 작성한다. -> write.php 페이지와 거의 유사하므로 복사해서 사용했다. -로그..
★ main.php에서 게시글 목록 출력 -메인 페이지에 게시글 목록을 출력해 볼 것이다. -일단 DB에서 board 테이블의 모든 데이터를 가져오는 쿼리를 sql 변수에 저장한다. -> 그리고 mysql_fetch_array() 함수를 사용해서 쿼리의 실행 결과 중 한 행을 배열 형태로 가져온다. ※ mysql_fetch_array() 함수 msql_fetch_array — Fetch row as array http://php.net/manual/en/function.msql-fetch-array.php 현재 board 테이블에 저장되어 있는 게시글은 위와 같다. main.php 페이지의 소스를 보면 select * from board;의 결과 중 한 행만 배열 형태로 가져온 것을 확인할 수 있다. m..
5. 게시글 작성 페이지: write.php -이 코드의 윗 부분은 main.php와 같기 때문에 생략 -제목, 내용을 입력하고 전달하기 위해 input, textarea 태그를 사용한다. -type을 hidden으로 하여 화면에는 보이지 않게 하고, 버튼을 누르면 write_ok.php 페이지에 작성자, 날짜, 조회수(default: 0)가 전달되도록 한다. ->작성자(user_id)는 현재 로그인하고 있는 사용자의 아이디를 가져오기 위해 세션 변수 [name]을 value에 넣는다. ->작성 날짜(today)는 php의 date() 함수를 이용하여 현재 시스템의 시간을 가져온다. ->조회수(count)는 default 값 0을 전달할 것이다. -write.php 페이지의 소스 확인 -위의 코드는 ma..
3. 회원 가입 페이지: signup_ok.php -아이디 중복 체크 기능을 구현할 것이다. -> 아이디가 중복되지 않았으면 해당 회원의 정보를 DB에 저장한다. signup.html 페이지에서 넘어온 값들을 각각 변수들에 저장한다. -user 테이블에 저장되어 있는 user_id 값 중에 전달받은 id 값과 일치하는 값이 있는지 조회하는 select 문을 변수에 저장한다. -이 sql 문을 실행한 후 조회된 결과의 행(row) 수를 exist 변수에 저장한다. -이미 DB에 존재하는 아이디인 경우 exist 변수에는 1이 저장되어 'already user' 메시지를 출력한 뒤 window.history.back()(히스토리 목록에서 이전 URL 로드)가 실행되어 다시 회원 가입 페이지로 이동하게 된다...