웹/웹 보안

DVWA(Damn Vulnerable Web Application)

비니화이팅 2020. 3. 3. 09:55


Brute Force

 

Low, Medium

STEP 1) 로그인 페이지의 Username과 Password 입력란에 임의의 문자열을 넣고 Login버튼을 눌렀더니 username, password 파라미터로 값이 전달되는 것을 확인했습니다.


STEP 2) Brute Force 공격을 수행 후, 결과로 Length 길이가 다른 Payload1과 Payload2를 확인하였습니다.

 


STEP 3) 획득한 Payload값을 각각 Username, Password에 입력하여 로그인하였습니다.

 






Command Execution

 

Low

STEP 1) ping이 가능한 입력 란에 ping 대상 IP주소와 여러 개의 명령어를 한 줄에 실행시킬 수 있는 문자인 ‘;’와 cat /etc/passwd 명령어를 적고 submit버튼을 눌렀습니다.


STEP 2) ping 명령이 실행된 모습과 /etc/passwd파일의 내용을 확인하였습니다.

 



Medium

STEP 1) ping이 가능한 입력 란에 ping 대상 IP주소와 여러 개의 명령어를 한 줄에 실행시킬 수 있는 문자인 ‘|’와 cat /etc/passwd 명령어를 적고 submit버튼을 눌렀습니다.


STEP 2) /etc/passwd파일의 내용을 확인하였습니다.






CSRF

 

Low

STEP 1) admin계정의 패스워드 변경 시 GET메소드로 변경할 패스워드를 포함한 URL이 전송됩니다.


STEP 2) 해당 URL의 password_new, password_conf 파라미터 값을 원하는 패스워드로 바꿔 admin계정의 패스워드를 변경하였습니다.

 


Medium

STEP 1) admin계정의 패스워드를 변경하기 위해 변경할 패스워드를 입력한 후 Change 버튼을 누르면 GET메소드로 변경할 패스워드를 포함한 URL이 전송되지만 패스워드는 변경되지 않았습니다.

 

STEP 2) 소스코드 상에 “127.0.0.1”이라는 문자열이 HTTP 헤더의 Referer에 존재하는지 검사하는 로직이존재하여 해당 URL의 password_new, password_conf 파라미터 값을 원하는 패스워드로 변경하였고 Referer의 “192.168.30.128”을 “127.0.0.1”로 변경하였습니다.

 

STEP 3) 위의 패킷을 전송한 결과 admin 계정의 패스워드가 변경되었습니다.






Insecure CAPTCHA

 

Low

STEP 1) 변경할 패스워드를 입력하고 reCAPTCHA에 아무런 값도 입력하지 않은 후 Change를 클릭하면 POST메소드로 step이라는 파라미터 값이 1로 설정되어 패킷이 전송된 것을 확인하였습니다.


STEP 2) 소스코드상에서 단순히 step 파라미터가 2이면 패스워드를 변경할 수 있는 로직을 발견하였습니다. 따라서 step 파라미터 값을 2로 변경하였습니다.

 

STEP 3) 위의 패킷을 전송하니 패스워드가 변경되었습니다.



Medium

STEP 1) 변경할 패스워드를 입력하고 reCAPTCHA에 아무런 값도 입력하지 않은 후 Change를 클릭하면 POST메소드로 step이라는 파라미터 값이 1로 설정되어 패킷이 전송된 것을 확인하였습니다.

 

STEP 2) step 파라미터의 값을 2로 변경하여 전송하였지만 패스워드가 변경되지 않았습니다.


STEP 3) passed_captcha 파라미터 값이 존재하는지를 검사하는 로직이 소스코드상에 구현되어 있었기 때문에 passed_captcha 파라미터에 임의의 값을 넣었습니다.

 

STEP 4) 위의 패킷을 전송하니 패스워드가 변경되었습니다.






File Inclusion

 

Low, Medium

STEP 1) page 파라미터에 파일명을 입력하면 해당 파일이 include되는 것을 확인하였습니다.


STEP 2) 파일명을 입력받는 page 파라미터에 ../../를 넣어 상위디렉터리로 이동하니 index.php파일이 노출되었습니다.






SQL Injection

 

Low

STEP 1) User ID를 입력 받는 란에 ‘를 입력하면 아래와 같은 에러가 발생합니다.


STEP 2) ‘ or 1=1#를 입력하여 쿼리 결과 값이 참이 나오도록 하였습니다.


STEP 3) 모든 계정 정보가 노출된 것을 확인하였습니다.



Medium

STEP 1) User ID를 입력 받는 란에 ‘를 입력하면 아래와 같은 에러가 발생합니다.


STEP 2) 1 or 1=1를 입력하여 쿼리 결과 값이 참이 나오도록 하였습니다.

 

STEP 3) 모든 계정 정보가 노출된 것을 확인하였습니다.






SQL Injection (Blind)

 

Low

STEP 1) order by 구문을 이용하여 연동 되어있는 데이터베이스의 컬럼 개수가 2개인 것을 알아내었습니다.

 

STEP 2) 위에서 알아낸 컬럼 개수 정보를 이용해 Union SQL Injection을 수행하여 계정 정보가 담긴 것으로 예상되는 users테이블을 발견하였습니다.

 

STEP 3) users테이블의 컬럼명을 출력하는 Union SQL Injection 구문을 통해 users테이블에 user, password 컬럼이 존재한다는 것을 확인하였습니다.


STEP 4) admin계정의 password를 추출할 것이기 때문에 password 컬럼을 대상으로 Blind SQL Injection을 진행하였습니다. 우선 패스워드의 길이가 32인 것을 알아냈습니다.


STEP 5) 패스워드의 첫 글자가 2인 것을 알아냈고, 계속해서 모든 글자를 추출한 결과 MD5해시값을 확인할 수 있었습니다.


STEP 6) 알아낸 MD5해시값을 이용해 패스워드를 알아냈습니다.



Medium

STEP 1) order by 구문을 이용하여 연동 되어있는 데이터베이스의 컬럼 개수가 2개인 것을 알아내었습니다.

 

STEP 2) 위에서 알아낸 컬럼 개수 정보를 이용해 Union SQL Injection을 수행하여 계정 정보가 담긴 것으로 예상되는 users테이블을 발견하였습니다.

 

STEP 3) users테이블의 컬럼명을 출력하는 Union SQL Injection 구문을 통해 users테이블에 user, password 컬럼이 존재한다는 것을 확인하였습니다.


STEP 4) admin계정의 password를 추출할 것이기 때문에 password 컬럼을 대상으로 Blind SQL Injection을 진행하였습니다. 우선 패스워드의 길이가 32인 것을 알아냈습니다.

 

STEP 5) 패스워드의 첫 글자가 2인 것을 알아냈고, 계속해서 모든 글자를 추출한 결과 MD5해시값을 확인할 수 있었습니다.

 

STEP 6) 알아낸 MD5해시값을 이용해 패스워드를 알아냈습니다.






File Upload

 

Low

STEP 1) phpinfo를 보여주는 hack.php 파일을 선택한 후 업로드 하니 해당 파일이 업로드된 상대 경로가 노출되었습니다.


STEP 2) 상대 경로를 통해 유추한 업로드 경로로 접근하여 hack.php파일을 확인하였습니다.



Medium

STEP 1) 소스코드 상에서 Content-Type을 검사하는 로직이 있어 Content-Type을 Image/jpeg로 변경하였습니다.


STEP 2) phpinfo를 보여주는 hack.php 파일을 선택한 후 업로드 하니 해당 파일이 업로드된 상대 경로가 노출되었습니다.

 


STEP 3) 상대 경로를 통해 유추한 업로드 경로로 접근하여 hack.php파일을 확인하였습니다.






XSS reflected

 

Low

STEP 1) 이름 입력 란에 test문자열을 넣으면 GET 메소드로 name 파라미터에 들어가 요청됩니다.

 

STEP 2) name 파라미터에 쿠키값을 출력하는 스크립트를 삽입하고 패킷을 전송하니 쿠키값이 출력되었습니다.



Medium

STEP 1) 이름 입력 란에 test문자열을 넣으면 GET 메소드로 name 파라미터에 들어가 요청됩니다.

 

STEP 2) 소스코드 상에서 <script>가 필터링되고 있기 때문에 이를 우회하여 name 파라미터에 <SCRIPT>alert(document.cookie);</SCRIPT>를 넣어 패킷을 전송하였습니다.

 

STEP 3) 그 결과로 쿠키값이 출력되었습니다.






XSS stored

 

Low

STEP 1) 게시판에 test라는 내용으로 등록하니 txtName, mtxMessage 파라미터에 각각 내용이 들어가는것을 확인하였습니다.

 

STEP 2) mtxMessage 파라미터에 쿠키값을 출력하는 스크립트를 삽입하였습니다.


STEP 3) 그 결과로 쿠키값이 출력되었습니다.



Medium

STEP 1) 게시판에 test라는 내용으로 등록하니 txtName, mtxMessage 파라미터에 각각 내용이 들어가는것을 확인하였습니다.

 

STEP 2) 소스코드 상에서 <script>가 필터링되고 있기 때문에 이를 우회하여 txtName 파라미터에 <SCRIPT>alert(document.cookie);</SCRIPT>를 넣어 패킷을 전송하였습니다.


STEP 3) 그 결과로 쿠키값이 출력되었습니다.





[참고]

hashkiller.co.uk