MySQL에서 가용한 Error Based Attack은 크게 두 분류로 나눌 수 있다. 첫번째는 GROUP BY, POLYGON, EXP, XPATH와 같은 기능을 사용하여 에러메시지에서 쿼리가 실행된 결과값을 extract하는 direct한 방식이고, 두번째는 MySQL의 조건에 따라 무조건 에러가 발생하게 하는 indirect한 방식이다. Direct 방식은 쿼리 한 번으로 특정한 값을 바로 extract할 수 있다는 점이 강력하나, MySQL Server의 버전과 웹 서비스에서의 SQL 에러 출력 유무에 따라 실행 가능 여부가 달라지기 때문에 범용성이 떨어진다는 단점이 있다. 이와 달리 Indirect 방식은 바로 값을 extract 할 수는 없지만 범용성이 뛰어나다는 장점이 있다. 이 글에서는 ..
내가 운영하는 워게임에 가끔 중복 인증에 관한 문의가 꾸준히 들어왔었는데 어이없게도 오늘에서야 그 이유를 알게 되어 블로그에 글을 포스팅하게 되었다. 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..
Bypassing with specialchars in XSS Exploit 가끔 XSS 공격을 하다보면 다양한 WAF, 혹은 어플리케이션 자체의 필터링에 걸리는 경우가 발생한다. 이 경우엔 Javascript의 자유도(?) 덕분에 쉽게 우회할 수 있는 여지가 있다. 이러한 Javascript의 자유도는 서로 다른 객체 타입끼리의 연산을 수행하는 과정에서 발생하게 된다. 다음과 같은 예시 상황을 보자. [1,2,3,4]+"hello world" // "1,2,3,4hello world" 위의 경우엔 number로 이루어진 배열(Object)과 문자열간의 concat 연산을 하는 경우이다. 보다시피 object가 string으로 변환되어 있는 결과를 얻을 수 있다. 이러한 관점으로 조금 더 다채로운 객체와..
CTF에서 XSS exploiting 문제가 나오면 유용하게 사용할 수 있는 페이로드들. confirm() confirm`` (((confirm)))`` co\u006efirm() new class extends confirm``{} [8].find(confirm) [8].map(confirm) [8].some(confirm) [8].every(confirm) [8].filter(confirm) [8].findIndex(confirm) 아래의 Array 기반으로 함수를 실행하는 방식은 Javascript의 callback 함수를 이용하여 confirm() 함수를 실행시킨 것이다.
레드벨벳 웬디 {% debug %} : list all variables{{ object | listme }} : same with dir(object){{ object | getme:"asdfasdf"} : load object.asdfasdf 이 외에도 django template filters 를 이용하면 도움을 얻을 수 있음.
XSS 취약점을 발견하고 나서 공격을 하려고 하는데 Cookie의 HTTP Only 옵션을 만나게 되면 상당히 난감해진다. document.cookie를 통해 Cookie를 가져올 수 없기 때문에, 아무리 XSS 취약점이 존재한다고 한들 일반적으로 사용되는 XSS Payload로 공격을 수행할 수 없다. 그러나 상황에 따라 XHR을 통해 victim의 쿠키를 가져올 수 있다. XHR을 통해 HTTP Request를 보내고 해당 요청에 따른 Response의 Header에서 얻은 Set-Cookie에서 사용자의 쿠키를 가로챌 수 있는 것이다. 하지만 이 방법은 Set-Cookie Header가 존재할 때만 가능하기 때문에 상황에 따라 가용 여부가 갈린다. 이렇게 HTTP Response header에서의 ..
레드벨벳 아이린 최근에 websec.fr 문제를 풀다가 i0n1c's object injection bypassing 기법을 알게 되었는데 유용한 트릭같아서 블로그에 공유해본다. static public function safeUnserialize( $serialized ) { // unserialize will return false for object declared with small cap o // as well as if there is any ws between O and : if ( is_string( $serialized ) && strpos( $serialized, "\0" ) === false ) { if ( strpos( $serialized, 'O:' ) === false ) { /..