18번 문제를 풀이해보겠다.
대놓고 SQL Injection문제라고 소개하고 있다.
참고로 SQL Injection이 뭔지 모르신다면 내가 쓴 글 포스팅을 참고해주시길 바란다 ㅎㅎ.
일단 solve(18)의 조건을 봐야한다.
id가 admin이면 18번 문제가 풀리는 것 같다.
id가 guest이면 "hi guest"라는 글자가 뜨는 것 같다.
코드를 이제 위에서부터 찬찬히 읽어보면
이건 PHP로 쓰여진 것을 알 수 있고,
GET방식으로 데이터를 보낸다는 것을 알 수 있다.
■ 참고로 GET 방식이란??
클라이언트의 데이터를 URL 뒤에 붙여서 보낸다.
URL 뒤에 "?" 마크를 통해 URL의 끝을 알리면서, 데이터 표현의 시작점을 알린다.
■ POST방식?
GET방식과 달리 URL에 데이터를 노출하지 않는다.
일단 이정도로 간단하게 적어보도록 하겠다.
하나의 팁?을 주자면 GET방식으로 데이터를 보내는 문제의 답은 당연한 소리겠지만 url에 적어야한다.
그리고 저기 mysqli_fetch_array는 데이터베이스에서 데이터를 꺼내온다는 의미고
mysqli_query는 sql문이 성공했을 때 true를 반환, 실패하면 false를 반환한다고 한다.
흐음 사실 위에 두개는 정확히는 몰라도 그냥 대충 아! sql문으로 데이터베이스에서 데이터를 가져온다는 의미구나! 라고 알면 문제푸는데는 지장이 없다.
그리고 저기 sql문이 적혀있다.
select id from chall18 where id='guest' and no=$_GET[no]
chall18테이블에서 id가 guest이고 no가 ~인 id를 가져와라!
주석처리로 admin이 2라고 적혀있으니 저 ~를 잘 적어서 2라는 데이터를 보내면 될 것 같다.!
그리고 마지막으로 preg_match는 뭘까...?
■ preg_match
첫 번째 인수 : 정규식 표현 작성.
두 번째 인수 : 검색 대상 문자열.
세 번째 인수 : 배열 변수 반환. 패턴 매치에서 매칭된 값을 배열로 저장.
반환값 : 매칭에 성공하면 1, 실패하면 0이 반환
결론은 두번째 인수에 첫번째 인수의 데이터?가 있으면 필터링을 한다는 뜻이다.
문제를 예시로 보면 저기 공백이 필터링 되어있다.
그래서 만약 "Hello World" 라고 데이터를 보내면 실제로는 공백이 필터링 되어 "HelloWorld"가 보내지게 되는 것이다.
아무튼 다시 코드를 보면 저기 필터링 된 데이터를 같이 보내면 "no hack"이 뜨는 것을 알 수 있다.
문제 해결법 정리!
저기 필터링 된 문자들을 잘 피해서 sql문에 적히는 no가 2가 되게하면(admin=2) 문제가 풀릴 것이다!
자 이제 본격적으로 문제를 풀어보겠다.
일단 1을 적어보았다.
그랬더니 hi guest가 뜬다.
chall18 table은 대충 이렇게 생긴 것 같다!
그럼 admin의 no인 2를 적어보았다.!
아무것도 뜨지 않는다. 왜일까?
select id from chall18 where id='guest' and no=$_GET[no]
select id from chall18 where id='guest' and no=2
2를 적게되면 데이터가 이렇게 넘어가게 된다.
where절을 주목해서 보면 and연산이 있는 것을 알 수 있다.
and연산은 전과 후 둘 다 만족시켜야 true가 된다.
예를 들어 A가 1이고, B가 2라고 가정해보자.
A=1 and B=2
이 문장은 true지만
A=1 and A=2
이 문장은 false이다.
이 문제를 해결하는 방법은 바로 or연산을 사용하는 것이다.
or연산은 전과 후 둘 중 하나만 true여도 전체가 true이다.
예를 들어 A가 1이고, B가 2라고 가정해보자.
A=1 or B=3 이여도 저 문장 자체가 true가 된다는 뜻이다.
select id from chall18 where id='guest' and no=0 or no=2
이런식으로 적게되면
id='guest' and no=0 은 false인 문장이 되니까 or뒤의 no=2를 만족하는 id를 가져올 것이다.
url에 입력해보면 no hack이 뜬다ㅠㅠ
공백이 이상하게 처리된 것을 알 수 있다.
저~~~ 위에 코드를 다시보면 공백이 필터링 된 것을 확인 할 수 있다.
공백을 우회하는 방법을 찾아보자
■ 공백 우회 방법
공백 대신에
%09
%0a
%0d
/**/
+
등을 적거나
괄호로 공백을 제거해준다.
ex) no=(0)or(no=2)
공백을 우회하는 방법은 여러가지가 있는데 저기중에서 아무거나 대입해보다가 뚫리는 것이 있다면 그것으로 공백을 대체하면 된다.
위에 문제에서는 %09으로 공백을 우회하니까 성공했다!
답: 0%09or%09no=2
사실 문제풀이하는 방법이 하나 더 있다.
solve(18)를 하는 조건에 id가 "admin"이면 된다고 적혀있다.
그러면 굳이 no=2라는 조건 대신 id="admin"라는 조건을 적어도 문제가 풀리지 않을까??
0%09or%09id="admin"
이것으로 18번 문제풀이를 마치도록 하겠다!
'WAR GAME > Webhacking.kr' 카테고리의 다른 글
[웹해킹][Webhacking.kr] 사이트 소개 (0) | 2019.09.23 |
---|