Portswigger 에서 제공하는 SQL Injection 학습 및 Lab 실습을 마쳤다.
2025 SQL 현재 동향
"요즘도 SQL Injection이 쓰일까?" 6의 예방법을 학습하면서 이런 생각이 들었다. Prepared Statement, ORM, WAF가 널리 사용되면서이미 사라진 취약점처럼 느껴졌다. 이렇게 간단하게 방어가 되는 공격이라면, 예전은 몰라도 이제는 많이 사용 되지 않을 것 같았다. 그래서 요즘의 SQL Injection은 어떤 식으로 인식 되고 있는지 동향을 살펴봤다. 확실히 “옛날 공격 기법”이라는 인식이 점점 강해지고 있었다.
하지만 실제 통계를 보면, SQL Injection은 지금도 현업에서 꾸준히 발견되고 있었다. 국내 보안업체 Monitorapp의 2025년 웹 공격 동향 보고서에 따르면[1], SQL Injection은 전체 웹 공격 트래픽 중 약 25~37%를 차지하는 것으로 분석된다. 특히 보고서에 따르면, 복잡한 UNION 쿼리보다 True or False로 비교적 단순한 Blind SQL을 자동화하여 대량 공격에서 종종 쓰이는 것 같다. 또 Blind SQLi은 공격 패턴이 아니라 '논리 조건'에 가까워 보이기 때문에 WAF에서 차단하기 힘든 것도 한 몫하는 것 같다.
또한, Aikido Security가 공개한 분석[2]에 따르면, SQL Injection은 전체 취약점 중에서 차지하는 비율은 감소했지만완전히 사라지지는 않았다. 오픈소스 소프트웨어 취약점 중 약6.7%, 클로즈드 소스(상용 소프트웨어)에서는 약10% 가 발견되었다. 즉, 최신 프레임워크 환경에서는 줄었지만 레거시 코드, 커스텀 SQL, 내부 시스템에서는 여전히 발견된다.
여담으로, OWASP Top 10[3]에서는 과거처럼 “SQL Injection 단독 항목”이 아니라 Injection 카테고리로 통합되어 관리되고 있다. 이는 SQLi가 사라졌기 때문이 아니라, SQL Injection, Command Injection, LDAP Injection 등이공통적인 설계 결함에서 발생하기 때문이다. 즉,위험도가 낮아진 것이 아니라 분류 방식이 바뀐 것에 가깝다.
결과적으로, SQL Injection은 여전히 상용 웹사이트 10% 정도에서는 발견되는 취약점이며, 사라지지 않았다. 좀 더 자세하게는,
UNION SQLi는 줄었지만, Blind / Time-based SQLi는 여전히 현실적이며
공격 시나리오: OSINT(직원 정보 수집) -> Imersonation(사칭) -> Phishing(직원 피싱) -> VPNcred(직원용 VPN 계정 탈취) -> Pivot(VPN 계정 탈취 및 내부망 이동, DB 액세스)
공격 시나리오
내부 인프라 정보: 실제 타깃(raccoooncoin.site)의 내부 인프라 정보를 명세해놨다. 타겟 페이지가 어떤 식으로 구성되어 있고, 굴러 가는지 분석한 부분이다.
내부 인프라 정보
www.raccooncoin.site → Cloudflare → Origin: Oracle VPS(140.238.x.x): 사용자가 raccooncoin.site에 접속하면 Cloudflare로 먼저 들어오고, Cloudflare가 내부적으로 Oracle VPS(140.238.x.x)에 트래픽을 전달하는 구조. 공격자는 이를 역으로 OSINT로 파악하여 "진짜 서버는 140.238.x.x 대역에 있다"라고 기록한 것.
raccooncoin.site/singin.html → 오타 기반 피싱 탐색: 원래는 로그인용 페이지인 signin.html 이어야 할 텐데 오타가 발생한 페이지이다. 피싱 페이지로 악용하기 좋은 소스가 될 수 있어 메모해 둔 듯.
vpn.raccooncoin.site → 직원 VPN 포털: 내부 직원들이 사용하는 Staff VPN 로그인 페이지일 확률이 매우 높다.
(2) Social Engineering Plan
OSINT(직원 정보 수집) -> Imersonation(사칭) -> Phishing(직원 피싱) -> VPN cred(직원용 VPN 계정 탈취) -> Pivot(VPN 계정 탈취 및 내부망 이동, DB 액세스) 중 Imersonation(사칭) 부분에 대한 상세 계획이다. plan.txt 에 나온 시나리오대로라면 socket puppet 이 있을 것이다. 이들의깃헙 레포와 링크드인도 있을 것이다.
(3) Phishing Scenario
공격자가 현재까지 파악한 타겟 상세 정보들 및 이를 바탕으로 현재까지 세운 시나리오 정보
현재까지 파악한 타겟 상세 정보
VPN credentials for C-levels. (Check db in the zip file): 이미 임원 정보를 해커 쪽에서 털었고 zip파일 내 db에 이게 포함되어 있음.
Some internal IP ranges: 10.10.0.0/16. : 타겟 사이트의 내부망 주소까지 파악된 상태
Evidence that RedRaccoon TI (threat-intel@redraccoon.kr) had "pending" VPN account : 방어팀이 내부 VPN 계정을 신청한 기록이 보였음. 공격자는 이를 보고 공격 표면이 더 넓다는 것을 알고 있음
198.51.100.44 → used for failed VPN attempts against "groot". Might be previous attacker or misconfigured testing box.: 이미 공격 당한 흔적이 있음→ 여기 저기서 인기 많은 타겟.
185.199.111.153 → GitHub pages / static hosting. Seen as login source for rr-ti1/wget → maybe Red Raccoon scanner. : RedRaccoon 팀이 wget 등으로 GitHub Pages에 올린 자료(흔히 OSINT용)을 스캔했을 확률이 있다. 즉, 방어팀(위협 인텔팀)의 분석 활동 흔적을 공격자가 보고 있다.
이를 바탕으로 한 인프라 구축 계획
Stand up redirector on cheap VPS. : 이건 우리가 이미 발견한 리다이렉트 서버의 존재(http://140.238.194.224)
Use it as: - HTTP(S) phishing landing page - SSH C2 pivot (port 80/443 masquerading) : 이 부분을 통해 현재 시나리오에 쓰인 서버들이 HTTP 리다이렉션 형태로 구성 되었음을 알 수 있다. 구체적으로는, 사용자가 피싱 페이지에 입력한 정보는 바로 공격자 서버로 넘어가는 것이 아니라, 이 경유지 서버를 한 번 거쳐서 공격자 서버(C2, Command & Controll)로 넘어간다.
(4) Future Plan
[ ] Finish fake LinkedIn + GitHub profiles and age them for a few days. : 가짜 링크드인 및 깃헙 페이지 설정 및 며칠간 계정을 숙성(aging)시키는 과정까지 해서 계정의 신뢰도를 높이는 작업까지 계획한 상태.
[ ] Join Korean security / crypto groups and casually interact to build trust.: 자연스럽게 한국 보안, 크립토 커뮤니티에 들어가 자연스럽게 질문하고, 활동하고, 댓글 남기면서 신뢰를 쌓으려는 전략.
[ ] Finalize phishing email template in both English and Korean.: 다국어 피싱 이메일 준비.
[ ] Deploy cloned VPN login page and test credential logging.: 앞서 발견했다고 알려진 VPN 포털 페이지를 클론 및 로그인 폼을 공격자 서버에 재현, 입력한 아이디/비밀번호를 공격자 서버에 저장(logging)
[ ] Prepare OSINT trail so that investigators (CTF players) can: - find this notes file - pivot from leaked SQL → email addresses → social media → fake profiles → onion/redirector infra. : 사실상 이 부분이 가장 중요하다. 우리를 위해 남겨둔 문제 출제자의 힌트이다. "leaekd SQL 파일이 있고, 여기서 가계정 이메일 주소를 알 수 있으며, 해당 가계정들의 소셜 미디어(위에서 언급된 링크드인, GitHub이겠지), 가계정 정보 알아내고, 이후 경유지 서버를 통해 최종 공격자 서버(C2)까지 알아낼 수 있다"는 것을 이 부분에서 짐작할 수 있다.
2️⃣ db.sql:
decoy flag 발견 / FLAG{KOREAN#1COMMUNITYRR}
- socket puppet 을 만드는데 사용된 듯한 sql 문이다.
- 2개의 socket puppet 이 있어보인다. Soyeong Park, Tony Racoon.
- 그리고 퀴즈 풀이에 쓰이는 것으로 보이는 중간 FLAG. 몇 번 문제 정답인지는 모르지만 우선 확인만 해두자.
3️⃣ Source Code.zip: 공격 시나리오에 쓰인 C2 서버의 소스 코드이다. README.md를 읽어보면 더 자세히 알 수 있다.
💡 잠깐 : HTTP Redirect 개념 이해하기
지금까지 경유지 서버(http://140.238.194.224:8081)를 발견했고, nmap 포트 스캐닝을 통해 열린 포트를 확인했다.(22❌, 80❌, 8081✅). 그리고 열려 있는 8081 포트로 들어가, 공격자 추적을 위한 몇 가지 단서들(타겟 서버 아키텍처, 타 공격자 여부, 내부 인프라 정보, 전반적인 공격 시나이로 등)을 얻을 수 있었다. 이렇게 얻어낸 전반적인 공격 시나리오는 처음 문제에서 주어진 것과 같다.
- SSH 통신: Secure Shell(SSH). 네트워크로 안전하게 다른 컴퓨터에 접속해 명령, 파일 전송, 터널링을 할 수 있게 만드는 통신 프로토콜.즉, 원격 서버에 로그인해서 Linux 터미널을 쓰게 해주는 것. - SSH 접속이 왜 강력한 이유 : SSH에 성공한다는 건 곧, 상대 서버의 OS를 직접 사용할 권한을 얻는다는 것.
- Socket 통신: 컴퓨터끼리 데이터를 주고받기 위해 만들어 놓은 ‘가상의 파이프(연결 통로)’. 소켓(socket)이 바로 이 통로를 “열고/읽고/쓰는 주체”. OS 내부에서는 소켓이 파일처럼 동작.
- 비컨(beacon): 해커가 설치한, 공격자 C2 서버로 주기적으로 연결을 시도하는 프로그램. 타깃 PC 안에 몰래 심어놓은 “스파이” 같은 것.
1. 리다이렉터 22/tcp 로 ssh 접속: 공격자 서버가 피싱 사이트 사이에 경유지 서버 포트 포워딩을 만들기 위해 접속.
ssh -i id_ed25519 spark@redirector_ip
* 포트 포워딩(Port Forwarding) 개념과 사용 이유 :
2. (ssh) 리다이렉터:2222 -> 팀서버:443 Remote Port Forwarding : 경유지 서버의 포트 2222번을 팀서버(공격자 서버) 443번이랑 연결해줘.
이 단계를 통해 리다이렉터 2222 포트 == 팀 서버 443 포트(SSH 터널을 이용한 가상의 직통 회선) 설정. 경유지에 ‘공격자 서버로 향하는 비밀문’ 2222번을 하나 만든 것이라고 생각하면 됨.
3. (socat) 리다이렉터:443 -> 리다이렉터:2222
sudo socat TCP-LISTEN:443,fork TCP:localhost:2222
socat 통신 이용해(외부/피싱사이트) -> 경유지 443포트 == 경유지 2222 포트 == 공격자 서버 443 포트 설정. 이렇게 되면서 “리다이렉터 443 = 팀 서버 443” 으로 생각해도 될 정도가 됨.
이 단계는 왜 필요한가? SSH Remote Port Forwarding(-R)은 리다이렉터의 ‘임의 포트(2222)’에는 바인딩할 수 있지만, 시스템 포트(1~1023, 예: 443(HTTPS 포트) )에는 직접 바인딩할 수 없기 때문. 즉, SSH 기술적 제약 문제.
socket 통신은 왜 필요한가? 그러나 타깃이 콜백할 포트는 반드시 443 이어야 한다. 왜냐하면, 많은 조직 방화벽은 아웃바운드 443만 허용하기도 하고, C2 비컨 트래픽은 HTTPS처럼 보이게 하려고 443 사용하기 때문.
1~3단계에서 공격자가 설정한 포트 포워딩으로, 공격자의 비컨이 경유지를 통해 인터넷으로 나갈 수 도 있고, 반대로 인터넷에서 들어오는 정보 역시 경유지를 통해 공격자 서버로 들어올 수 있게 됨.
정리하면, 이번 단계에서는 경유지 서버 탐색을 통해 해당 경유지가 ssh 연결을 통해 공격자 서버에 연결되어있다는 것을 알 수 있음. 위는 HTTP Redirect 설명 예시 그림이고, 현 문제에서는 443(HTTPS) 포트 대신 80(HTTP)가 사용되었음. 정확히 어떤 포트로 연결되었는 지 등의 자세한 사항은 추후 탐색으로 통해 알 수 있을 듯.
경유지 서버에 "spark"이라는 누군가가 id_ed25518이라는 private key를 가지고 접속을 시도한 게 보인다.
expect는 공격자가 자동 입력을 수행하기 위해 넣은 스크립트로, "Enter passphrase"라는 ssh passphrase 입력하라고 뜨면 send 뒤에 보낼 말을 자동으로 보내라, 는 의미이다. 따라서 해당 부분은 공격자가 경유지 서버로 본인 진짜 서버에서 접속한 흔적이며, 편의성을 위해 ssh 연결을 자동화 시키기 위한 명령어의 흔적으로 보인다.
더하여, ssh private key 로그인은 이러한 passphrase 를 추가 요구하는 보안 강화 설정을 적용할 수 있다. 여기도 그런 케이스이며, send 뒷 부분이 여기서 설정된 passphrase임을 알 수 있다. 나아가 보내는 문자 "" 안 끝쪽에 개행 문자 \r을 넣어준 것은 Enter를 눌러 전송하는 행위와 같다. 따라서 실제 passphrase는 "SSH@@RACOONCOIN!@#\r" 중 개행문자 \r을 뺀 "SSH@@RACOONCOIN!@#" 가 된다.
추후 리다이렉트 서버에 ssh 연결해서 접근할 때 Enter passphrase 어쩌구가 뜨면 "SSH@@RACOONCOIN!@#" 를 복붙해 넣으면 된다.
퀴즈를 따라가는 게 힌트인 줄 모르고 쌩 바닥부터 뚫느라 처음엔 중구난방으로 풀었다. 다 풀고 퀴즈를 #1부터 하나하나 풀며 정리하는 글을 쓰니 애매하게 알던 개념들도 글로 정리하며 제대로 이해하게 되는 시간이었다.
퀴즈를 풀고 다시 퀴즈별로 문제 풀이 복귀를 하는 지금에도 느끼지만, 레드 티밍 공격은 이렇게 글쓰듯이 매끄럽게 한 방향으로 한 번에 쭉- 풀리는 게 아니라, 계속해서 저 몇 단계를 다시 오가는 과정인 것 같다. 언젠가 실력이 쌓이면 한 단계에서 필요한 정보를 모두 한 번에 찾을 수 있을 정도로 실력이 쌓일 수 있으면 좋겠다.
간단하지만 많이 배울 수 있던 RCity 실전 Threat Intelligence 추적 챌린지10 였다.