본문 바로가기
Hacking & Security/Web Hacking

[natas] 14>15

by 희디 2022. 6. 25.

진입 비번 : AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

 

문제화면이다. 

username이 있는지 없는지 확인하는 창인거 같다. 

natas16을 입력해보니까 존재한다고 뜬다. 그러고나서 일어나는 일이 없다. 

 

소스코드를 확인해보자. 

/*
CREATE TABLE `users` (
  `username` varchar(64) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL
);
*/

if(array_key_exists("username", $_REQUEST)) {
    $link = mysql_connect('localhost', 'natas15', '<censored>');
    mysql_select_db('natas15', $link);
    
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\"";
    if(array_key_exists("debug", $_GET)) {
        echo "Executing query: $query<br>";
    }

    $res = mysql_query($query, $link);
    if($res) {
    if(mysql_num_rows($res) > 0) {
        echo "This user exists.<br>";
    } else {
        echo "This user doesn't exist.<br>";
    }
    } else {
        echo "Error in query.<br>";
    }

    mysql_close($link);
}

비밀번호 출력화면이 없다. 그리고 아이디가 db에 있는지 없는지 유무만 알려준다. 

저번에 푼 los의 orc 문제와 유사한 점이 있다고 생각이 들어서 

https://daywnme.tistory.com/189 다시 들어가봐서 확인해봤다. 

 

역시 참과 거짓의 유무를 알려주는 Blind SQL문을 이용해서 풀어야 할거 같다. 먼저 비밀번호의 길이부터 알아내야 한다. 하지만 너무 길어서 자동화 프로그램을 찾아봤다. 

 

아래는 자동화 프로그램 전체 코드이다. 

 

먼저 request와 string을 import한다. 

링크와 username과 진입비밀번호를 입력해준다. 설정부분이다.

 

※ string.ascii_letters : 영어 알파벳 소문자, 대문자 모두를 출력

※ string.digits : 십진수 0 ~ 9 까지 출력

characters에는 string.ascii_letters와 string.digits를(주석된 내용의 결과가 characters) 문자열로 합쳐준다. 

 

password에 발견되는 문자들을 딕셔너리 형태로 만든다. 

이건 무차별 공격의 복잡성을 크게 줄여주기 때문에 사용된다. 

 

password_dictionary를 리스트로 해준다. 

그리고 위에 생성한 characters 안에 있는 각 문자 및 숫자들에 대해서 위에 있는 url과 username과 password Like Binary 등에 char을 더해서 uri를 만든다. (정확히 무엇인지는 모르겠음- LIKE BINARY와 % char, % &debug) 

 

그리고 requests.get으로 http 요청해서 uri에 연결하고 username과 비번을 넣는다. (해당 사이트로 연결하는 것) 

그리고 만약 r의 text(UTF-8로 인코딩된 문자열을 받을 수 있음)의 결과에 This user exist가 있다면, password_dictionary에 해당 char를 추가한다. 

 

위의 코드 결과이다. 

이제 무차별 공격을 해보자. 

그래서 위에서 얻은 password_dictionary에 있는 문자 하나하나를 char라고 한다. 그리고 test는 비밀번호 password와 char를 합친 문자열이다. uri를 지정한다. 그리고 requests.get으로 http를 서버로 전달한다. 마찬가지로 This user exists가 있으면 char를 비밀번호에 추가한다. 

 

 

 

위의 코드 결과 비밀번호이다. 

이를 통해 password의 길이가 32임을 쿼리문에 넣어봤는데 user는 존재한다고 한다. 맞음을 확인했다. 

Password: WaIHEacj63wnNIBROHeqi3p9t0m5nhmh

[참고사항과 자동화 프로그램 코드 출처]

https://mcpa.github.io/natas/wargame/web/overthewire/2015/09/29/natas15/

 

Natas Level 15 · Hammer of Thor

Natas Level 15 29 Sep 2015 • Nate NATAS 15 NATAS 15 demonstrates how confirming the contents of a username can be combined with a SQL Injection vulnerability to enable what’s called a Blind SQL Injection attack. If we click on the View sourcecode link

mcpa.github.io


python join 함수 - https://blockdmask.tistory.com/468

 

[python] 파이썬 join 함수 정리 및 예제 (문자열 합치기)

안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 문자열로 일정하게 합쳐주는 join 함수에 대해서 알아보려고 합니다. join 함수는 문자열을 다룰 때 유용하게 사용할 수 있는 함수이니

blockdmask.tistory.com

 

python import string - https://yang-wistory1009.tistory.com/72

 

[파이썬] string 모듈을 이용한 알파벳(대,소문자), 숫자, 특수문자 출력하기 - 공부하는 도비

가끔 알고리즘 문제를 풀다보면 알파벳 a부터 z 까지 전체가 필요할때가 종종 있어요. 그럴때 유용하게 쓸 수 있는 모듈이 있습니다. 바로 string이라는 모듈인데, 사용법 : string.__________ 몇 가지

yang-wistory1009.tistory.com

 

'Hacking & Security > Web Hacking' 카테고리의 다른 글

[DreamHack] Background : HTTP / HTTPS  (0) 2022.07.05
[natas] 15>16  (0) 2022.06.25
[XSS Challenge] Stage14  (1) 2022.06.24
[XSS Challenge] Stage13  (0) 2022.06.24
[XSS Challenge] Stage 12  (0) 2022.06.24