본문 바로가기

웹 해킹 (Web)

(23)
[webhacking.kr] 웹해킹.kr old-54번 (100) 이번에는 webhacking.kr의 old-54번 문제입니다. 소스 코드를 이용하는 문제고 100점이 배점되어 있습니다. 처음 화면에 들어가면 위와 같이 문자열이 빠르게 지나갑니다. FLAG라는 단어가 있는 걸 보니 연속된 문자열이 해답 같습니다. 소스 코드를 먼저 보겠습니다. answer() 함수를 보면 i++을 해주며 text를 바꾸어 줍니다. if 조건문에서 setTimeout() 함수를 이용하여 text가 변하는 시간을 설정해줍니다. 저 시간을 늘려주면 flag를 구할 수 있을 것 같습니다. script 태그 내의 코드를 복사하고 시간을 2000을 바꾸어 크롬 콘솔 창에서 실행하여 보겠습니다. password가 느리게 바뀌긴 하지만 하나하나 적기가 너무 귀찮습니다. 다른 부분을 수정하여 보기 편하..
[webhacking.kr] 웹해킹.kr old-51번 (250) 이번에는 webhacking.kr의 old-51번 문제입니다. 데이터베이스를 이용하는 문제고 250점이 배점되어 있습니다. 문제에 들어가면 위와 같은 화면이 나옵니다. ID와 PW 입력창이 있습니다. 소스 코드를 보겠습니다. id는 addslashes() 함수로 묶여있어 변조하기 어렵고, pw는 md5로 암호화하는데 md5() 함수에 true가 argument로 쓰입니다. true가 쓰였으면 md5로 변환한 해시값을 16자리의 바이너리 형식으로 암호화해줍니다. 구글에 "SQL Injection with raw MD5 hashes"로 검색하면 md5 함수에서 true를 argument로 사용한 예가 많이 나옵니다. cvk.posthaven.com/sql-injection-with-raw-md5-hashes..
[webhacking.kr] 웹해킹.kr old-59번 (200) 이번에는 webhacking.kr의 old-59번 문제입니다. 데이터베이스를 이용하는 문제고 200점이 배점되어 있습니다. 문제에 들어가면 위와 같은 로그인 폼이 나옵니다. 위에 JOIN으로 된 회원가입 폼도 보입니다. 소스 코드를 보겠습니다. 위쪽이 로그인 폼, 아래쪽이 회원가입 폼입니다. 회원가입 폼을 먼저 살펴보면, addslashes() 함수로 id와 phone의 보안을 강화해줍니다. phone이 20글자 이상이 되면 안 되고, preg_match() 함수로 여러 문자열들을 필터링하고 있습니다. 조건이 완벽하다면 쿼리문으로 값들을 chall59 테이블에 insert 해줍니다. 쿼리문 마지막의 guest가 lv 같습니다. 그리고 위쪽 로그인 폼에서 chall59 테이블에서 id와 lv를 select..
[webhacking.kr] 웹해킹.kr old-39번 (100) 이번에는 webhacking.kr의 old-39번 문제입니다. 데이터베이스를 이용하는 문제고, 100점이 배점되어 있습니다. 문제에 접속하면 위와 같은 화면이 나옵니다. 소스 코드를 보겠습니다. id를 POST 형식으로 전달받고, str_replace() 함수를 통해 특정 문자열들을 치환해줍니다. substr() 함수로 15글자까지 잘라주기도 합니다. 그 밑에는 SQL 쿼리문이 나옵니다. member 테이블에서 id의 길이가 14보다 작고 id가 $_POST['id']일 때 1을 출력하는 것 같습니다. 자세히 보면 쿼리문에서 id를 감싸는 작은 따옴표 하나가 빠진 것을 볼 수 있습니다. 이를 채워주어야 합니다. 헌데 작은 따옴표 하나가 작은 따옴표 2개로 치환되므로, substr() 함수를 이용하여 15..
[webhacking.kr] 웹해킹.kr old-27번 (150) 이번에는 webhacking.kr의 old-27번 문제입니다. 데이터베이스를 이용하는 문제고 150점이 배점되어 있습니다. 들어가면 위와 같은 화면이 출력됩니다. SQL Injection 문제인 것 같습니다. 소스 코드를 보겠습니다. preg_match() 함수로 GET 방식으로 전달하는 no의 select, limit와 같은 문자열들을 필터링해줍니다. 쿼리에는 id='guest'가 고정되어 있습니다. 조건문의 주석에는 admin의 no가 2라고 적혀있습니다. "SELECT id FROM chall27 WHERE id='guest' and no=(0) or no like 2-- ")) or die("query error"); 로 만들어 보겠습니다. 그리고 필터링을 우회하기 위하여 GET방식으로 전달되므로..
[webhacking.kr] 웹해킹.kr old-18번 (100) 이번에는 webhacking.kr의 old-18번 문제입니다. 데이터베이스를 이용하는 문제고, 100점이 배점되어 있습니다. old-18번 문제에 들어가면 위와 같은 화면이 나옵니다. SQL Injection을 사용하는 문제인 것 같습니다. 소스 코드를 보겠습니다. 소스 코드를 해석해보면, 우선 GET방식으로 no를 전달받습니다. 이 때 정규 표현식으로 공백, &, select, from 같은 문자열이 필터링되는 것 같습니다. 밑에넌 sql 쿼리문이 나오고, if 조건문에서 id가 admin으로 로그인하면 문제가 해결되는 것 같습니다. 그리고 주석으로 admin의 no가 2라고 힌트를 주고 있습니다. SQL 쿼리문에서 id='guest'는 고정되어 있으므로, 쿼리문을 바꿔보겠습니다. SELECT id F..
[webhacking.kr] 웹해킹.kr old-20번 (200) 이번에는 webhacking.kr의 old-20번 문제입니다. 소스 코드를 이용하는 문제고, 200점이 배점되어 있습니다. 문제에 들어가면 input 창이 3개 보입니다. 그리고 위쪽에 time limit이 2초로 설정되어 있습니다. nickname과 comment를 입력학 캡챠를 정확히 입력하고 submit으로 제출하면 될 것 같습니다. 소스 코드를 보겠습니다. script 태그 안을 보시면, ck 함수에 여러 조건문들이 들어가있습니다. id, cmt, captcha 값은 공백이면 안 되고, 캡챠가 정확하지 않으면 return 됩니다. 캡챠 길이가 길어서 2초만에 입력하기 어려우므로, 크롬의 console 창을 사용해 보겠습니다. 변수 순서대로 lv5frm.id.value='s0ng'; lv5frm.c..
[webhacking.kr] 웹해킹.kr old-12번 (250) 이번에는 webhacking.kr의 old-12번 문제입니다. 소스 코드를 이용하는 문제고, 250점이 배점되어 있습니다. 문제에 들어가면 위와 같이 javascript challenge라고 적혀있습니다. 소스 코드를 보겠습니다. 이모티콘들이 쭉 나열되어 있습니다. 구글에 쳐보니 'aaencode' 기법으로 인코딩한 코드입니다. aadecode 사이트에서 script 태그 안의 이모티콘 문자열들을 복호화했습니다. javascript의 여러 함수들을 사용하여서 URL을 구하는 문제 같습니다. 콘솔로 코드를 돌려보겠습니다. 변수 선언, 함수 선언 부분과 URL에 들어가는 부분을 따로 구해보았습니다. 변수 ck에는 =youaregod~~~~~~~!이 들어가는 모양입니다. url에 ?=youaregod~~~~~..
[webhacking.kr] 웹해킹.kr old-11번 (300) 이번에는 webhacking.kr의 old-11번 문제입니다. 소스 코드를 이용하는 문제고 300점이 배점되어 있습니다. 처음 들어가면 Wrong이라는 문자열이 보입니다. 소스 코드를 보겠습니다. php 문을 보면 pat이라는 변수에 어떤 정규표현식을 대입해줍니다. 그리고 if 조건문으로 pat 변수와 GET으로 전달되는 val 값이 일치하면 문제가 해결됩니다. 그럼 pat 변수를 구해보겠습니다. [1-3] 은 1부터 3까지의 문자 중 어떤 한 문자를 의미합니다. [a-f] 는 a부터 f까지의 문자 중 어떤 한 문자를 의미합니다. {5}는 앞에 오는 [a-f]중 어떤 한 문자를 5번 반복하라는 의미입니다. _는 그냥 '_' 문자입니다. .* ~ .*는 .* 뒤에 0개 이상의 문자열을 .*이 나올 때 까지..
[webhacking.kr] 웹해킹.kr old-19번 (150) 이번에는 webhacking.kr의 old-19번 문제입니다. 소스 코드를 이용하는 문제고 150점이 배점되어 있습니다. 처음 들어가면 위와 같은 화면이 나옵니다. admin으로 로그인을 해야 할 것 같습니다. 제출 버튼을 누르면 admin이 아니라고 나옵니다. 소스 코드를 보겠습니다. admin의 maxlength와 size가 5로 할당되어 있습니다. form에서 따로 method를 적어주지 않으면 GET 형식으로 전달합니다. 그냥 maxlength가 5길래 혹시나해서 URL에서 admin 사이에 띄어쓰기를 하나 넣으니 문제가 해결되었습니다.