id = 'admin'의 pw를 알아내야 하는 문제이다. 기존에 이용하던 파이썬 프로그램을 이용해서 pw 길이를 알아냈는데, 40이었다. ?pw=' or id = 'admin' and length(pw) =40 %23을 입력하면 Hello admin이 출력 -> length가 40 기존에 이용했던 파이썬 프로그램으로 각 자리별 패스워드를 확인했더니 모두 0 이어서, 위와 같이 pw를 입력했으나, 클리어 되지 않았다.. 혹시나 해서 pw중 한자리의 length를 확인 해봣더니 4였다.?pw='or id = 'admin' and length(substr(pw,1,1))= 4 %23 따라서 범위가 128~255인 확장 아스키 코드에 대해서 패스워드를 검색하도록 기존의 파이썬 프로그램을 수정하였고,멀티 바이트 ..
쿼리 입력에 대해서 임의의 id를 반환 받아야 하는 문제이다. 1. 주석에 필터링이 되어있다.(#, -)2. 입력 글자수가 6이하여야 한다. 일단 #, --를 사용하지 못하므로 우회하는 방법에는 /**/ 와 ;%00 이 있다. 글자 수 제한이 있기 때문에 길이가 짧은 %00을 이용하였고,false = false -> true 라는 것을 이용하였다. ?pw=')=0;%00을 입력하면 쿼리 입력의 조건 부분에서 pw=('') -> false, 0 -> false 이므로where true 주석이 되면서 클리어 된다. 입력 글자수도 딱 6자이다..
바로 전 문제인 zombie_assassin 과 동일 한 문제이다그러나 이번 문제는 싱글쿼터를 ereg가 아닌 preg_match로 필터링 하였다. preg_match에는 특별한 취약점이 없다 따라서, 문자열 이스케이프 \을 이용 하면 된다. ?id=\&&pw=or 1=1;%23 와 같이 입력하면 \ 뒤의 싱글쿼터가 문자로 인식되어where id='\' and pw=' or 1=1 ; #' 에서빨간색 부분이 id의 값으로 인식 된다. 따라서, or 뒤의 1=1에 의해query 입력에 대해 임의의 id가 반환되어 클리어 된다.
일단 pw에는 싱글쿼터 필터링이 되어있다.어떤 패스워드를 입력했을때 그 패스워드가 admin의 것이면 클리어되는 문제이다.like가 있으므로 %을 이용하면 해결가능할 것이다. 0-9, a-z , A-Z 다 입력해 봤는데,?pw=8% 를 입력했을때만 Hello guest가 출력된다.admin의 pw도 8로 시작하기 때문인 듯 하다. 그 다음도 ?pw=83% 를 입력했을때만 Hello guest가 출력된다.admin의 pw도 83으로 시작한다. ?pw=832% 를 입력하니 클리어 됬다.admin의 pw는 832로 시작함을 알아냈다.파이썬으로 코딩해서 풀어도 된다.
from과 prob_giant 사이에 공백을 입력해야 하는 문제이다. 하지만,입력 문자의 길이 1로 제한공백, \n, \r, \t 에 필터링이 되어있다. \n에 해당되는 %0a을 shit의 값으로 전달했더니 No Hack ~_~이 아닌, HeHe가 뜬다.이는 %0a를 1글자 이하로 인식한다는 뜻이다. 따라서 \n(%0a), \r(%0d), \t(%09)대신 %0b나 %0c 로 공백을 우회 하면된다. ?shit=%0c 또는 ?shit=%0b 를 입력하면 클리어
id = "admin" 인 계정의 pw를 알아내야 하는 문제이다.pw 는 싱글쿼터에 대한 필터링이 되어있고,no는 substr, =, or, and, 공백, like 등에 대해 필터링이 되어있다. 일단 admin의 pw 길이를 알아내야 한다!필터링 우회를 위해싱글 쿼터 -> 더블 쿼터or -> ||and -> %26공백 -> %09, %0a= -> in으로 대체 하였다. ?no=""||id%09in("admin")%26%26length(pw)%09in%09(8)위와 같이 입력하면 Hello admin이 출력된다. pw의 길이는 8이다. pw의 길이를 알아냈으니, pw의 각 자리를 알아내야 한다. 지금까지는 substr을 이용했지만 필터링이 되어있기 때문에, mid를 이용하였다. ?no=""||id%0ai..
GET으로 pw와 no를 전송할 수 있다.pw에는 ' 에 대한 필터링이,no에는 prob, '_', '.', '()', ', substr, ascii, = 에대해 필터링이 걸려있다. 이 필터링을 우회하여 id='admin'인 계정의 패스워드를 알아낸 뒤 입력해주어야 하는 문제이다. 먼저 패스워드의 길이를 알아내자. query에서 맨뒤에 있는 no를 이용하였다.'에 필터링이 걸려있으므로 ' 대신 "(double quote)=에 필터링이 걸려있으므로 =대신 like (%와 함께 사용)를 이용하였다. ?no=3 or id like "admin%" and length(pw) like "8%"위와 같이 입력하였을때, Hello admin이 출력되었다.따라서 id='admin'인 계정의 패스워드의 길이는 8임을 알..
or, and, substr(, = 에 필터링이 걸려있다.이 필터링을 우회하여 id='admin'인 계정의 password를 알아낸 뒤, 이 pw를 입력해주어야 해결되는 문제이다. 일단 패스워드의 길이를 알아내야 한다. or에 필터링이 걸려있으므로 or대신 ||and에 필터링이 걸려있으므로 and대신 %26%26 (&&으로 입력하면 인식이 안됨)=에 필터링이 걸려있으므로 = 대신 like를 이용하였다.like와 이용되는 '_' (한 글자와 매칭) , '%' (여러 문자[0개 이상]와 매칭) 중 %를 이용하였다. ?pw='||id like 'admin' %26%26 length(pw) like '8%'%23위와 같이 입력했을때, Hello admin이 출력되는 것으로 보아, id='admin'인 계정의 패..
'prob', '_', '.', '()' 에 필터링이 걸려있다. 이를 우회해서 id = 'admin'인 레코드를 반환받으면 된다. 주석인 #을 이용하면 쉽게 해결가능한 문제이다. ?pw=2' or id='admin'%23 을 입력하면 query : select id from prob_skeleton where id='guest' and pw='2' or id='admin'#' and 1=0 에서 파란색 밑줄친 id='admin' 이라는 조건에 맞는 레코드가 반환되면서 문제가 클리어된다.