본문 바로가기

Web Hacking/Webhacking.kr

(25)
[Webhacking.kr] old-21 write up 이번 문제는 Blind SQL Injection이다. 서버측 코드를 모르기 때문에 로그인 시 반환되는 결과를 보고 비밀번호를 구해야 한다. 쿼리가 참을 반환할때와 거짓을 반환할때 반응이 다를 것이다. 먼저 guest guest를 입력해본다. guest가 존재하는 것 같다. guest의 비밀번호가 guest인 것을 알았으므로 이를 가지고 테스트를 해볼 것이다. 먼저, substr 함수를 이용하면 비밀번호를 한 글자 씩 비교할 수 있다. 그전에 먼저 고의로 틀린 비밀번호를 입력해보니 다음과 같은 결과를 반환한다. 쿼리문이 거짓이 되었을 때 나오는 결과인 것 같다. 다음은 싱글쿼터를 탈출해서 쿼리문을 참으로 만들어보자. 쿼리문이 참이 될 경우는 'wrong password' 라는 문자열을 반환하고 있다. 이로..
[Webhacking.kr] old-27 write up 입력폼과 코드가 존재한다. 저번 sql과 달리 부등호가 필터링 되어 있다. 괄호를 탈출할 수는 있지만 다시 닫지는 못 한다. 따라서 뒤의 쿼리문은 주석처리를 해주어야 한다. 부등호는 like로 대체가 가능하다. 0)%09or%09no%09like%092;%00 (널 바이트 삽입)) 0)%09or%09no%09like%092%09--%09 공백은 모두 %09로 대체해주면 된다. '--'로 주석을 처리할 경우에는 뒤에 공백이 있어야 주석처리가 된다.
[Webhacking.kr] old-23 write up 문제에 접속하면 다음과 같은 입력 폼과 메시지가 나타난다. 을 입력하니 no hack이 뜬다. code 파라미터에 들어가므로 code값을 수정하며 테스트 해봤다. 키워드들이 필터링 되나 싶어 테스트 해보니 no hack이 뜨긴했지만 다른 영문자도 no hack이 떴다. 이렇게 연속된 영문자일 경우 no hack이 뜬다. 다른 특수기호나 sc 모두 따로 쓸 경우, 띄어 쓸경우 잘 출력이 된다. 문자열을 띄워서 입력하니 저렇게 나온다. 생각해보니 공백도 문자이기 때문에 alert와 a l e r t는 다르다.. 널값을 넣어 문자를 하나하나 인식하도록 했다. a%00l%00e%00r%00t(1;) 풀고나니 쉽네..
[Webhacking.kr] old-25 write up 문제에 들어가면 쿼리스트링으로 file에 hello가 전달되고 있다. 페이지는 현재 경로의 파일들을 보여주는 듯하며 file에 파일명을 입력하면 내용을 보여주는 듯 보였다. 당연히 file에 flag를 넘겨 보았다. 다음과 같은 문자열만 나올 뿐 내가 원하는 flag는 나오지가 않았다. 가만 생각해보니 php 코드는 프론트에서 보이지 않기 때문에 개발자가 의도적으로 echo를 해주지 않는 이상 보이지가 않는게 당연하다. 당연히 flag는 echo를 해주고 있지 않을거기 때문에 flag.php를 그대로 볼 수 있는 방법이 없나 생각했다. php wrapper을 이용해서 base64 인코딩된 값으로 가지고 오도록 했다. 이 값을 디코딩하면 flag.php의 전체 코드일 것이다. php wrapper 먼저 w..
[Webhacking.kr] old-38 write up 문제를 들어가니 입력폼이 하나 나온다. LOG INJECTION이라고 힌트가 주어져서 log injection을 키워드로 구글링을 해봤다. 로그 기록을 조작할 수 있을 때 발생하는 취약점이라고 한다. 코드를 봐보자. 코드를 보니 주석으로 admin.php 파일이 admin 페이지라고 힌트가 주어져서 접속해봤다. 로그 기록을 볼 수 있는 log viewer를 제공하는듯 했고 admin이 아니라는 문자열이 같이 출력됐다. 만약 admin으로 접속하면 문제가 해결될 것 같다. 입력폼에 무언가를 입력 후 다시 접속해보자. 내 아이피가 찍히고 입력폼에 입력했던 문자열이 그대로 나왔다. 이번엔 admin을 입력 후 다시 접속해보자. admin을 입력하니 index.php에 바로 위와같은 모습이 보였다. admin...
[Webhacking.kr] old-24 write up 코드를 보면 접속자의 ip와 접속 정보를 화면에 뿌려주고 있다. 만약 접속자의 ip가 127.0.0.1 이라면 문제는 해결된다. php의 extract함수의 인자로 $_SERVERD와 $_COOKIE를 줘서 실행하고 있다. extract의 함수는 배열의 키를 변수로 만들고 값을 해당 변수의 값으로 만든다. ex) arr['hello'] = world -> extract(arr), $hello = world가 된다! 중요한점은 $_SERVER에는 사용자 접속 정보가 담겨 있기 떄문에 extract($_SERVER)이 부분에서 $REMOTE_ADDR 변수가 생기게 된다. 그러나 $_COOKIE 또한 extract에 넘겨주고 있기 때문에 cookie 값에 REMOTE_ADDR이라는 키값을 만들면 변조가 가능하..
[Webhacking.kr] old-54 write up 이 문제는 사이트에 들어가면 Password is [flag]에서 flag부분이 1초마다 바뀐다. 저 부분을 자세히보면 flag형식과 비슷하고 때문에 저 부분이 flag라고 생각했다. 이제 코드를 보자! 코드를 보면 1초 후 answer함수가 실행되고 있다. x변수는 run 함수의 리턴값이 담기며 리턴값에는 javascript에서 HTTP 요청을 보낼 수 있는 객체가 담겨 있다. answer함수는 서버로 HTTP요청을 보낸다. m에 i값을 넘겨주며 innerHTML에 응답값을 추가하며 i를 증가시킨다. 만약 응답값이 있다면 다시 answer함수를 실행시키지만 응답값이 없다면 ?를 html에 추가하고 종료된다. 근데 문제점은 innerHTML에 추가할때 +=가 아니라 =로 추가하고 있기 때문에 계속 리셋되..
[Webhacking.kr] old-18 write up 이번 문제는 대놓고 SQL INJECTION이라고 주어진다! 코드를 보자. 쿼리 결과로 admin이 나오면 문제는 해결된다. 코드에 no가 2인 값이 admin이라고 나와 있기 때문에 우린 이것을 이용할 수 있다. 그러나 쿼리문의 where 문 바로 뒤에 id='guest'라고 명시되어 있기 때문에 아무리 no를 건드려도 해결이 불가능하기때문에 or을 이용해서 앞 조건을 false로 만들고 뒤를 true로 만들면 해결이 가능하다. 위처럼 입력하니 no hack이 뜬다. 자세히 보니 공백도 필터링을 하고 있다. 이건 개행이나 탭 문자로 간단히 우회가 가능하다. 2%09or%0ano=2 페이로드는 url창에서 url인코딩하여 전달(그냥 문자 그대로 전달도 가능) 하거나 폼창에 문자 그대로 전달해야한다. 만 ..