OWASP Top Ten은 웹 애플리케이션에서 가장 위험한 보안 취약점 10가지를 정리한 목록입니다.
전 세계 보안 전문가들이 제공한 데이터를 바탕으로 만들어지며, 매 몇 년마다 업데이트되어 최신 보안 위협을 반영해 목록을 갱신 합니다.
사용자가 허용되지 않는 기능이나 데이터에 접근하여 발생하는 보안 취약점 입니다.
암호화가 필요한 민감한 데이터를 암호화 하지않았을때 발생하는 보안 취약점 입니다.
외부로부터 입력받은 데이터를 제대로 검증하지 않고, 해당 데이터를 데이터베이스 쿼리나 운영체제 명령 등으로 실행하는 경우 발생하는 보안 취약점 입니다.
대표적으로 sql Injection이 있습니다.
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
보안적인 관점에서 적절하게 설계되지 않았을 때 발생하는 보안 취약점 입니다.
보안 요구 사항을 충분히 고려하지 않았거나, 위험 관리가 부족할 때 발생합니다.
시스템의 보안 설정이 잘못 정의되었거나, 제대로 구현되지 않거나 유지 관리되지 않을 때 발생하는보안 취약점 입니다. 이 취약점은 애플리케이션 스택의 어느 수준에서도 발생할 수 있습니다.
최신 보안 패치가 적용되지 않은 오래된 소프트웨어를 사용하는 경우 발생하는 보안 취약점 입니다.
사용자의 신원을 확인하고 인증하는 과정에서 발생하는 취약점입니다. 사용자가 올바르게 인증되지 않거나, 인증 정보가 안전하지 않게 관리될 때 발생하며, 공격자는 이를 통해 시스템에 무단 접근할 수 있습니다.
약한 비밀번호 정책, 비밀번호가 너무 짧거나 복잡하지 않으면, 공격자가 이를 쉽게 추측
다중 인증 미사용, 2단계 인증 같은 추가적인 보안 레이어가 없는 경우
비밀번호 저장의 불안정성, 비밀번호를 평문으로 저장, 안전하지 않은 해시 알고리즘을 사용
세션 관리 취약점, 세션이 만료되지 않거나, 세션 토큰이 쉽게 예측 가능한 경우
무작위 대입 공격(Brute-force attacks): 공격자가 모든 가능한 비밀번호 조합을 시도해 인증 시스템을 뚫으려는 공격입니다. 약한 비밀번호를 사용할 경우 쉽게 성공할 수 있습니다.
크리덴셜 스터핑(Credential Stuffing) 공격, 이는 유출된 사용자 이름과 비밀번호 목록을 사용해 다른 사이트에 무단 로그인을 시도하는 방식입니다.
소프트웨어나 데이터가 안전하게 보호되지 못하고, 공격자가 이를 수정하거나 변조할 수 있는 취약점입니다. 이 문제는 종종 업데이트, 데이터 처리, 코드 배포, 그리고 의존성 관리에서 발생합니다.
시스템 내에서 발생하는 보안 관련 이벤트들을 제대로 기록하지 않거나, 기록된 로그를 효과적으로 모니터링하지 않아 발생하는 취약점입니다.
공격자가 서버를 속여서 서버 측에서 임의의 요청을 보내도록 만드는 취약점입니다. 이 공격은 서버가 신뢰할 수 있는 클라이언트의 요청을 처리하는 동안 발생할 수 있으며, 공격자가 외부 시스템이나 내부 네트워크 리소스에 접근할 수 있게 됩니다.
const express = require('express');
const app = express();
// 역할 미들웨어 작성
function authorize(roles) {
return (req, res, next) => {
if (!req.user || !roles.includes(req.user.role)) {
return res.status(403).send('접근이 거부되었습니다.');
}
next();
};
}
app.get('/admin', authorize(['admin']), (req, res) => {
res.send('관리자 페이지');
});
const bcrypt = require('bcrypt');
async function hashPassword(plainPassword) {
const saltRounds = 10;
const hash = await bcrypt.hash(plainPassword, saltRounds);
return hash;
}
const mysql = require('mysql');
const connection = mysql.createConnection({ /* DB 설정 */ });
const username = req.body.username;
const password = req.body.password;
// todo: 입력 검증
connection.query('SELECT * FROM users WHERE username = ? AND password = ?', [username, password], (error, results) => {
if (error) throw error;
// 결과 처리
});
//입력 검증
function validateInput(data) {
// 정규식 이용, 알파벳과 숫자만 허용
const validDataPattern = /^[a-zA-Z0-9]*$/;
return validDataPattern.test(data);
}
app.post('/submit', (req, res) => {
const userInput = req.body.input;
if (!validateInput(userInput)) {
return res.status(400).send('유효하지 않은 입력입니다.');
}
// 데이터 처리
});
// Spring Security 설정
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() // CSRF 보호 비활성화
.authorizeRequests()
.antMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated();
}
}
const speakeasy = require('speakeasy');
// 사용자에게 2FA 비밀 키 제공
const secret = speakeasy.generateSecret({ length: 20 });
console.log(secret.base32); // 사용자가 입력할 비밀 키
// 인증 시도
const userToken = req.body.token;
const verified = speakeasy.totp.verify({
secret: secret.base32,
encoding: 'base32',
token: userToken
});
if (!verified) {
return res.status(403).send('인증 실패');
}
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.Console()
]
});
// 특정 사건 로깅
logger.info('사용자 인증 실패', { userId: req.body.userId });
const allowedUrls = ['https://example.com/api', 'https://anotherexample.com/api'];
function isValidUrl(url) {
return allowedUrls.includes(url);
}
app.post('/fetch-data', (req, res) => {
const userUrl = req.body.url;
if (!isValidUrl(userUrl)) {
return res.status(400).send('허용되지 않는 URL입니다.');
}
// 요청 수행
});
참고
https://www.reflectiz.com/blog/owasp-top-ten-2024/
SSL/TLS : https://howhttps.works/ko/https-ssl-tls-differences/
세션 하이재킹 : https://www.kaspersky.co.kr/resource-center/definitions/what-is-session-hijacking
크리덴셜 스터핑 : https://www.akamai.com/ko/glossary/what-is-credential-stuffing