전체 글
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 위에 문구가 하나 더 뜨긴하는데, IP 주소와 개인정보가 있으니 공개하지는 않겠습니다. 소스코드를 보니 str_replace를 통해 치환된 값이 127.0.0.1이면 풀리네요. $ip 값입니다. 하지만, extract 함수를 통해 딕셔너리 값의 키를 변수처럼 사용하는 것을 볼 수 있습니다. 바로 저기서 취약점이 터집니다. $_SERVER 딕셔너리를 먼저 extract 한 뒤 $_COOKIE 딕셔너리를 extract 합니다. 이 경우에 $_SERVER의 어느 한 키의 이름이 $_COOKIE의 어느 한 키의 이름과 동일하다면, 그 이름을 가진 변수는 $_COOKIE의 value(값)을 가지게 됩니다. 따라서, 원래대로라면 조작할 수 없는 REMOTE_ADDR..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ XSS 공격을 하라고 합니다. 저 문구 그대로 제출하니 no hack이라는 문자열이 나오네요. PHP에는 문자열 비교 함수의 종류가 두 가지 있습니다. 하나는 POSIX Regex이고, 다른 하나는 PCRE Regex 입니다. POSIX Regex 함수들 eregi, ereg 등의 장점은 속도가 빠릅니다. 하지만, 비교 중간에 NULL 문자를 만나게 되면 뒤의 문자가 남아있다고 할지라도 문자열의 끝이라고 판단하여 더이상 검사를 진행하지 않습니다. 이는 PHP 5.3+부터 발견되어 사용하지 않게 되었으며, POSIX Regex 계열의 함수들을 보완하고 정규표현식을 정교하고 유연하게 만든것이 PCRE Regex 계열의 함수입니다. POSIX Regex 계열의..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 어드민으로 로그인하라고 나오네요. 컬럼 이름이 id와 pw인가봅니다. blind sql injection 문제 같아요. admin' and if(true/false,1,0) or '1'='0을 id에 삽입해 injection이 되는지 확인해보겠습니다. 위의 결과를 통해 if문의 조건이 참일 경우 비밀번호가 틀림, 거짓일 경우 로그인에 실패라는 문구가 뜨는 것을 확인할 수 있었습니다. admin' and if(length(pw)>숫자,1,0) or '1'='0 위의 payload를 통해 admin 계정의 pw의 길이가 31 글자라는 것을 확인할 수 있었습니다. 이제 비밀번호를 알아내는 코드를 작성해보겠습니다. 이런 결과가 나오게 되는데 두 가지 방법이 떠오..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ blind sql injection 문제네요. 조금 귀찮지만, 이게 또 은근히 재밌긴합니다. 제일 간단한걸 적어보겠습니다. 어떤 질의를 통한 결과 값을 출력하는 것이 아닌 참/거짓 여부만 알려주는 것 같네요. 비밀번호를 틀렸을 땐 어떻게 될까요? 그저 로그인에 실패했다고만 뜨네요. 없는 아이디 비밀번호로 로그인 시도하면 어떻게 될까요? 똑같이 로그인에 실패했다고 뜹니다. 이제 sql injection을 시작해보겠습니다. 제일 만만한 부분은 아무래도 id겠죠? guest로 시작해보겠습니다. 오 새로운 결과입니다. 예상되는 쿼리문은 다음과 같습니다. select id from TABLE_NAME where id = '{}' and pw = '{}' 정확하진 ..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 제한시간 2초 안에 무언가를 보내야 문제가 풀리는 듯 합니다. 소스를 보았더니 이렇게 나와있습니다. captcha란이 captcha_의 값과 일치하고 id와 cmt란이 무언가로 채워져있어야 문제가 풀립니다. 2초 안에 이를 작성해서 보낸다는 것은 말도 안되는 일이죠. 손 엄청 빠르면 될지도 ㅋㅋ 뭐 파이썬으로 풀어도 되고, 여러가지 방법이 있겠지만 나는 콘솔 창을 통해 풀었습니다. 제가 작성한 payload는 이렇습니다. lv5frm.id.value="1"; lv5frm.cmt.value="4"; lv5frm.captcha.value=lv5frm.captcha_.value; lv5frm.submit(); id와 cmt에는 아무 값이나 채워주고, captc..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 처음에 들어있던 값을 그대로 보내니 어드민이 아니라고 합니다. guest로 보내보겠습니다. guest로 로그인이 되었습니다. 하지만 이로써는 뭔지 알 수 없기에 쿠키를 확인해봤습니다. 뭔가 있죠? 편하게 Chrome의 EditThisCookie를 이용해보겠습니다. 마지막에 '=='으로 끝나는 것을 보아 base64로 인코딩 되어있는 것 같네요. 온라인 디코더가 많으니 이용해봅시다. md5로 인코딩 되어있는 문자열이 나오네요. guest -> md5 인코딩 -> base64 인코딩을 한 듯 보입니다.(아직 확정X) 위에서부터 차례로 guest를 md5 인코딩, userid에 있던 값을 base64 디코딩한 결과입니다. 원래대로라면 똑같은 값을 가져야하지만,..
※ 문제될 시에 비공개 처리하도록 하겠습니다. ※ 검열은 %20, /, (, ), |, &, select, from, 0x 을 하고 있네요. no는 문자열이 아니고 제일 끝에 위치해있으니 주석처리할 필요가 없겠네요. 0 or no=2를 입력해주면 될 것 같습니다. 하지만, %20은 검열되니 \t 즉, %09를 사용하면 됩니다. payload 0%09or%09no=2 주소창에 입력하세요. 이유는 입력란에 입력하면 한 번더 인코딩되어 %가 %25가 됩니다.