목록Web Hacking/NATAS 풀이 (16)
Information Security
[OverTheWire] NATAS15 이번에는 Username만 입력할 수 있다. 이렇게 DB에 저장된 username을 확인할 수 있다. 그런데 우리는 natas16의 패스워드를 알아내야 한다. 쿼리의 실행 결과가 1개 이상(참)이면 This user exits. 메시지가 출력되고, 0개 이하(거짓)이면 This user doesn't exist. 메시지가 출력된다. 이를 이용해서 정보를 얻어야할 것 같다. username을 참으로 만들었더니 This user exists. 메시지가 출력되었다. Blind SQL Injection 공격이 가능하다는 것을 확인했다. /* CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` var..
[OverTheWire] NATAS14 기본적인 로그인 페이지가 구현되어 있다. $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\""; user를 조회하는 쿼리는 위와 같다. username을 참으로 만들고 뒤는 주석 처리하면 쿼리의 결과로 여러 행이 조회되어 패스워드가 출력될 것이다. NATAS14는 기본적인 SQL Injection으로 해결할 수 있었다.
[OverTheWire] NATAS13 else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) { echo "File is not an image"; } else { if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file $target_path has been uploaded"; } NATAS12와 코드가 거의 유사하지만 다른 점은 exif_imagetype() 함수의 반환 값이 존재해야만 파일을 업로드할 수 있다는 것이다. exif_imagetype() reads the first bytes of an image and checks its..
[OverTheWire] NATAS12 이번 문제에는 파일 업로드 기능이 구현되어 있다. 업로드할 파일은 natas13 패스워드 파일의 내용을 확인하는 명령어를 실행하는 PHP 코드이다.
[OverTheWire] NATAS11 $defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); 현재 기본 데이터의 값은 위와 같다. if($data["showpassword"] == "yes") { print "The password for natas12 is "; } data["showpassword"]의 값이 yes이면 패스워드가 출력될 것이다. function saveData($d) { setcookie("data", base64_encode(xor_encrypt(json_encode($d)))); } 쿠키는 위의 함수에 의해 생성된다. function xor_encrypt($in) { $key = ''; $text = $in; $ou..
[OverTheWire] NATAS10 NATAS9와 비슷한 문제인데, 입력하는 문자열이 preg_match로 인해 필터링된다. 하지만 NATAS9번을 풀면서 입력한 문자열은 필터링 대상에 포함되지 않는다. 똑같이 grep -i ^ /etc/natas_webpass/natas11 dictionary.txt가 실행되면 패스워드를 획득할 수 있다.
[OverTheWire] NATAS9 $key = $_REQUEST["needle"]; 입력한 내용은 변수 key에 저장된다. if($key != "") { passthru("grep -i $key dictionary.txt"); } key가 비어 있지 않으면 외부 명령어를 실행하는 함수 passthru()를 실행한다. The passthru() function is similar to the exec() function in that it executes a command. http://php.net/manual/en/function.passthru.php grep -i $key dictionary.txt grep [옵션] [찾을 문자열] [파일명] 우리가 입력한 내용은 [찾을 문자열]에 대입된다. g..
[OverTheWire] NATAS8 encodeSecret 함수가 정의되어 있다. POST 방식으로 전달된 값은 해당 함수를 통하여 암호화될 것이다. 그 값이 코드의 맨 위에서 정의되어 있는 encodedSecret 변수의 값과 같아야 패스워드가 출력된다. encodedSecret 변수의 값을 복호화하는 함수 decodeSecret를 작성했다. hex2bin 함수를 사용할 수 없어서 pack()함수로 대체했다. ※ The pack() function packs data into a binary string. 작성한 PHP 코드를 실행해서 복호화한 값을 얻었다. 해당 값을 전달하면 encodeSecret 함수에 의하여 다시 암호화될 것이다. 그리고 encodedSecret 변수의 값과 같아져서 if 문에..
[OverTheWire] NATAS7 소스를 확인해보니 GET 방식으로 page 변수를 정의하고 있다. page 변수의 값으로 home을 주면 위와 같은 메시지가 출력된다. home 파일에 접근해보았다. 파일의 내용은 위와 같다. page 변수에 파일을 주면 그 내용이 출력되는 것이다. 그럼 이제 힌트를 확인한다. natas8의 패스워드는 /etc/natas_webpass/natas8에 있다. page 변수의 값으로 패스워드가 있는 파일의 경로를 전달했더니 패스워드가 출력되었다.
[OverTheWire] NATAS6 [View sourcecode]를 클릭하면 PHP된 서버의 코드를 볼 수 있다. POST 방식으로 전달 받은 secret 변수의 값이 secret 변수와 같으면 된다. 그런데 현재 페이지에서는 secret 변수가 정의되지 않고 있다. include "includes/secret.inc"; includes/secret.inc 파일을 include하고 있어서 해당 파일에 접근해보았다. 해당 파일에서 secret 변수를 정의하고 있다. secret 변수의 값을 POST 방식으로 전달했다. 패스워드가 출력되었다.