OverTheWire: Natas level14

반응형


OverTheWire 문제풀이 - Natas

* Bandit는 웹 보안 관련 문제입니다.

* 개인적인 문제풀이로 해답을 보시기 전에 직접 풀어보시기를 권해드립니다.

* 반드시 연습용으로 제공된 환경에서만 작업하시기 바랍니다. 악용으로 일어난 사태는 절대로 책임지지 않습니다.

[링크] Natas 바로가기


Natas level14

Natas14에 접속하면 다음과 같은 화면을 볼 수 있다.

아이디와 패스워드를 입력하는 창이 있는데 일단 아무거나 입력하고 Login 을 눌러보면 접근 제한이 걸려있다. 소스를 한번 보자.

[View sourcecode]

1
2
3
4
5
6
7
<form action="index.php" method="POST">
Username: <input name="username"><br>
Password: <input name="password"><br>
<input type="submit" value="Login" />
</form>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
cs

이 소스코드에서 각각 username, password 라는 name으로 입력값을 index.php 에 POST 로 넘기는 것을 알 수 있다. 또다른 링크 'index-source.html'을 살펴보자.

[index-source.html]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<? 
if(array_key_exists("username"$_REQUEST)) { 
    $link = mysql_connect('localhost''natas14''<censored>'); 
    mysql_select_db('natas14'$link); 
     
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\""
    if(array_key_exists("debug"$_GET)) { 
        echo "Executing query: $query<br>"
    } 
 
    if(mysql_num_rows(mysql_query($query$link)) > 0) { 
            echo "Successful login! The password for natas15 is <censored><br>"
    } else { 
            echo "Access denied!<br>"
    } 
    mysql_close($link); 
else { 
?> 
cs
form으로 넘기는 값을 위 페이지에서 받는 것을 알 수 있다. 소스를 해석해보면 mysql query를 이용해 username, password 입력값을 받고 올바른 입력값을 넣으면 로그인에 성공해서 natas15 패스워드를 얻을 수 있게 설계되어 있다. 척 봐도 sql injection 을 이용한 문제인 것을 알 수 있다. 우리는 패스워드를 알길이 없기 때문에 비정상적으로 로그인을 해야 하기 때문이다.




[문제 풀이]

username 과 password에 임의의 값을 넣고 디버그 값을 넣으면 소스 보기가 없더라도 아래와 같이 query문을 참조할 수 있다. 이렇게 debug로 인한 메세지가 출력되는 것도 매우 취약한 부분이다.

특별히 필터링 하고 있는 것이 없기 때문에 자주 사용하는 sql injection 방법으로 로그인을 우회할 수 있을 것이다.

정상적인 sql query

"SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\"";

조작한 sql query

"SELECT * from users where username=\"".natas15."\" and password=\""." or "1=1."\"";

위와 같이 sql query를 조작하면 둘중 하나만 참이 되어도 참이기 때문에 or 1=1 구문으로 무조건 참이 되게 만들 수 있다.

그러면 아래와 같이 로그인 우회가 성공해서 natas15 패스워드를 얻을 수 있다.

next level password : AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J


반응형

'War Game > natas' 카테고리의 다른 글

OverTheWire: Natas level15  (1) 2017.07.21
OverTheWire: Natas level13  (0) 2017.07.20
OverTheWire: Natas level12  (0) 2017.07.14
OverTheWire: Natas level11  (0) 2017.07.12
OverTheWire: Natas level10  (0) 2017.07.12
TAGS.

Comments