GaGe

Web hacking 18 본문

SISS (2017-2018)/웹해킹(순서대로X)

Web hacking 18

Sorrel 2018. 4. 29. 23:06

Web hacking 18

 

 

이 글은 실시간으로 풀면서 쓰는 글입니다.

원래 한번 다 풀고 글을 한번에 작성하여 올리지만

이 18번 문제는 지금 3일 째 이해를 못하고 해결도 못하고있기 때문에 이 도전을 마지막으로 생각하고

만약 이번에도 이해하지 못하면 다가오는 30일에 동기의 발표를 듣고 다시 도전해보겠습니다.

 

 

 

 

 

 

 

 

일단 18번 문제에서 제공해주는 소스코드입니다.

위에서 보면 GET[no]가 if eregi (찾아볼 함수)~~~~~~~라면, exit no hack(실패)

if q[0]가 guest라면 hi guest를 출력.

if q[0]rk admin이라면 solve! 문제 해결이다

 

 

 

 

 

일단 이 18번은 SQL injection이라고 하니 이 것이 뭔지 알아보았다.

 

SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다.

 

예시로 보면 더 이해가 잘 되는 느낌이다.

 

 

 

 

 

 

 

 

 

또한 위에서 모르는 함수인 eregi 함수를 알아보았다.

 

간단히 정리하자면 문자열 필터링 함수라고 한다.

eregi("찾고자 하는 문자", "임의의 값")

ereg("찾고자 하는 문자", "임의의 값")

 

두 함수의 차이점은 eregi 함수는 대소문자를 구분하지 않는다는 것이고

ereg 함수는 대소문자를 구분한다는 것이다.

 

 

 

 

 

 

 

 

mysql_fetch_array 함수란?

Returns an array of strings that corresponds to the fetched row, or FALSE if there are no more rows.

 

mysql_query란?

mysql_query()link_identifier로 지정한 데이터베이스 서버에 하나의 질의를 전송합니다. (다중 질의는 지원하지 않습니다)

 

 

mysql_query()는 SELECT, SHOW, DESCRIBE, EXPLAIN, 결과셋을 반환하는 기타 구문에서 성공시 resource를, 오류시 FALSE를 반환합니다.

mysql_query()는 다른 형식의 SQL 구문, INSERT, UPDATE, DELETE, DROP 등에서 성공하면 TRUE를, 실패하면 FALSE를 반환합니다.

반환되는 결과 리소스는 mysql_fetch_array()와 같은 결과 테이블을 다루는 함수들에 전달하여 데이터에 접근할 수 있다.

SELECT 구문으로 부터 얼마나 많은 행이 있는지 알기 위해서는 mysql_num_rows()를, DELETE, INSERT, REPLACE, UPDATE 구문으로 변경된 행의 개수를 알기 위해서는 mysql_affected_rows()를 사용한다.

질의에 의해 참조되는 테이블에 접근을 허용되지 않은 사용자에 의해 mysql_query()가 실패하면 FALSE를 반환한다.

 

https://dev.mysql.com/doc/apis-php/en/apis-php-function.mysql-fetch-array.html

 

 

 

 

위에 따르면

my_sql로 던져진 질문에 답한 값이 q라는 배열로 값이 들어가고

그 q 배열에 들어간 값이 guest라면 hi guest를 출력

q 배열에 들어간 값이 admin이라면 풀리는 것 같다.

 

 

 

 

 

 

 

 

 

 

그래서 일단 정답 칸에 guest를 넣어보았는데 별로 다른 점은 안 보이고 주소값 위에 no=guset 로 바뀐 것을 볼 수 있었습니다.

 

 

 

1을 넣으니  hi guest가 떴습니다.

guest의 값은 1이었나봅니다.

 

계속해서 admin의 값을 찾아보겠습니다.

 

 

no가 앞에 이미 있으니까 그 뒤로 이어지는 (no=)1 or no>1을 넣어서 뭔가 항상 참이 되는 뉘앙스로 만들어줘봤습니다.

그런데 소스코드에서 eregi 에 있는 특수문자들은 no hack가 되기 때문에 띄어쓰기를 우회하는 %0a 를 써서 넣어줬습니다.

 

 

 

 

 

풀리지는 않았고 이번에도 URL이 바뀌었는데 좀 이사합니다. %0a가 %250a 로 변했는데 왜 떄문일까요?

 

 

다시 no=1 or no>1 을 입력하기 위해 no=1(%0a)or(%0a)no>1을 넣어봤습니다.

 

 

이번에도 %250a로 변했습니다. 왜 그런 걸까요? 그리고 저의 저 문제푸는 방향이 맞는 걸까요..?

 

 

 

 

 

 그래서 그냥 직접 URL에 쳐봤습니다. 이러니까 의도된 값이 URL에 변하지는 않는 것을 파악했습니다.

하지만 no=1이 참이라서 hi guest가 반환된 것 같습니다.

일단 URL에 바로 쓰는 방법으로 바꿔주겠습니다. 값을 조정해야 될 것 같습니다.

 

 

1은 guest 값이니 완전 아닐 것 같은 -999같은 더미 값을 넣어줘봤습니다.

 

 

 

no=-999또는 no>1 이니까 no이 -999일리는 없고

no>1 이라는 조건에 걸렸나봅니다.

 

admin의 값은 no>1 조건 안에 값이 있는 것으로 예상됩니다.

no>1이라는 조건에 참이 됐으니 or 개념으로 인해 전체 식이 TRUE로 반환되어 문제가 풀렸습니다!

 

 

 

완전 뿌듯!!

'SISS (2017-2018) > 웹해킹(순서대로X)' 카테고리의 다른 글

Web hacking 38  (0) 2018.05.04
Web hacking 39  (0) 2018.05.02
Web hacking 17  (0) 2018.04.10
Web hacking 16  (0) 2018.04.07
Web hacking 04  (0) 2018.04.03
Comments