전체 글 70

webhacking.kr 42번

test.txt 옆에 download를 누르면 파일이 다운로드된다. 그치만 flag.docx를 누르면 다운로드가 안되고, alert창이 뜬다., flag.docx를 보는 것이 문제 ! 소스코드를 보니, test.txt의 다운로드 경로가 base64로 인코딩되어있었다. 디코딩해보니까 test.txt가 나왔다 ㅎ flag.docx의 다운로드 경로도 flag.docx를 base64 인코딩한 값일 것같아 인코딩해서 입력해봤다. 그랬더니 flag.docx파일이 다운로드되고, 파일을 열어보니 FLAG값이 두둥 ٩(ˊᗜˋ*)و !

webhacking.kr 41번

view-source 클릭 ! isset() : 변수가 존재하면 True, 존재하지 않으면 False를 리턴하는 함수 코드를 보면, 처음 부분에 다른 문제에는 없었던 오류처리 코드가 있는 것을 볼 수 있다. 파일을 업로드하고, 업로드된 파일명에 ".", "", "/"가 포함되어있으면 공백으로 대체한다. 업로드된 파일은 /{$upload_dir} 아래로 복사되고, 그 파일안에 flag값이 쓰여져있다. flag값을 얻기위해 우리는 $upload_dir을 알아내야한다. 오류처리 코드가 추가된 것을 보고, 오류메세지를 통해 힌트를 얻어야겠다는 생각이 들었다. 파일을 업로드할 때, 파일명은 최대 255까지 입력할 수 있으므로 나는 피들러를 이용해 파일명을 엄~~청 길게 입력하여 업로드해봤다. 그랬더니 Warnin..

webhacking.kr 37번

view-source 클릭 ! view-source 이 문제는 php코드를 정확히 해석하고, 이해해야하기 때문에 주석을 달아서 공부했다. flag값을 얻기 위해서는 업로드된 파일에 쓰여져있는 IP값의 포트 7777로 연결해야한다. $host에는 $_SERVER['REMOTE_ADDR']값, 즉 파일을 업로드한 곳의 IP주소가 저장되어있다. $host에 내 서버 ip주소가 저장되게 하려면, 내 서버에서 파일을 업로드해야한다. import requests import urllib3 import time urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = "https://webhacking.kr/challenge/web-18/in..

webhacking.kr 39번

view-source 클릭 ! $_POST['id'] = POST방식으로 전달되는 id id에 "\\"가 포함되어있으면 공백으로 대체되고, " ' "는 " ' ' "로 대체된다. 그 후, id값 중 0~15번째 문자만 추출해서 저장한다. 추출된 문자열은 select문에 쓰이게 되고, select문이 성립하면 문제가 해결된다. 여기서 알아야 할 점 ! mySQL에서 'a' = 'a '의 결과는 1(TRUE)이다. -> char에서는 문자열을 비교할 때 공백을 채워서 비교하는 방법을 사용한다. 공백 채우기 비교에서는 우선 짧은 쪽의 끝에 공백을 추가하여 2개의 데이터가 같은 길이가 되도록 한다. 그리고 앞에서부터 한 문자씩 비교한다. 그렇기 떄문에 끝의 공백만 다른 문자열은 같다고 판단된다. -> 그에 반해..

webhacking.kr 38번

먼저 소스코드를 봤더니 admin.php가 주석 처리되어있길래 들어가 봤다. admin.php에서는 admin으로 로그인하라는 메세지와 로그를 볼 수 있다. admin으로 로그인 해보니까 역시 난 admin이 아니라고., _( :0 」 )_ log viewer에 '내 IP주소:admin'이 입력되도록 만들어야 한다. 입력창에 줄바꿈 기호인 \n을 이용해 'aa\n IP주소:admin'를 입력해봤지만, \n가 그냥 문자열로 인식되어서 출력된다ㅜ \n을 쓰는 대신, input태그를 textarea태그로 바꿔서 엔터를 직접 입력했다. ㅎㅅㅎ LOG INJECTION 그랬더니 문제 해결 ~!

webhacking.kr 36번

문장을 해석해보면.., index.php파일을 vi편집기를 이용해 수정하고 있었는데, 갑자기 정전되어서 코드가 날라갔다고 코드를 찾아달라는 내용이다. 리눅스에서는 vi 편집 도중에 갑자기 리눅스가 종료(kill)되면, 임시파일을 생성한다. 임시파일의 확장자명은 swp으로, index.php.swp를 보면 꺼지기 전에 수정하고 있었던 코드를 볼 수 있다. ( 평소 피피티를 실행하면, 실행파일/임시파일이 생기는 것과 같은 원리(?) ) 그리고 index.php를 보면 전에 코드를 복구하겠냐고 물어본다. 위 캡쳐화면은 36 파일을 수정하던 도중 리눅스가 갑자기 종료된 후, vi 36을 다시 실행하면 전에 내용을 복구하겠냐고 물어보는 화면이다. 문제를 해결하기 위해서는 index.php.swp를 열어보면 된다 ..

webhacking.kr 32번

랭킹이 쭉 나오는데, 내 아이디는 젤 마지막에 있다 ٩(๑´0`๑)۶ 이름을 누르면 hit이 한번 올라가는데, 한번 더 누르면 이미 투표했다고 안된단다.., vote_check 쿠키가 있는 것을 보니, 쿠키값을 보고 투표 유무를 체크하는 것같다. 쿠키값이 ok이면, 투표를 했다고 판단하고 투표를 못하게 하는 것이다. vote_check 쿠키를 삭제하고, 투표하고 삭제하고 투표하고를 계속 반복해도 되지만 나는 21번에서 사용한 코드를 응용해서 문제를 풀어보았다 ㅎ import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) url = "https://webhacking.kr/challenge..

webhacking.kr 31번

fsockopen(string hostname, int port, int [error], string [errstr]) : 서버의 열려진 어떤 포트로도 접속할 수 있고, 소켓의 연결을 설정할 수 있는 함수 먼저 코드를 해석해보자 ! port는 10000 ~ 10100사이의 랜덤으로 지정되고, GET의 server파라미터로 받은 IP에 랜덤한 port로 소캣을 열어서 연결을 시도한다. Warning을 보면, 'IP번호:포트번호'에 연결할 수 없다고 뜬다. 이를 통해 fsockopen함수로 연결을 시도한다는 것을 알 수 있다. => 연결을 시도한다는 것은 서버에 요청을 보낸다는 말과 같다. 요청을 보내면, 서버가 받아야하는데 그냥 받을 순 없고 서버 소캣을 열어야 한다 ! ๑°⌓°๑ 문제를 해결하기 위해서는..

webhacking.kr 21번

이번에 처음풀어보는 blind SQL injection 문제., blind SQL Inejction이란 ? 쿼리 결과로 오류메세지가 보이지 않고, 참 또는 거짓으로만 출력되어 DB구조를 파악하는 공격기법. id와 pw에 이것저것 입력해본 결과, id : guest / pw : guest면 login success가 출력된다. 그리고 잘못된 정보로 로그인을 시도하면, login fail이라고 출력된다. 가끔 wrong password라고 나오기도 하는데 login fail이랑 wrong password 차이는 쿼리문이 성립되면 wrong password가 출력되고, 올바르지 않은 쿼리문을 입력했을 시에는 login fail이 출력되는 것같다 ( -᷅_-᷄) 문제를 해결하기 위해서 id는 admin으로 입력..

webhacking.kr 27번

SQL인젝션 문제 ! 먼저 소스코드를 확인해봐야겠다. 코드를 해석해보면, GET방식으로 입력된 변수 no에 #,select,(,limit,=,0x가 포함되면 no hack을 출력한다. 입력된 no는 테이블에 있는 데이터를 조회하는 select문에 쓰인다. select문 결과에서 id가 admin이면, 문제가 해결된다 ! 그러나 id는 guest로 고정되어있고, 우리는 no만 바꿀 수 있다. 먼저 admin의 no값인 2를 입력해보면, query error가 출력된다. guest의 no=1이므로 올바르지 않은 select문이 만들어졌기 때문이다. 올바른 select문을 만들어주기 위해서는 or을 이용해야한다. (FALSE or TRUE = TRUE 원리) or연산을 이용해 guest는 거짓으로, admin..