반응형




안녕들 하시죠 !


오늘은 지난시간에 구축해놓은 APM을 이용해 SQL Injection 실습을 진행해 보겠습니다.


먼저 DB( wp_users )에 레코드를 입력하고, 간단한 로그인용 페이지를 만들어 보겠습니다.


워드프레스를 통해 계정을 생성하게되면 패스워드를 암호화하여 저장하기때문에 HeidiSQL을 이용하여 쿼리를 통해 값을 넣어보겠습니다.


아래의 URL을 통해 들어가서 9.2.0 버전을 설치하고 진행하겠습니다.


https://www.heidisql.com/download.php#



설치 후 실행하면 아래와 같은 화면이 나옵니다.

사용자, 암호에 python 을 입력하고 열기를 누르겠습니다.



열기를 누르면 다음과 같은 화면이 나옵니다.



1번 wordpress를 누르고 2번 쿼리를 누릅니다.



자, 이제 쿼리창을 통해 직접 값을 입력해 넣어볼텐데요.

그전에 wp_users의 모든 데이터를 가져오는 쿼리문 select * from wp_users 를 입력하고 F9 ( 실행 ) 을 입력하면 아래에 

아이디 패스워드 등 정보들이 나옵니다.


이제 'hongpossible' 이라는 계정을 추가해보겠습니다.



1
2
Insert into wp_users(id, user_login, user_pass, user_nicename, user_email, user_registered, user_status, display_name) 
values(3'hongpossible''1234''hong''abcde@naver.com', now(), 0'hongpossible');
cs


그리고 다시 select * from wp_users를 입력하여 값이 잘 들어갔는지를 확인해봅니다.



잘 들어갔네요.


그럼 이제, 'C:\APM_Setup' 폴더의 php.ini 파일을 메모장으로 열겠습니다.

Ctrl + F 를 눌러 magic_quotes_gpc 항목을 찾아 On 을 Off로 바꿔주겠습니다.


gpc( get, post, cookie ) 를 사용하여 넘어온 변수값 quotes( ', ", \, NULL 등) 가 있으면 자동으로 앞에 역슬레시( \ )를 

붙입니다. 이는 우리가 실행할 SQL Injection에 대한 최소한의 방어입니다.



이제 아이디 패스워드를 입력하는 로그인창을 만들어보겠습니다.

직접 php언어를 공부하며 만들어보시는 것이 best겠지만 시간이 부족하신분들은 아래의 소스코드를 'C:\APM_Setup\htdocs' 경로에 

넣어 주시면 됩니다.


config.php


DB와 연결하여 wp_users 테이블을 불러올 수 있게 한다.


1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
$mysql_hostname = "localhost";
$mysql_user = "python";
$mysql_password = "python";
$mysql_database = "wordpress";
 
$bd = mysql_connect($mysql_hostname$mysql_user$mysql_password) or die("db connect error");
mysql_select_db($mysql_database$bd) or die("db connect error");
  
?>
 
cs


login.php


ID, 패스워드를 입력받아 check.php로 넘기는 역할을 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html" charset="utf-8"
            <title>Login Page</title>
    </head
<br>
<center>아이디와 패스워드를 입력해주세요</b></div>
    <form action="check.php" method="post">
        <label>아 이 디   :</label><input type="text" name="username" class="box"/><br>
        <label>패스워드   :</label><input type="text" name="password" class="box"/><br>
        <input type="submit" value="로그인"/><br/>
    </center>
</form>
</body>
 
</html>
 
cs


check.php


login.php에서 넘겨받은 ID, 패스워드를 검증하여 사용자의 login ID, 패스워드, 이메일을 반환한다.


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
<?php
 
    include("config.php");
  
    $myusername=$_POST['username']; 
    $mypassword=$_POST['password']; 
 
    $sql="SELECT user_login, user_pass, user_email FROM wp_users WHERE user_login='$myusername' and user_pass='$mypassword'";
    $result=mysql_query($sql);
 
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8"<!--utf-8설정-->
<title>Login Page</title>
</head>
<?php
    while($str = mysql_fetch_array($result)){
        echo "
            $str[user_login],
            $str[user_pass],
            $str[user_email]<br>
        ";
    }    
?>
    
</body>
</html>
cs


저는 위의 .php파일들을 htdocs 폴더안에 sqlinjection 이라는 폴더를 만들어 그안에 전부 저장했습니다.

그럼이제 URL창에 localhost/sqlinjection/login.php 를 입력해 들어가보겠습니다.



우선 아까 만든 아이디 hongpossible 비밀번호 1234로 로그인 해보겠습니다.




성공적으로 로그인되어 아이디 비밀번호 이메일이 출력되었네요.


그럼 이제 아이디와 패스워드 입력란에 'OR '1'='1을 입력해보겠습니다.




성공했습니다 !


그럼 이제 왜 이렇게 된건지를 SQL문을 보고 알아보겠습니다.




사용하는 db에 따라 다르겠지만 저의 환경에서는 위에 주황색으로 표시된 부분이 아이디,패스워드를 사용자에게 입력받는 부분입니다.

' OR '1'='1 을 입력하게되면 OR ( 논리합 )뒷부분의 '1'='1' 부분이 참이 되어 전체 결과를 참으로 만들어줍니다.


논리합( OR ), 논리곱 ( AND )


OR

참 + 참 = 참

참 + 거짓 = 참

참 + 참 = 참

거짓 + 거짓 = 거짓


AND

참 + 참 = 참

참 + 거짓 = 거짓

거짓 + 참 = 거짓

거짓 + 거짓 = 거짓


이렇게 해서 [ user_login = TRUE + user_pass = TRUE ] = TRUE 가 되는겁니다.


자, 이번엔 다른 방법으로 인젝션을 진행해보겠습니다.


아이디 입력창에 hongpossible' -- 을 입력해 보겠습니다. 

-- ( 주석 ) 뒤에 한칸은 스페이스로 띄워줘야합니다.




이번에는 비밀번호에 아무것도 입력하지 않았는데도 성공했네요.

어떻게 성공한건지 알아보겠습니다.



이번에는 아이디를 입력하고 '로 닫은후에 -- 로 뒷부분을 전부 주석처리하여 인젝션에 성공하였습니다.

오늘 실습한 인젝션들은 애초에 웹페이지를 만들때 코드단에서 ', --, 문자길이 제한 등의 필터링을 해준다면 이렇게 쉽게 

db정보를 획득하지는 못할 것 같습니다. 

앞으로 다양한 실습을 통해 SQL Injection에 대해 알아봐야겠습니다.


오늘은 여기까지입니다 감사합니다 !




참고서적 이상한 「웹해킹 입문」 프리렉(2016) p59~74

'보안 > Web hacking' 카테고리의 다른 글

Lord of SQL Injection 2번 풀이  (0) 2018.11.07
Lord of SQL Injection 1번 풀이  (0) 2018.11.07
웹해킹 실습을 위한 APM, Wordpress 설치  (0) 2018.11.02
SQL Injection 이란?  (0) 2018.11.02
OWASP Top 10 이란 ?  (0) 2018.10.24

+ Recent posts