쿠키: 키 값의 형태로 클라이언트 정보를 로컬에 저장하는 역할로 문자열 정보가 패턴화 되어 있다.
세션: 주로 서버 측에서 클라이언트의 상태 정보를 저장한다. 브라우저가 종료될 경우 사라진다.
세션쿠키: 활성 웹 브라우저 세션이 있는 동안 저장된다. 브라우저를 닫을 때 삭제된다.
JWT: Json Web Token Json 포맷으로 클라이언트 속성을 Claim기반으로 저장, 토큰 자체를 저장하는 Self-Contained 방식으로 안전하게 전달.
공통점: 클라이언트 정보를 저장하는 역할을 한다. 세션과 세션쿠키, JWT는 브라우저와의 연결이 끊겼을 때 데이터를 제거한다.
차이점: 세션은 서버에서 가지고 있는 정보이며 쿠키는 서버에서 발급된 세션을 열기 위한 키 값(세션ID)이다. 클라이언트는 쿠키를 이용하고 서버는 쿠키를 받아 세션의 정보를 접근하는 방식으로 인증한다. 또한 세션 쿠키와 다르게 JWT는 토큰을 이용한 저장 방법을 따른다.
POST: POST를 통해 해당 URI를 요청하면 리소스를 생성한다. DB에서 INSERT에 해당한다.
GET: GET를 통해 해당 리소스를 조회한다. 리소스를 조회하고 해당 Document에 대한 자세한 정보를 가져온다. DB에서 SELECT에 해당한다.
PUT: PUT를 통해 해당 리소스를 수정한다. DB에서 UPDATE에 해당한다.
DELETE: DLETET를 통해 해당 리소스를 삭제한다. DB에서 DELETE에 해당한다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
//GET 형식으로 preg_match를 이용해서 id 매칭 성공시 exit() 반환
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
//마찬가지로 pw 매칭 성공시 exit 반환
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin"); //result 값 id 가 들어가면 solve 반환하여 문제가 풀린다.
highlight_file(__FILE__);
?>
방법은 sql injection 대표 방법인 주석‘ or 1=1#, 공백 %20, %09 등을 이용할 것이다.
url에 공격을 할 것인데 ?id=’ or 1=1 --%20을 사용해서 우회를 하면 클리어
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id'] == 'admin') solve("cobolt");
//id값을 admin 으로 바꿔줄 경우 solve 함수가 실행된다.
elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>";
highlight_file(__FILE__);
?>
?id=’ or id=’admin’--%20을 사용해서 id 값에 admin을 또는 ‘값을 넣어 클리어
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~");
if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~");
$query = "select id from prob_goblin where id='guest' and no={$_GET[no]}";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("goblin");
//result id값이 admin일 경우 solve 함수 호출
highlight_file(__FILE__);
?>
화면 상에 id 값이 guest로 고정되어 있다. 2번처럼 명령어를 전달할 수 없는데 그 이유는 preg_match에서 ’ 와 “와 \를 필터링 한다. 대신 ‘ 값을 16진수로 바꾸어 공격할 것이다.
’는 0x61646D696E이다
'웹해킹 > 이론' 카테고리의 다른 글
[Whois] 정보보안교육 - 웹해킹 2주차(1) (0) | 2021.09.20 |
---|