728x90

전체 글 186

[nginx] 특정 요청에 대한 nginx 500

발단 이미지 업로드하는 api에 대해서만 전부 nginx 500에러가 발생하고 있었다. 해결 과정 먼저 nginx의 에러 내용을 확인해준다. 맥(홈브류)의 경우 다음과 같이 입력한다. cd /opt/homebrew/var/log/nginx/tail -f error.log 에러가 다음과 같이 확인되었다. client, server, request를 파악해서 현재 발생한 오류를 찾는다. 나는 하나의 서버만 개발하고 있는 상태라 request, 시간만 확인하면 바로 확인할 수 있었다. "/opt/homebrew/var/run/nginx/client_body_temp/0000000005" failed (13: Permission denied), client: 127.0.0.1, server: www.tandan..

[swagger] Uncaught ReferenceError: SwaggerUIBundle is not defined at window.onload

문제스웨거를 설치하고 세팅한 뒤 localhost 에서는 정상적으로 스웨거가 확인되나, 배포한 서버에서는 정상적으로 스웨거가 확인되지 않고 SwaggerUIBundle is not defined 오류가 확인되었다.  해결 방법 SwaggerModule.setup('api/docs', app, document, { swaggerOptions: { persistAuthorization: true, }, customSiteTitle: 'API Docs', customfavIcon: '/favicon.ico', customJs: [ 'https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui-bundle...

개발/프로젝트 2024.10.29

[prisma] 서비스 레이어를 거치지 않고 aop개념으로 로직 구현하기

계기개인프로젝트를 진행하면서 이메일 암/복호화를 구현하던 중, 문득 무언가 불편함을 느꼈다. 결국 이메일을 암호화해서 저장하게 되면, 이메일을 조회할 때 이메일을 암호화해서 조회, 그리고 조회한 뒤에 클라이언트에게 보여질 땐 복호화되어야 하기 때문에 이메일을 클라이언트에게 보여주기 위해서는 동일 로직을 여러번 거쳐야 했다.  인증 / 인가를 별도로 매번 구현하는 것이 아니라 UseGuards나 UseInterceptors 데코레이터를 통해 관심사를 분리하는 것처럼 db에 접근할 때 항상 prisma를 통해 접근하기 때문에 prisma 에서 email 필드에 대해 암/복호화 과정을 거치는 부분을 세팅한다면 암/복호화를 놓치는 휴먼이슈나 가독성 등 여러 측면에서 괜찮을 것 같다는 생각이 들었다.   과정처음..

개발/프로젝트 2024.10.09

10주차 xss 2 쿠키 탈취

웹개발하는 입장에서는 쿠키가 탈취되지 않도록 httponly를 통해 클라이언트에서 접근할 수 없도록 하거나, Https 로만 허용하도록 secure설정을 하곤 했다.    내가 웹해킹을 배우는 이유는 여기에 있다. 어떻게 공격이 들어오는지를 모르니까 대비한다고는 하지만 어정쩡한 것 같아서 어떻게 공격을 하는지 제대로 알고싶어서였다. 그리고 이번 주차에서 시원하게 배워가고 있다.  쿠키를 어떻게 탈취할 수 있을까?지난 주차에서 xss 탈취 방법으로 stored, reflected xss를 배웠다. 여러 xss의 아이디어들 중, 먼저 강의에 나온 대로 stored 방식을 이용해서 html 스크립트에 자바스크립트 코드를 이용해서 의도된 url에 접근하도록 하고, 이를 통해 쿠키를 탈취하는 방법을 진행해보려 한..

9주차 xss 파헤치기

어느새 9주차에 접어들었고, 그간 포스팅은 못했지만... ㅠㅠ 그래도 열심히 수업은 듣고 있다. sql 인젝션에 대해 여러 방면으로 배웠지만 아무래도 원인과 방법에 대해 습득한 이후에는 본업이 우선이라는 생각이 들었다. 애초에 공격이 들어오는 부분을 막기 위한게 내가 배우는 이유이기 때문에..! 기존에 알고 있던 Prepared statement로 대응하는 것 외에 order by 등 대응이 어려운 부분들을 배울 수 있었고, 사실 이 부분은 현대의 orm은 이미 내장되어있다. 결론적으로는 입력값에 화이트리스트 필터링을 주어야겠다. 공격 차단도 그렇지만, 입력값에 불순한 의도가 들어오는 것 자체를 막아내야겠다는 생각을 하고 있다.     아무튼 다음 배우는 공격 방법은 XSS다. XSS는 cross sit..

[aws alb | jenkins] 오토스케일링으로 인해 변경된 Private IP로의 접속

문제점 현재 디폴트로 만들어둔 ami 이미지를 통해 private 인스턴스를 오토스케일링하고 있고, 배포시 다음과 같은 과정중에 있다.  - 소스코드 github push- Jenkins에서 ssh 스크립트로 Bastion Host 접속- Bastion에서 각각의 ssh 스크립트로 Private Host 접속- 각각의 Private에서 소스코드 git pull 후 서버 실행 스크립트~~   그리고 aws에서는 서버가 죽게 되면 이를 체크하고 만들어둔 ami 이미지를 그대로 새로운 인스턴스로 복각하여 aws에 입력해둔 명령어를 포함해서 작동하면서 서버가 열리게 되어 정상적으로 오토스케일링은 가동되고 있다.  문제는 배포시에 ssh스크립트로 직접 bastion에서 private로 접근할 때 ip주소를 알아야..

개발/프로젝트 2024.06.04

[CTF | JavaScript] segfault practice - SQL Injection 2

이번 문제는 그간 배운 방법들을 각각 응용해서 풀었다. 사실 문제가 의도하는 바 대로 푼 것은 아닌 것 같아서, 조금 더 공부해봐야 할 것 같다.  처음에 아무 것도 입력되어있지 않은 상태로 검색하면 아무 것도 나오지 않고, normaltic으로의 검색을 유도하고 있다.  normaltic으로 검색하면 id에 normaltic, info에 my name is normaltic,doldol 로 검색하면 id에 doldol, info에 Music is my life가 나온다. normaltic' or '1 로 입력해보면 아래와 같이 id에는 입력한 값이 그대로 나왔다. 하지만 doldol' 로 입력하면 id에도 아무것도 나오지 않았다. doldol' # 을 입력하면 다시 값이 나왔다.  여기서 유추할 수 있..

[CTF] segfault practice - SQL Injection 1

이번 문제는 테이블을 검색하는 칸이 주어져 있고, 다른 데이터를 찾아내는 문제다.  sql인젝션에서 가장 중요한 포인트는 구현되어 있는 sql문이 정확하게 어떤 구조로 되어있는지 파악하는 부분이라고 생각이 되었다.  그래서 먼저 나와있는 값의 대부분 a가 들어있어서 a를 검색했는데 a가 속한 3개의 값이 나왔고, a ' or '1 를 입력했는데, 전체 값이 나왔다.  여기까지의 힌트를 통해 2가지를 유추했다.- sql문이 적어도 like 를 이용한 구문이라는 것- 4개를 뽑아낸 것이 아니라 전체 값이 저 4개라는 것 (보이는 데이터는 숨겨진 데이터와 아무런 상관이 없다고 생각했다.) 그래서 다른 테이블의 값을 찾아내는 것을 목표로 했다. 1. 테이블 목록 조회a%' UNION SELECT table_na..

[CTF] segfault practice - Secret Login

문제에서 알 수 있는 힌트는 다음과 같다. - 로그인할 수 있는 아이디와 패스워드- 관리자 계정이 존재   문제들을 풀다보니 로그인하는 과정에서 쿠키를 변조할 수도 있었고, 리다이렉트할 때 패킷을 변조할 수도 있었다. 그래서 패킷을 확인했을 때 role이 별도로 있는지 확인했는데 내 좁은 시야에서는 확인할 수 없었다.  sql인젝션 가능성을 확인해보자. normaltic1' OR '1'='1 #userId에 위와 같이 넣고 패스워드를 아무거나 입력했을 때 normaltic1 로 로그인되었다. 다른 문제 중에는 패스워드가 별도 sql로 있어 #으로 주석처리해도 생략되지 않는 경우들이 있었는데, 이 문제는 그렇지는 않았다. 아무튼 일단 인젝션공격이 가능한 상태라는 것이다. 패스워드랑 상관없이 normalti..

[CTF | JavaScript] segfault practice - Pin Code Crack

문제문제는 간단했다. 핀번호 4자리를 입력하는 문제다. 해결과정 먼저 1234를 때렸는데 get방식으로 쿼리에 넣어서 보내고 있음을 확인했고, 혹시 틀렸을 때 제한이 있는지 문구는 없긴 했지만 여러번 시도했는데 딱히 제약은 없었다. 그러면 뭐 0부터 때려보는게 곧 답인 것 같다.  let count = 0; while (true) { const response = await fetch( `http://ctf.segfaulthub.com:1129/6/checkOTP.php?otpNum=${count}` ); const text = await response.text(); console.log("응답값: ", text); ..

728x90