반응형




안녕들 하시죠 !


오늘은 LOS 1번 문제풀이를 해보겠습니다.



다음과 같이 싱글쿼터( ' )나 더블쿼터( " )를 필터링하고있지 않으며, id값에 그 어떤 값이 들어와도 solve가 되겠네요.

자 그럼 우선 id에 아무 값이나 넣어보겠습니다.


?id=hongpossible 



자 이렇게 싱클쿼터 안에 hongpossible이 제대로 들어갔습니다. 

하지만 뒷부분에 pw값을 넣지못해 and 뒷부분을 참으로 만족시키지 못했네요.

그럼 가장 기본적인 SQL Injection구문을 이용하여 or 1=1 로 참을 만들어주고 그 뒷부분을 전부 주석처리하면 참을 만족시킬 수 있을 것 같습니다.

mysql의 주석처리 #을 urlencoding방식을 통해 %23으로 넣겠습니다.



urlencoding에 대해 알고싶으시다면 아래의 URL로 들어가보세요.

https://www.w3schools.com/tags/ref_urlencode.asp



?id=hongpossible'or 1=1 %23



위의 이미지에서 노란색부분 ( #' and pw '' )는 모두 주석처리가 되어버려 성공했습니다.


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


반응형




안녕들 하시죠 !


오늘은 지난시간에 구축해놓은 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
반응형




안녕들 하시죠 !


오늘은 웹해킹 실습을 위한 환경을 구축해 보겠습니다.


우선 VMware의 Window7에 APM 과 워드 프레스를 설치해보겠습니다.



APM이란?


APM이란 Apache + PHP + Mysql이 통합되어 있는것으로 사용자로 하여금 쉽게 가상서버 환경을 구축할 수 있게 도와줍니다.


Wordpress란?


홈페이지 플랫폼인 wordpress는 2003년 제작되어 현재 7천만개가 넘는 사이트에서 사용중입니다.

국내또한 수많은 대기업에서 현재 사용중입니다.

본인 서버에 설치가 쉽고 여러 plugin들이 있기때문에 이슈가 되고있습니다.

저는 앞으로 exploit-database에 올라온 wordpress plugin의 취약점을 이용해 웹해킹 실습을 진행해볼 계획입니다.



우선 APM부터 설치하겠습니다.

현재 APM공식 사이트가 사라진 관계로 아래 URL에서 다운받겠습니다.


http://kldp.net/apmsetup/release/


아래 이미지의 제일 아랫부분에있는 2010010300.exe 버전으로 받겠습니다.



혹시 Host PC에서 다운받으셨다면 드래그해서 가상환경을 옮겨주세요.

더블클릭하여 실행시켜주시고 한국어로 선택하겠습니다.



다음 -> 동의함 -> 다음 -> 설치 로 쭉쭉 넘겨주세요.



설치가 완료되면 이렇게 나오는데 APMSETUP 7 for win32 실행하기만 체크하고 마침을 눌러줍니다.


설치가 정상적으로 진행 되었다면 다음과 같은 화면이 나올껍니다.



자, 이제 127.0.0.1 혹은 localhost/ 로 접속하게되면 다음과 같은 화면이 나올겁니다.



APM 설치를 완료했습니다.


저처럼 C드라이브에 설치를 하셨다면,

'C:\APM_Setup\htdocs' 경로에 웹페이지를 위한 .php, .html등의 파일을 넣게되면 됩니다.

우리가 사용할 wordpress 또한 'C:\APM_Setup\htdocs' 경로에 설치하게 될 것입니다.


자, 이제 Mysql을 들어가봐야겠죠? 

아래 이미지의 화살표가 가리키고있는 URL을 클릭하거나 localhost/myadmin/을 입력하게되면 phpMyAdmin 페이지로 넘어갑니다.




기본 사용자명과 암호는 root, apmsetup 입니다.

로그인을 하시면 아래와 같이 나옵니다.



사용권한 -> 새 사용자 추가



아이디 패스워드를 python으로 전체적 권한을 모두 체크하고 오른쪽 아래 실행을 누르겠습니다.



데이터베이스 -> 새 데이터베이스 만들기 ( wordpress 입력 ) -> 만들기



Mysql 설정까지 끝났고, 이제 wordpress 설치를 해보겠습니다. 

아래의 URL에서 3.8.1 버전으로 받겠습니다.


https://wordpress.org/download/releases/


다운받은 압축파일을 풀어 'C:\APM_Setup\htdocs' 의 경로에 넣어줍니다.



자 이제 URL에 localhost/wordpress 라고 입력해줍니다.

아래와 같이 오류가 뜨는데 Create a Configuration File을 눌러준 다음에 나오는 페이지에서 Let's go 를 또 눌러서 넘겨줍니다.



뭔가를 입력하는 창이 나왔는데요.

사용자이름에 python 비밀번호에 python을 입력하고 넘어가겠습니다.



입력하고나면 필요한 정보라는 창이 뜨고 앞서 입력했던 사용자명과 비밀번호를 입력하고 이메일주소를 입력한 후에 워드프레스 설치하기를 눌러줍니다.


자, 이제 설치가 끝났습니다.

URL에 localhost/wordpress를 쳐보겠습니다.



성공했습니다. 

다음시간에는 오늘 구축한 환경으로 SQL Injection을 시작으로 여러가지 공격 기법들을 해보겠습니다.


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


 




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

Lord of SQL Injection 2번 풀이  (0) 2018.11.07
Lord of SQL Injection 1번 풀이  (0) 2018.11.07
SQL Injection / 쿼리 삽입을 통한 인젝션  (0) 2018.11.02
SQL Injection 이란?  (0) 2018.11.02
OWASP Top 10 이란 ?  (0) 2018.10.24
반응형




안녕들 하시죠 !


오늘은 그 유명한 SQL Injection에 대해 알아보겠습니다.


우선 KISA에서 배포한 ' 홈페이지 취약점 진단ㆍ제거 가이드 ' 와 OWASP TOP 10 자료를 참고해봤습니다.


아래에 파일 있으니 참고해보세요.


홈페이지 취약점 진단제거 가이드.pdf


OWASP Top 10 2017.pdf


SQL Injection 이란?


데이터베이스와 연동된 웹 어플리케이션에서 SQL 질의문에 대한 필터링이 제대로 이루어지지 않을 경우 공격자가 입력이 가능한 폼( 웹 브라우서 주소 입력창 또는 로그인 폼 등 )에 조작된 질의문을 삽입하여 웹 서버의 데이터베이스 정보를 열람 또는 조작을 할 수 있는 취약점.


한마디로 웹브라우저에 조작된 값을 입력하여 DB에 있는 정보를 건들 수 있게되는 취약점.


아래는 SQL Injection 동작 과정입니다.


「 OWASP TOP 10 


「 홈페이지 취약점 진단ㆍ제거 가이드 





아래는 취약점 확인 방법 및 판단 기준입니다.


「 OWASP TOP 10 


「 홈페이지 취약점 진단ㆍ제거 가이드 



아래에는 대응 방안입니다.

필터링을 통하여 공격자가 임의의 조작된 값( ex) 'or 1=1 -- )을 입력하는 것을 방지하는 것이 중요합니다.


웹방화벽 ( 공격 문자가 오기 전에 차단 )을 통해 모든 사용자 입력 폼( 로그인 폼, 검색 폼, URL 등 )을 대상으로 특수문자, 특수구문 필터링 규칙을 적용.

또는 개발 단계에서 시큐어 코딩을 적용하여 임의로 파라미터를 입력하지 못하도록 필터링 적용.


「 홈페이지 취약점 진단ㆍ제거 가이드 



뒤에 있을 게시물에서는 직접 SQL Injection을 해보고 Lord of SQL Injection 사이트에서 문제를 풀어볼 계획 입니다.


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

+ Recent posts