알맹이방
Web hacking 18 본문
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 |