반응형

wargame 78

[Web Hacking] XML 외부개체(XXE Injection)

※ XML 외부 개체(XXE) XXE는 악의적인 자바스크립트를 막기 위한 필터장치를 우회하는 취약점으로 XML 문서에서 동적으로 외부 URI의 리소스를 포함시킬 수 있는 외부 엔티티(Entity)를 사용할 때 발생한다. 오래되고 설정이 엉망인, 많은 XML 프로세서들은 XML 문서 내에서 외부 개체 참조를 평가한다. 외부 개체는 파일 URL 처리기, 내부 파일 공유, 내부 포트 스캔, 원격 코드 실행과 서비스 거부 공격을 사용하여 내부 파일을 공개하는데 사용할 수 있다. ※ XXE Injection 일반적으로 잘못 구성된 XML Parser를 사용하여 신뢰할 수 없는 XML 공격 코드를 주입시켜 실행시키는 응용프로그램에 대한 공격을 말한다. 해당 공격을 통해서 주요 시스템 파일 접근(LFI)이나 외부 악..

[wargame.kr] md5 password

207point인 md5 password 문제를 풀어보자. 첫 화면은 password를 입력할 수 있는 부분과 소스코드를 볼 수 있는 창이 있다. 쿼리문을 살쳐보면 입력받은 password값을 md5로 처리해서 쿼리의 결과를 반환하는 것 같다. 그리고 결과값이 $row 변수에 들어있으면 $key값을 echo하여 화면에 출력해주게 된다. 해당 문제는 md5의 취약점을 이용한 문제인 것으로 판단되며, md5함수의 취약점에 대해 알아보자. - md5(string $str, [bool $raw_output=false]) $str 해쉬값을 구할 문자열 $raw_output true 로 설정하면, 결과값이 16자로 만들어준다. 설정하지 않을 경우, 32자의 길이를 가진다. default는 false이다. MySQL..

[wargame.kr] login filtering

132point인 login filtering을 풀어보자. 문제에서는 계정이 있지만 block 상태라 하고 있다. login을 우회 가능한지 묻는 문제인 것 같다. 이제 시작해보자. - mysql_real_escape_string : mysql query에서 특수 문자열을 이스케이프하기 위해 사용 - trim() : 시작 문자와 끝 문자에 공백(또는 특수문자)을 포함하고 있으면, 제거한 문자열을 반환 특수문자가 이스케이프처리 되어 버리기 때문에 Injection을 시도할 수 가 없다. PHP는 문자열 비교에 있어서 대소문자를 구별하지만, MySQL은 기본적으로 대소문자를 구분하지 않는다. 그러므로, block처리되어 있는 계정의 아이디 값을 대문자로 넣어 인증 우회를 시도해보자. Guest / guest..

[wargame.kr] QR CODE PUZZLE

111point 인 QR CODE PUZZLE문제를 풀어보자. 문제에 들어가면 QR 코드가 뒤죽박죽 섞여있는 모습을 볼 수 있다. 소스를 살펴보면 자바스크립트의 unescape 함수를 확인할 수 있다. - escape() : URI로 데이터를 전달하기 위해서 문자열을 인코딩 - unescape() : escape를 통해서 만들어진 URI 이스케이핑을 디코드 콘솔에 unecape함수의 코드를 실행해보면 "./img/qr.png"의 파일 경로가 나온다. 해당 경로로 접을 해보면 QR Code 가 나온다. QR 코드 인식 App을 이용해 스캔하면 http://http://wargame.kr:8080/qr_code_puzzle/Give_M3_th7_F1aG.php 주소가 나오게 된다. 해당 URL로 접근하면 F..

[wargame.kr] flee button

84point인 flee button 문제를 풀어보자. 문제에 들어가보면 clik me! 버튼을 누르라고 하고 있는데 마우스로의 움직임이 클릭이 안되게끔 만들어져 있다. 소스 코드에서 힌트를 살펴보도록 하자. 자바 스크립트 코드가 난독화 되어 있는 것으로 보인다. 해당 unescape_blue14 함수 안에 들어있는 난독화된 코드를 개발자 도구 콘솔에 넣어 실행해보자. 총 2번에 걸처 unescape_blue14 함수를 실행해보면 최종적으로 다음과 같은 코드가 나온게 된다. "" onclick="window.location='?key=11f5';" onclick 속성의 window.location를 통해 url뒤에 ?key=11f5 파라미터를 보내보도록 하자. FLAG 값을 확인할 수 있다. 해당 값을 ..

[wargame.kr] already got

81 point인 already got 문제를 풀어보자. 문제를 클릭하게 되면 HTTP 응답 헤더를 확인했는지 물어본다. Start 버튼을 누르게 되면 이미 key를 획득했다는 문자열이 반환된다. 프록시를 이용해 응답 헤더를 살펴보도록 하자. 헤더부에 FLAG 값이 들어 있는 것을 확인했다. 해당 값을 제출해보도록 하자. 문제가 정상적으로 풀리는 것을 확인할 수 있다.

[webhacking.kr] 61번 문제

200점인 61번 문제를 풀어보자. 만약 id파라미터가 없다면 id=guest가 된다. id의 값이 15자 이상이거나 ( , ) , select, from, ',' , by, '.' 문자열은 필터링 된다. select {$_GET['id']} from chall61 order by id desc limit 1 쿼리문을 해석해 보면, 입력받은 id를 검색하는데 chall61테이블에서 id컬럼을 내림차순으로 정리한 것 중 id의 첫번째 줄에서 1개를 가져오라는 의미이다. 쿼리 후 결과가 admin이면 문제가 풀리게 된다. 이제 인젝션을 통해 문제를 풀어보도록 하자. 'admin' from chall61--를 넣어 뒤의 조건을 주석처리 시켜버리면 쉽게 해결할 수 있지만, from 문자열이 필터링 되고 있기 때..

[webhacking.kr] 60번 문제

300점인 60번 문제를 풀어보자. 첫 화면에서 idx 값이 39315로 주어져 있고, Access Denied가 반환된다. 소스코드를 살펴보자. if(!is_numeric($_COOKIE['PHPSESSID'])) exit("Access Denied view-source"); 쿠키 PHPSESSID가 숫자가 아니면 exit()하게 된다. $_GET['mode']의 값이 auth 이면 file_get_contents()함수를 이용해 ./readme/{$_SESSION['idx']}.txt 파일을 문자열로 읽어들인다. 39315가 ./readme/{$_SESSION['idx']}.txt에 존재한다면 문제를 해결된다. 세션값을 1로 바꾸고, ?mode=auth로 request해보자. Auth~ 가 반환된다...

반응형