본문 바로가기

Web

(22)
[Dreamhack] Web Hacking STAGE 2 STAGE 2. Background: HTTP/HTTPS 인코딩 표준 1) 아스키 - 알파벳과 특수 문자 등을 표현함 ex) 1000001을 아스키로 변환하면 A가 됨 2) 유니코드 - 모든 언어의 문자를 하나의 표준에 담겠다는 목표로 제정되었음 - 한 문자는 최대 32비트로 표현되어 약 42억개를 표현 가능함 - 최근에는 각종 이모지들도 유니코드에 포함되고 있음 프로토콜 - 규격화된 상호작용에 적용되는 약속 - 각 통신 주체가 교환하는 데이터를 명확히 해석할 수 있도록 문법(syntax)을 포함함 - 표준 통신 프로토콜의 예) TCP/IP, HTTP, FTP 등 HTTP(Hyper Text Transfer Protocol) - 서버와 클라이언트의 데이터 교환을 요청과 응답 형식으로 정의한 프로토콜 - ..
[Webhacking.kr] old-25 소스코드를 봐도 별 내용이 없고, hello.php가 실행된 것으로 보인다. flag.php와 index.php를 실행시켜 보았다. 소스코드는 마찬가지로 별 내용이 없다. FLAG is in the code 라는 문구가 출력된 것으로 보아, 서버에 있는 flag.php 파일에 접근해서 코드를 확인해야 할 것으로 보인다. LFI(Local File Inclusion) - 공격자가 공격 대상 서버에 위치한 파일을 실행, 공격에 활용하는 취약점. - 공격 대상 서버에 있는 디렉토리로 접근하여 원하는 값을 열어볼 수 있도록 함. - LFI 공격 시도를 위해 주로 Path Traversal 취약점을 이용함. - Path Traversal 취약점: 접근 권한이 없는 웹 서버의 파일에 접근하기 위해 특정한 방식으로 ..
[Webhacking.kr] old-24 view-source 를 확인해보자. extract() 배열 속의 키 값들을 변수화 시키는 함수 $_SERVER 와 $_COOKIE 값을 변수화 $REMOTE_ADDR 클라이언트의 IP를 가져오는 PHP의 환경변수 $REMOTE_ADDR 값을 $ip 에 저장 $HTTP_USER_AGENT 클라이언트의 접속 환경 정보를 가져오는 PHP의 환경변수 $HTTP_USER_AGENT 값을 $agent 에 저장 htmlspecialchars() 특수 문자를 HTML 엔티티로 변환해주는 함수. 특정 문자는 HTML에서 특별한 의미가 있으며, 의미를 보존하려면 HTML 엔티티로 표시해야 함. ex) & -> & / " -> " / ' -> ' / &lt / > -> &gt $REMOTE_ADDR 값이..
[Webhacking.kr] old-01 user_lv 쿠키가 존재하지 않으면 SetCookie() 로 쿠키를 설정 is_numeric(파라미터) 지정한 파라미터가 숫자인지 아닌지 확인해주는 함수. 반환값은 bool, 숫자인 경우 true, 아닌 경우 false user_lv 쿠키 값이 숫자가 아니면 1로 설정 user_lv 쿠키 값이 4 이상이면 1로 설정 user_lv 쿠키 값이 3보다 크면 solve(1) 실행 즉, user_lv 쿠키 값을 3 초과 4 미만의 값으로 설정하면 문제가 해결될 것 같다. 개발자 도구로 user_lv 쿠키를 확인할 수 있다. user_lv 쿠키 값을 3.5로 변경하고, 새로고침 해주면 해결!
[Webhacking.kr] old-12 부분을 자세히 보면, 이렇게 이모티콘으로 난독화 되어 있는 걸 볼 수 있다. 이는 자바스크립트문을 이모티콘으로 인코딩하는 aaencode 기법이라고 한다. 디코딩 사이트를 통해 디코딩해보자! 복호화 사이트 https://cat-in-136.github.io/2010/12/aadecode-decode-encoded-as-aaencode.html aadecode - Decode encoded-as-aaencode JavaScript program. ['_'] aadecode - Decode encoded-as-aaencode JavaScript program. (゚Д゚) ['_'] Enter ... cat-in-136.github.io 위의 디코딩된 코드를 좀 정리해서 보면, var enco=''; var ..
[HackCTF] Login View Source 를 보면 GET 방식으로 id와 pw를 전달받고, $id와 $pw가 포함된 $sql로 $db에 쿼리를 던지고 있음을 알 수 있다. 이때, $sql에서 필터링을 하지 않기 때문에 SQL Injection으로 문제를 해결할 수 있을 것 같다. 아래와 같이 Username을 입력해줘서 id를 참으로 만들고, 뒷부분을 주석 처리하면 Flag를 얻을 수 있다. 해결!
[Webhacking.kr] old-26 GET 방식으로 id 값이 admin이면 문제가 해결되는 것 같다. 하지만 preg_match()로 admin을 필터링하고 있어서 no!라는 경고만 뜨게 된다. 코드를 다시 보면, GET 방식으로 전달받은 id 값을 urldecode()를 통해 다시 id 값에 대입하는 것을 알 수 있다. 그래서, 반대로 admin을 인코딩해준 값인 %61%64%6d%69%6e를 다시 id 값으로 전달해보면 자동으로 admin으로 디코딩이 되고, 이전과 같이 no!라는 경고만 뜨는 것을 알 수 있다. 따라서, admin을 2번 인코딩한 값인 %2561%2564%256d%2569%256e를 다시 전달해보면 해결!
[Webhacking.kr] old-20 일단 빈칸에 차례대로 정보를 입력해봤고, 마지막 빈칸은 오른쪽의 문자가 캡차인 것 같아서 그대로 입력해줬다. 그리고 Submit 버튼을 누르면, 이런 창이 뜨는데, 아무래도 처음 화면 상단의 time limit : 2 second 때문인 것 같다. 아무래도 2초 내에 정보를 입력하는 것은 불가능하다고 생각되어 일단 소스코드를 확인해봤다. id, cmt, captcha를 차례대로 입력하고, Submit 버튼을 클릭하면, ck() 가 실행된다. ck() 를 살펴보면, 만약 id, cmt, captcha 값이 공백일 경우 각각의 입력 빈칸에 커서를 두고, lv5frm.captcha.value 값이 lv5frm.captcha_.value 값과 같지 않은 경우에도 입력 빈칸에 커서를 둔다는 것을 알 수 있다. 따..