안녕하세요. 이번엔 webhacking의 27번문제를 풀어보겠습니다.

홈페이지로 들어가 27번 문제를 눌러주세요.

SQL INJECTION란 문구와 밑의 제출칸이 나오는군요. 여기서 SQL INJECTION는 해킹기법중 하나입니다. 흠.. 일단 소스를 한번 봅시다.

24번 문제와 마찬가지로 주석처리 되있는 부분이 있습니다. 출처인것 같군요. 주소창에 index.phps를 적고 들어가 봅시다.

역시 이런 문제는 solve부터 봐야 합니다. 역시 앞에 조건문이 있군요. id의 변수값이 admin일 경우 문제가 해결된다고 하네요. 그런데 이 소스를 아무리 봐도 id는 보이지 않습니다. id가 어디있을까요? 일단 id의 앞푸분에 $q가 붙어있습니다. $q는 바로 위에 보이네요. 

$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");

딱 봐도 머리가 아파요. 꼭 영어문장 보는 것 같습니다. 일단 @는 수 실행시 발생하는 오류를 표시하지 않겠다는 뜻입니다. 참 너무하죠. 암튼 그다음 문장이 중요합니다. 

mysql_fetch_array 이 함수는 정말 간단하게 말하면 mysql_query()함수의 호출을 통한 결과값을 반환한다는 것입니다. 그럼 mysql_query()의 함수를 알아야겠죠? 

mysql_query()는 연결된 객체를 이용하여 MySQL 쿼리를 실행시키는 함수입니다. 즉 위문구는  mysql_query의 가로안의 문구를 쿼리형태로 실행시키라는 것입니다. 다음 문구를 보시면 select id from challenge27_table 라고 적혀있습니다. select는 mysql에서 찾아서 보여달라라는 명령어입니다. 뭐를? id를 어디서? from challenge27_table, 27번문제 테이블에서 id를 찾아 보여달라라는 의미입니다. 그 다음은 where이 나오는데 이는 조건이라고 보시면 됩니다. 즉 id='guest'인 and(그리고) no가 $_GET[no](입력받은 no값)인 id값을 27번문제 테이블에서 찾아서 보여달라는 소리입니다. 그리고 mysql_fetch_array에 의해 찾아서 보여준 id값을 반환하라 뭐 대충 이런 뜻이겠군요. 맨 뒤쪽 문구는 or(또는) die(실패했을경우) query error를 찾아서 보여준다. 라는 뜻입니다.

자 이제 정리하면 

1. 테이블의 이름은 문제27번 테이블이며 테이블의 칼럼(열)은 id와 no로 나뉘어져있습니다.

2. 아래 그림처럼 no는 ()가 있으므로 정수형을 담는 칼럼입니다.

no는 문제에 나와있는 박스의 이름이고 테이블의 시작은 0부터 시작하므로 0부터 차례대로 입력해봅시다. 

다른건 전부 쿼리 에러가 뜨는데 no값이 1일 경우에만 quest가 뜹니다. 위의 $q의 조건으로 봤을때 id가 guest인 no의 값은 1인것 같습니다. 하지만 우리의 목표는 id가 admin인 no의 값을 찾아내는 것입니다. 일단 소스를 다시 봅시다. no값은 정수형이고 테이블은 순서대로 존재하므로 no=0 admin no=1 guest 이거나 no=1 guest no=2 admin . 아마 테이블은 이 둘중 하나일 듯 싶습니다. 일단 첫번째 테이블이 맞다는 가정하에 no값을 조금 특수하게 적어보겠습니다. 

$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");

앞서 문제에 있는 SQL INJECTION은 ID 와 비밀번호를 넣는 공간에 ' 등의 특수문자를 집어넣어 sql문을 변조시키는 해킹기법중 하나입니다.위의 문구를 보시면 where id='?' and no=(?) or die() 형식으로 되어있습니다. 그런데 여기서 no값에 특수문자를 주면 어떻게 될까요? 예를 들어 no값에 0) 라고 값을 준다면 no=($_GET[no])"))의 값이 no=(0))"))라는 값이 되어 에러가 납니다. 닫는 가로가 하나 늘었기 때문이지요. 그런데? 만약 뒤가로를 주석처리 해준다면? no값에 0) -- 라고 값을 주면 no=($_GET[no])"))의 값이 no=(0) -- )")) 이렇게 되버립니다. 참고로 --는 주석처리하라는 명령어로 -- 뒤쪽의 문구는 주석처리가 되어 실제로 아무런 효과도 없어집니다. 즉 no=(0) 가 되버려 에러가 뜨지 않고 작동하는 것이지요.

자 그러면 이제 쿼리문을 변조해 봅시다.

where 다음의 조건은 id가 guest이고 no값이 (입력된 값)인 데이터를 찾아달라 라는 뜻인데 우리는 id가 admin인 no값을 찾아야 하므로 첫번째 조건 id='guest' and no=($_GET[no])는 절대 참이 될 수 없습니다. 그러면 이 첫번째 조건문을 건드려야 하는데 지금 우리 권한으론 건드릴수 있는 부분이 없습니다. 그러면 이제 두번째 조건을 볼까요?

or die("query error"); 만약 첫번째 조건에 맞지 않을 경우(실패) query error를 출력해라 . 이것을 건드려야 합니다. 근데 어떻게 건드리냐구요? 음 문구를 조금 뗴어오겠습니다.

no=($_GET[no])")) or die("query error"); 우리는 저 진한 부분만 건드릴 수 있습니다. 그런데 무슨 값을 넣어야 될까요? 우리는 첫번째 조건에 맞지 않기 때문에 두번째 조건을 바꿔줘야 합니다. 근데 두번째 조건 까진 손이 안닿습니다. 그러면? 당연히 직접 써야죠.

no값에 0) or no=0 라고 값을 줘봅시다. 그러면 no=($_GET[no])")) or die("query error")에서 no=(0) or no=0)")) or die("query error")가 됩니다. 그런데 or문은 두개가 올 수 없으므로 뒤쪽에 or문은 주석처리를 해줘 무효를 시켜줘야 합니다. 그러면 0) or no=0 -- 를 넣어서 뒤쪽의 문장을 무효화시키면 no=(0) or no=0 가 되버립니다. 그러면 이제 이 값을 입력해 봅시다. 참고로 --의 앞과 뒷부분은 뛰어쓰기를 해줘야 합니다.


??? 넣으니까 no hack 이란 문구가 나옵니다? 이상하군요. 소스를 확인해봅시다.

이 문구를 깜빡했군요. eregi함수의 형식은 (찾는문자열, 제시하는 변수) 이며 제시한 변수에 찾는 문자열이 있을 경우 다음과 같이 수행하라 라는 뜻입니다. 뒤쪽엔 exit no hack이라 있는걸로 보아 no hack을 반환한다는 군요. 그리고 찾는 문구에 =가 포함되어있습니다. 즉 아까 적었던 문구 0) or no=0 -- 에 =가 포함되어 있어 노핵을 출력한것 같습니다. 그러면 = 을 대신할 것을 적어줍시다. 여기선 like를 사용해봅시다. like는 조건이란 뜻으로 ~와 같은 이란 뜻을 가집니다. 예시로 no like 0이라고 한다면 0과 같은 no값 이란 뜻이지요. 결국 0이란 소리입니다. 자 이제 =을 뺴고 like를 넣어 적어봅시다.

제출 버튼을 눌러주세요.

아무래도 no=0 admin no=1 guest 은 아닌것 같군요. 그럼 두번째 예시 no=1 guest no=2 admin로 가봅시다. 2값이 admin이므로 2로 바꿔주시면 됩니다.

어차피 우리가 신경써야 할 부분은 or다음의 조건이기 때문에 or 앞에 0)은 사실 아무숫자나 와도 됩니다. 1) or no like 2 도 되고 2) or no like 2 도 되고 324) or no like 2 도 됩니다. 자 제출버튼을 눌러봅시다.

네 이것으로 문제풀이를 마치겠습니다. 감사합니다.

'Webhacking' 카테고리의 다른 글

webhacking - 47번 문제  (0) 2015.07.17
Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 문제24번  (0) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
Posted by englishmath
,

안녕하세요. 오늘은 Webhacking의 24번문제를 풀어보겠습니다.

홈페이지로 들어가 24번문제를 눌러주세요.

음 클라이언트 ip주소가 나오고 에이전트가 나오네요. 에이전트란 어떤 운영체제나 네트워크의 일부이며 그안에서 동작하는 시스템이란 뜻입니다. 그리고 그 밑에 틀린 IP주소라고 나오네요. 일단 소스를 봅시다. 모든 기본은 소스를 보는것부터 시작합니다.

해당 소스를 보시면 회원가입을 할때 봤던 초록색 주석부분이 있습니다.

source : index.phps라고 되어있군요. 소스는 우리말로 출처라는 뜻이므로 index.phps가 출처라는 뜻이군요. 출처를 확인하기 위해 아래 그림처럼 본 주소에 index.phps를 붙여주세요.

저는 바보라서 뭔소리인지 모르겠습니다. 이럴때는 solve()를 제일 먼저 찾는 것이 중요합니다. solve를 찾으니 앞에 조건이 하나 붙어있군요. ip주소가 127.0.0.1이면 문제를 해결한다 라고 되어있군요. 근데 문제에 나온 IP주소랑 값이 다릅니다. 이는 즉 IP주소값을 변환시켜야 할듯 하군요.

좀더 위를 보시면 if문이 하나 더 나옵니다. COOKIE에 REMOTE_ADDR의 값이 들어오면 ip의 값에 변환을 준다는군요. str_replace 함수가 쓰였습니다. replace는 대신하다 라는 뜻으로 첫번째 값이 있으면 그 첫번째 값을 두번째 값으로 대신한다 라는 함수입니다. 즉 해석하면 REMOTE_ADDR의 값에 12가 있으면 12를 " "로 대신하고 7.이 있으면 7.을 " "로 대신하고 0.이 있으면 " "로 대신하라. 라는 뜻이네요. 여기서 " "는 공백을 의미합니다. 그리고 ip주소는 REMOTE_ADDR의 값이 들어있으므로 REMOTE_ADDR의 값에 12, 7., 0.이 들어가있으면 전부 없애서 IP주소 값에 반환된다는군요.

자 이제 해석은 끝났고 문제를 해결해 보겠습니다. 

1. 우리는 127.0.0.1이란 값을 ip주소값에 넣어야 한다.

2. ip주소값은 곧 REMOTE_ADDR이다.

3. REMOTE_ADDR값의 12, 7., 0.이 들어가면 무효가 된다.

여기서 3번을 잘 보시면 12 , 7., 0.이 들어가면 무효가 된다 했는데 이것은 한번만 유효하는 겁니다. 즉 12127.0.0.1을 넣는다면 처음에 12는 없어지지만 두번째 12는 없어지지 않습니다. 즉 121이 반환되는 것이지요. 그렇다면 답은 나왔습니다. 총 두번씩 적어주면 됩니다.

121277..00..00..1 이렇게 적으면 하나씩 다 없애서 127.0.0.1이 나오겠군요. 자 이제 답은 구했습니다. 그러면 이제 이값을 REMOTE_ADDR에 넣어야 합니다. 그런데 어디에 있을까요? 앞에 COOKIE가 적혀있어 COOKIE Editor을 눌러보았습니다만 REMOTE_ADDR이름의 쿠키는 없었습니다. 이럴때에는 주소창에 직접 적어주셔야 합니다.

쿠키값을 변조시켜야 하므로 그냥 변수만 적으셔는 안되고 홈페이지에서의 함수 javascript양식에 맞추어 적어봅시다.

javascript:alert(document.cookie="REMOTE_ADDR=112277..00..00..1");

해석하면 javascript: = 자바스크립트 양식 , alert = 경로 , documnet.cookie = 쿠키를 기록하다, "REMOTE_ADDR=112277..00..00..1" = 쿠키를 이값으로 기록하겠다. 라는 뜻입니다.

주소창에 입력하셨으면 엔터를 쳐주시면 됩니다.

값이 넣어졌다는 군요. 창을 닫고 새로고침을 해주세요.

네 이것으로 문제풀이를 마치겠습니다. 감사합니다.

'Webhacking' 카테고리의 다른 글

Webhacking - 33번 문제  (2) 2015.07.11
Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제 11번  (0) 2015.07.08
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 문제1번  (0) 2015.07.04
Posted by englishmath
,

안녕하세요. 이번엔 웹해킹 문제 11번을 풀어겠습니다.

http://webhacking.kr/ 에서 문제 11번에 들어가 봅시다.

음. 소스처럼 보이는 문구가 적혀있습니다. 일단 소스를 분석해봅시다. 그림은 삽입하지 못했습니다. 죄송합니다.

이번엔 소스에도 별 내용이 없습니다. solve 소스도 안보이는걸로 보아 평범하게 풀기는 힘든 문제인것 같군요. 일단 문제 11번에 적혀있는 소스를 해석해봅시다. 일단 if문부터 봅시다. preg_match함수가 쓰였군요. preg_match란 PHP에서 패턴이 일치하는 문자 혹은 숫자를 판단하기 위해서 사용되는 함수이며 preg_match(패턴, 비교할 변수) 형태로 사용됩니다. 음 그렇다면 저기서는 &pat가 패턴이고 &_GET[val]가 비교할 변수이겠군요.그리고 $_GET는 method = "get" 이란 의미로 설정된 폼으로부터 값을 수집하는데 사용하는 함수입니다. 저기에선 &_GET[val]라고 쓰였으므로 폼으로부터 val 값을 수집하라 라고 해석할 수도 있겠군요. 그럼 val값을 폼에 적어야 되겠군요. 폼으로부터 가져온 val값이 pat패턴과 일치하면 패스워드를 출력하라고 되있으니까요. 폼은 형식이란 뜻으로 여기에서는 주소형식이라는 뜻으로 해석합니다.

if문이 쓰인걸로 보아 만약 패턴이 일치한다면 패스워드를 출력하라 뭐 이런 소리군요. 그리고 if문 앞에 &pat가 있는 걸로 보아 패턴이 주어진 것 같습니다. 참고로 패턴을 만든다 이 소리는 정규식을 이용했다는 것입니다. 패턴을 만들기 위해서는 정규식에 맞춰 짜야하기 때문입니다.그럼 정규식에 맞추어 해석해 보겠습니다.

" " : 패턴을 만들때 들어가는 기본 형식입니다.

/ : 처음과 끝을 나타냅니다.

[] : 안에 존재하는 문자나 숫자 중 하나만을 나타내라는 뜻이며 []안의 -는 범위를 나타냅니다. 예를 들면 [a-z]는 a에서 z중 하나를 나타내라는 뜻이고 [1-50]은 1부터 50에서 하나를 나타내라는 뜻입니다.

{}= 앞에 있는 문자를 {}안의 개수만큼 출력하라 라는 뜻입니다. 즉 [3]{5}는 3을 5번 출력하라는 뜻입니다.

* = *앞의 문자를 0개 이상으로 포함한다 라는 뜻이므로 a*b는 b,ab,aab,aaab를 포함한다고 볼 수 잇습니다.

\t = tap이라는 의미를 가지며 url로 쓰기 위해서는 인코딩을 해야합니다. url인코딩을 했을 경우 %09라는 값이 나온다.

이에 맞춰서 $pat="/[1-3][a-f]{5}_.*IP주소.*\tp\ta\ts\ts/"; 를 해석하면 1aaaaa_.IP주소.%09p%09a%09s%09s 가 나옵니다. 이것이 pat의 패턴입니다. 그리고 이 패턴이 &_GET[val]과 일치해야 하고 &_GET은 폼에서 값을 가져오라는 뜻이므로 주소형식에 입력을 해야합니다. 변수가 val 이므로 그대로 주소에 val = 식으로 적어주시면 되겠습니다. 아 그리고 php에서 주소창에 변수를 입력하실 때에는 주소 맨 끝자리에 ?를 붙이고 변수를 입력하셔야 합니다.

다적으셨으면 엔터를 쳐주세요.

네 이것으로 11번 문제 풀이를 마치겠습니다.

'Webhacking' 카테고리의 다른 글

Webhacking - 27번문제  (2) 2015.07.10
Webhacking - 문제24번  (0) 2015.07.10
webhacking시작 - 문제17번  (6) 2015.07.05
webhacking시작 - 문제1번  (0) 2015.07.04
webhacking시작 - 회원가입  (0) 2015.07.04
Posted by englishmath
,