b01lers CTF, Scrambled write-up

약간 게싱?이기도 하면서 스크립트 짜면 쉽게 풀 수 있었던 문제같다. 문제 사이트로 들어가면 다음과 같은 화면을 볼 수 있다. [*] url : http://web.ctf.b01lers.com:1002/ 이렇게 캡처 사진만 보면 별게 없어보이지만, html 소스를 보면 더 별게 없다. 이게 끝이다. 보통 이런 경우 robots.txt 에 숨겨진 디렉터리가 존재하거나, Cookie에 무언가 값을 넣어두거나, .git, index.php~ 등의 소스유출을 의도하는게 대부분이다. 이 문제에서는 쿠키에 이상한 값을 넣어놓았다. 쿠키를 보면 알 수 없는 값들이 존재한다. 뭔지 영문을 알 수가 없는 이 값 때문에 '게싱'으로 푸는 문제임을 직감하고 그냥 넘어가려고 했지만, 이런 ㅈ밥문제는 내가 뚝배기를 깨버려야 한..

CONFidence CTF 2020 Teaser write-up

Web Cat web XSS 풀자마자 왜 이런 벡터를 생각을 못했는지 자책을 하기도 했던 문제이긴 하지만, 풀이 자체는 깔끔하고 공격 연계 벡터도 내가 생각도 못한 부분에서 발생해서 나름 신기한 문제였다. function getNewCats(kind) { $.getJSON('http://catweb.zajebistyc.tf/cats?kind=' + kind, function(data) { if (data.status != 'ok') { return; } $('#cats_container').empty(); cats = data.content; cats.forEach(function(cat) { var newDiv = document.createElement('div'); newDiv.innerHTML =..

websec.fr level19 write-up

Captcha가 있길래 이 문제를 풀기 위해서 머신러닝으로 저기에 있는 글자를 알아와야하나 생각이 들어서 지금까지 굳이 풀려고 하지 않으려고 했지만, 오늘 이 문제 소스를 보니까 꽤 쉬운 것 같아서 write-up을 작성해보려고 한다. 참고로 아직 풀진 못했다. 로컬에서는 분명히 풀리는데 서버에서는 안풀리는 문제다. random.php의 소스이다. 여기서 microtime(true)로 seed를 설정하는데 여기서 취약점이 발생한다. srand() 함수를 통해 같은 값을 설정할 경우 rand() 의 값이 똑같아진다. 다음 코드를 예를 들어보면 이해하기 쉽다. #!/usr/bin/env php

websec.fr level13 write-up

고등학교 1학년 땐가 페이스북에서 Sakuya Izayoi님께서 "PHP에서 성능 개선을 위한 유용한 팁"이라는 제목으로 어떤 글을 하나 공유하신 적이 있었다. 여러가지 팁들이 있었지만, 가장 인상깊었던 팁 중 하나는 반복문의 조건에 함수가 들어가 있으면 그 함수는 반복문이 한 번 실행될 때마다 호출되기 때문에 성능 향상을 위해서라면 조건문에는 함수를 넣지 말라는 것이었다. 그게 사실 그냥 넘길 만한 사소한 것이어서 나에게는 적쟎은 충격이었기 때문에 아직까지도 반복문을 사용할 때면 머릿 속에 또렷이 그 문장이 새겨진다.( * 링크 : http://www.qdata.co.kr/bo/bbs/board.php?bo_table=pht&wr_id=77) 이 때 이후로 해당사항을 지키면서 코딩을 해왔는데 이걸 여기..

Lord of SQL Injection alien write-up

Exploit point #1 해당 문제에서는 두 가지의 쿼리의 문법적인 요소를 모두 만족해야 한다. 주석을 이용해서 이 문제의 SQL 문법적 조건을 완성시켰다. query : select id from prob_alien where no='#'#' \nunion select 0x61646D696E# query2 : select id from prob_alien where no=''#'#' \nunion select 0x61646D696E#' 주석 이후의 쿼리에서는 개행문자(\n)를 통해 escape 할 수 있다는 점을 이용해서 위와 같이 우회할 수 있다. Exploit point #2 이 부분을 보면 논리적으로 말이 되지 않는 것 같지만 timestamp나 random 같이 event에 따라 결과값을 ..

MySQL에서의 Error Based Injection에 대한 간단한 고찰

MySQL에서 가용한 Error Based Attack은 크게 두 분류로 나눌 수 있다. 첫번째는 GROUP BY, POLYGON, EXP, XPATH와 같은 기능을 사용하여 에러메시지에서 쿼리가 실행된 결과값을 extract하는 direct한 방식이고, 두번째는 MySQL의 조건에 따라 무조건 에러가 발생하게 하는 indirect한 방식이다. Direct 방식은 쿼리 한 번으로 특정한 값을 바로 extract할 수 있다는 점이 강력하나, MySQL Server의 버전과 웹 서비스에서의 SQL 에러 출력 유무에 따라 실행 가능 여부가 달라지기 때문에 범용성이 떨어진다는 단점이 있다. 이와 달리 Indirect 방식은 바로 값을 extract 할 수는 없지만 범용성이 뛰어나다는 장점이 있다. 이 글에서는 ..

메가스터디 SQL Injection 취약점

Attack Vector. 학교 정보를 수정하는 부분에서 발생하는 취약점이다. 해당 페이지에서 학교 검색을 하면 schCd(학교 고유코드)와 schNm(학교이름)을 설정하는데, 해당 입력값에 대한 적절한 검증 절차가 이루어지지 않은 채로 데이터베이스에 값을 저장하기 때문에 발생한다. Exploit. 개발자 도구를 이용해서 schNm의 value attribute를 수정할 수 있는데, 이를 `한국디지털미'+HOST_NAME()+'디어고등학교`로 설정하게 되면 HOST_NAME() 함수가 실행되고 string concatenation 연산이 수행되어 학교 이름에 HOSTNAME이 들어가는 것을 볼 수 있다. `한국디지털미'+CONCAT(0x3a6e766f3a, 0x52785443657a524b5641, 0x..

ch4n3-world의 중복 인증 이슈에 관하여

내가 운영하는 워게임에 가끔 중복 인증에 관한 문의가 꾸준히 들어왔었는데 어이없게도 오늘에서야 그 이유를 알게 되어 블로그에 글을 포스팅하게 되었다. router.post('/auth', async (req, res) => { let getChallengeByFlag = async (flag) => { let sqlData = await ChallengeAPI.getChallengeByFlag(flag); if (sqlData) return sqlData.dataValues; return null; }; let isSolvedChallenge = async (user_no, challenge_no) => { let sqlData = await SolversAPI.isSolvedChallenge(chall..

컴퓨터공학과 새내기가 수강신청하는 법

아래의 내용은 20학번 새내기로서 경희대학교 수강신청 올클리어에 성공하기 위해서 고군분투한 내용을 기록한 것이다. 1. 특정키 입력 금지 메커니즘 우회 🛰 요즘은 거의 모든 학교가 수강신청 사이트에서 특정 키 입력을 금지하고 있다. F5, 스페이스바, 엔터키 같이 빠르게 무언가 수행할 수 있도록 도와주거나, 팝업창을 마우스를 이용하는 것보다 빠르게 닫도록 도와주는 역할을 하는데, 이런 Functional key가 허용된다면 경쟁자들보다 높은 시간적 우위를 점할 수 있을 것이라고 생각해서 구현하기 시작했다. function noKeyCheck(){ if (event.keyCode == 116) { alert("F5키를 사용 할 수 없습니다."); event.preventDefault(); return fa..

Chrome Extension을 통한 수강신청 사이트 키 금지 기능 무효화

아직 20학번 새내기라서 수강신청을 해본 적은 없다. 그러나 주변에서 [Tab]와 [Spacebar]만으로 수강신청을 마스터할 수 있었지만 대학교 수강신청 사이트에서 이를 막는 추세라서 이제는 빠르게 수강신청하기가 어려워졌다는 소문을 들은 적이 있다. 오늘 학번을 발급받은 김에 이 현상을 확인해보려고 경희대학교 수강신청 사이트에 접속해보았는데 역시나 F5, 스페이스바 등의 키가 금지되어있었다. 해당 키를 금지하는 기능은 당연히 Javascript 단에서 onkeydown 등의 event를 일일이 검사하는 방식으로 수행될 것이라고 생각했다. 역시는 역시. 아래는 경희대학교 수강신청 사이트에서 키 입력 금지 메커니즘을 구현한 코드이다. function noKeyCheck(){ if (event.keyCode..