IT Security

SQL injection - 칼리리눅스 sql injection 실습

로픽 2017. 9. 28. 19:59
300x250

SQL injection - 칼리리눅스 sql injection 실습


* 의도적인 query 문을 삽입하여 로그인을 하거나 정보를 캐내는 등의 비정상적인 데이터베이스 동작을
  유도하는 공격입니다.

* ex
  select * from users where username='$username' and password='$password' 구문

여기서 $password 변수에 1'or'1이 입력된다면 "username='$username' and passowrd='1'or'1' 이 되므로 값이 참이 됩니다.

이런 sql문의 취약점 때문에 패스워드를 몰라도 로그인이 가능한 공격합니다.


* 로그인 창을 생성하기 위한 index.php

<html>
<body>
<?php
if(isset($_POST['login']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$con = mysqli_connect('localhost','root','toor','sample');
$result = mysqli_query($con, "select * from users where username='$username' and password='$password'");
if(mysqli_num_rows($result) == 0)
echo 'Invalid username or password';
else
echo '<h1>Logged in</h1><p>A Secret for you...</p>';
}
else
{
?>
<form action="" method="post">
Username : <input type="text" name="username"/><br/>
Password : <input type="password" name="password"/><br/>
<input type="submit" name="login" value="Login"/>
</form>
<?php
}
?>
</body>
</html>


- 간단하게 아이디 입력창, 패스워드 입력창 2개를 생성하고 mysql에 접속하여 데이터 베이스 정보를 가져와서 입력한 값과 일치하는 경우 로그인 성공 

  문구를 띄우는 것입니다.


- mysqli_connect() : mysql에 접속하기 위한 함수, mysqli_query() : 쿼리를 입력받는 함수, mysqli_num_row() : 쿼리에 일치하는 값의 갯수를 출력




* mysql 데이터베이스 설정(maria DB) - mysql을 실행하면 maria DB로 나올 수도 있습니다.(mysql과 동일합니다.)


#service mysql start

#mysql -u root -p;

mysql> use mysql;

mysql> update user set plugin='' where user='root';

mysql> update user set password=password('toor') where user='root';

mysql> flush privileges;



* 데이터베이스 생성


mysql> create database sample;

mysql> connect sample;

mysql> create table users(username VARCHAR(100) primary key, password VARCAHR(100) not null);

mysql> insert into users values('humanist', 'toor');

mysql> quit;


#service mysql restart


- 간단하게 아이디와 패스워드를 저장하는 테이블을 생성하고 humanist 와 toor를 저장합니다.



* 메인 페이지 변경


# vi /etc/apache2/mods-available/dir.conf


- vi로 위의 경로로 진입하여 index.html을 지우고 index.php를 추가합니다. 그리고 /var/www/html의 index.html을 삭제합니다.



* 이후 reboot를 실행합니다.


* 아파치와 mysql을 다시 시작합니다.


#service apache2 start

#service mysql start




** 이후 해당 아파치 웹서버 IP 주소를 입력하여 웹페이지에 접속합니다. (localhost)



 - 처음 접속하면 로그인 창이 뜹니다. 이곳에 DB에 저장된 ID : humanist와 PASS : toor를 입력합니다.



 - php를 조금 변형시켜 패스워드가 뜨게 만들었습니다. 올바르게 입력하면 로그인에 성공합니다.

 - 이번에는 sql injection이 가능한 문구를 입력합니다. 1'or'1 이렇게 입력합니다.



 - 1'or'1라고 입력하면 로그인에 성공합니다.



** 입력된 sql문을 하나씩 풀어보면


"username = 'humanist' and password='1' or '1'"  이렇게 완성됩니다.


"참(1) and 거짓(0) or 참(1)"      아이디-참, 패스워드-거짓, 1-참


"거짓(0) or 참(1)"            참(1) and 거짓(0)은 and 조건때문에 거짓(0)


"결과 = 참"                   or 조건은 참이 하나만 있으면 무조건 참



** 이외에 다른 입력을 통해서 로그인도 가능합니다.




** 실습을 제외한 다른 환경에서 사용하시면 안됩니다.

반응형