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' 이라는 조건에 맞는 레코드가 반환되면서 문제가 클리어된다.
single quote(')에 필터링이 걸려있고, admin에 대해서도 필터링이 걸려있다.(admin은 공백으로 치환됨) 이 필터링을 우회하여 id = 'admin'인 레코드를 반환 받아야 하는 문제이다. admin을 필터링하는데 이용한 함수str_replace(찾을 문자, 치환할 문자, 대상 문자열) 는 대소문자를 구별하는 함수이다. 따라서, id='Admin' 이라고 입력해주면 문제가 풀린다. str_replace() 함수는 대소문자를 구별하기 때문에, 필터링을 하고 싶다면 대소문자를 구별하지 않는 str_ireplace() 함수를 이용하는것이 좋다.
admin과 싱글쿼터 (')에 필터링이 되어있다. 이를 우회하여 id가 admin인 레코드를 반환 받아야 하는 문제이다. preg_match() 필터링 함수는 지금까지 많이 봤지만, ereg()함수는 처음봐서 구글링을 해보았는데. ereg("찾는 값"., "필터를 시킬 문자열") -> 대소문자를 구분한다.eregi("찾는 값"., "필터를 시킬 문자열") -> 대소문자를 구분하지 않는다. 라는 것을 알아냈다. 현재 admin이 ereg()로 필터링이 되어있기 때문에, 대소문자를 구분하고 있다. 따라서, Admin이라는 문자열에 대해서는 필터링이 적용되지 않는다. Mysql은 대소문자를 구별하지 않기 때문에 admin, Admin ADMIN 모두 같은 admin으로 인식한다. 따라서, ?id=Admin 이..
orge 단계 역시 or와 and에 필터링이 걸려있다.이 필터링들을 우회해서 id='admin'인 계정의 pw을 알아낸 뒤, 이 pw를 입력해야 하는 문제이다. 빨간색 밑줄친 부분이 admin의 pw를 알아낼 수 있는 힌트이다. 일단 pw의 길이를 알아내야 한다. orc문제를 풀때 pw의 길이가 8이었기 때문에, 이번에도 8로 먼저 입력해보았다. ?pw=' || id='admin' && length(pw) = 8 %23를 입력했더니 &가 인식되지 않아서, &대신 url 인코드된 %26을 사용하였다. ?pw=' || id='admin' %26%26 length(pw) = 8 %23를 입력하니까 맨 위 사진에 빨간 밑줄을 쳤던 코드에 의해 Hello admin이 출력이 된다. admin의 pw 길이는 8이라..
admin이라는 id의 pw를 GET으로 입력해줘야 하는 문제이다.preg_match()와 addslashes()로 필터링이 되어있다. 또한 GET으로 입력해준 pw와 DB상의 pw가 같아야 클리어 되기 때문에 admin 계정의 정확한 pw를 찾아야한다. 일단 pw의 길이를 알아내야 한다. length()함수를 이용하였다. pw=' or id=admin and length(pw)=1%23 주소창에 위와 같이 입력되면 pw의 길이가 1일경우, Hello admin이 출력된다. 1부터 시작해서 찾은 결과 pw의 길이는 8이다. 이제 두가지 방법중 하나를 택할 수 있다. 방법1은 위와 같이 substr(pw , 시작인덱스, 추출할 길이) 함수를 이용하는 것이다. pw=' or id='admin' and sub..
쿼리문을 전송했을때, 반환되는 레코드가 존재하면서, 그 레코드의 'id'라는 column의 값이 'admin'이어야 해결되는 문제이다. preg_match()라는 함수를 이용해서, 'prob', '_', '.', '()', ''', '"', '`' 에 필터링을 해놓았다.(패턴 구분자 뒤의 i는 필터링시 대소문자를 구별하지 않게함) 필터링으로 인해 '를 이용하지 못하게 되었지만 char()함수를 이용하면 이를 우회할 수 있다.admin을 아스키 코드로 인코딩 하면 97 100 109 105 110 이므로char(97,100,109,105,110) = 'admin' 이다. 따라서, ?no=3 or id=char(97,100,109,105,110)을 입력한다면(no=3대신에 no=1만 아니면 어떤 값을 넣어주..