59번 200점짜리 문제이다. join과 login을 적절히 이용해야 할 듯 싶다. 

소스코드를 볼 수 있게 되어있는데 핵심 기능을하는 코드는 아래와 같다.




login 쿼리를 받아 db에 저장된 id와 lv를 가져온다. 이때 lv가 admin일 경우 문제 clear





다음으로 가입을 받는 코드다. phone의 문자열 길이가 20이상을 넘기면 안되고 id는 admin이라는 문자를 필터링한다.

또 phone변수에 0x hex char ascii ord 등등 여러 필터링이 걸려 있는 것을 알 수 있다.

필터링을 통과한 경우 insert~~ 쿼리를 보낸다. 





id='asd' , phone =1 으로 join하고 login했을때 위 쿼리문에 lv에 'guest'가 박혀있듯이 아래와 같이 로그인후 창이 나타난다.

저 lv 같을 admin으로 바꿔야 문제를 클리어하는데 어떻게 sql injection을 하면 좋을까?





답은 아래와 같은 형식의 쿼리문을 만드는 것이다. 

@mysql_query("insert into c59 values('nimda',1,reverse(id)) -- ,'guest')"); 

values에 테이블 열순서에 맞춰 값을 적고 insert into 해주는데 형식에 맞게 괄호를 닫아주고  -- <==주석처리를 통해서 뒷줄은 주석처리 해준다.




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 12번  (0) 2018.04.27
Webhacking.kr 61번  (0) 2018.04.27
Webhacking.kr 42번  (0) 2018.04.26
Webhacking.kr 33번  (0) 2018.04.25
Webhacking.kr 32번  (0) 2018.04.17


42번의 소스코드는 위와 같다. text.txt의 download버튼을 누르면  down=dGVzdC50eHQ= 값이 url에 넘겨져 전송된다.

그렇게 test~~~가 출력 되었다.

그리고  주석처리된 힌트를 보면 text.zip의 패스워드는 숫자로 이뤄져있다고 한다.



text.zip 다운로드는 누르면 access denied 창이 뜨는데 download를 해야 문제를 풀 수 있을 듯하다. 다운로드가 가능했던 text.txt의 경우를 분석해본다.



text.txt download의 request header에  referrer을 보면  down=dGVzdC50eHQ= 값을 볼 수 있는데 문자열의 형태가 base64같아

decode 해보았다.



text.txt를 base64하여 down변수에 담아보내준 것으로 보여

text.zip를 암호화하여 위와 마찬가지로 down변수에 담아서 보내니 



text.zip을 다운받을 수 있었다. 브루트포싱 툴을 이용해서 readme.txt파일의 패스워드를 찾아주면 

url주소가 담겨있는데 그페이지 안에 패스워드가 담겨있다.

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 61번  (0) 2018.04.27
Webhacking.kr 59번  (0) 2018.04.26
Webhacking.kr 33번  (0) 2018.04.25
Webhacking.kr 32번  (0) 2018.04.17
Webhacking.kr 23번  (0) 2018.04.17

200점짜리 문제다. 주제에 10단계까지 가야 clear가능하다. 전반적으로 php코드 해석, get, post, cookie에 대해 물어보는 문제였다.


1.


if $_get[get] == "hehe" 일때 next를 echo하기 때문에 url에 get=hehe 를 붙여주면 clear




2.


if $_POST[post]=hehe && $_POST[post]=hehe2이면 next이다 이번엔은 앞에 스테이지와 다르게 포스트 방식으로 인자를 전달해야하므로 위와 같이 간단한 스크립트를 이용한다.



3.


REMOTE_ADDR 사용자가 현재 페이지를 보고 있는 시스템의 IP 주소인 본인의 ip주소를 myip로 넘기면 된다.





4.

현재시각을 나타내는 time()값을 md5로 암호화한 값과 get으로 받은 password의 값과 비교해서 같을 경우 클리어인데 미리 몇 초 뒤의 값을 넣고 암호화하여 새로고침을 몇번 눌러주다 보면 값이 일치해서 쉽게 문제를 풀 수 있다.



5.


get방식의 imget변수와 post방식의 impost변수 그리고 cookie에 포함된 imcookie값에 아무값이나 넣어줘서 문제를 풀어주면 된다.

if가 참이면 클리어



6.


user-agent와 ip주소를 md5 암호화 하여 넣어주는데 중요한점은 post방식으로 data를 보낼때는 url인코딩을 거쳐 보내야 한다는 점이다.



7.

if($_GET[$_SERVER[REMOTE_ADDR]]=$_SERVER[REMOTE_ADDR]) 값을 보면 알 수 있듯이 나의 IP주소에서 . <=을 뺀 값을 변수명으로 하고 동시에 그값을 변수에 넣어주면 조건문에 성립하게 된다.



8.

설명생략



9.

php문을 보면 for문을 돌리는데 i=97부터 2씩 증가하여 122까지 돌린다. $ch=에 $i의 캐릭터값을 넣고 answer변수에 한글자씩 붙여서 문자열을 만들어준다. 그러면 answer="acegikmoqsuwy"가 될것이다.



10.

ip주소를 $ip변수에 넣고 len($ip)번 for문을 실행한다. str_replace함수를 사용해서 $i 값을 모두 ord($i)로 치환한다.

두번째 str_replace는 . <-을 없애주는 기능을 하고 

substr($ip,0,10)을 해서 문자열을 잘라서 저장하는 기능을한다.

php문을 온라인에서 test할 수 있는 사이트를 이용해서 ip와 answer값을 알아보고


 <-- 형식에 맞춰서 url에 입력해주면 password가 출력된다.

이렇게 하면 33번의 문제가 모두 풀린다.




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 59번  (0) 2018.04.26
Webhacking.kr 42번  (0) 2018.04.26
Webhacking.kr 32번  (0) 2018.04.17
Webhacking.kr 23번  (0) 2018.04.17
Webhacking.kr 20번  (0) 2018.04.17

+ Recent posts