'2018/01/26'에 해당되는 글 2건

  1. 2018.01.26 [webhacking.kr] prob46(300pt)
  2. 2018.01.26 [webhacking.kr] prob25(150pt)
2018. 1. 26. 08:47

## prob46(web, 300pt)


[Main]

 46번 문제는 sql injection 문제였는데 mysql의 string관련 내장함수를 잘 이용하거나 mysql특징을 잘 알면 풀 수 있는 문제였습니다. 우선 문제를 보도록 하겠습니다.


[그림 1] 문제 페이지


 우선 대놓고 문제 페이지에서 SQL INJECTION이라고 적혀있습니다. 소스코드보기를 하면 index.phps가 주석으로 나와 있는데 index.phps에서 페이지 소스를 보면 아래 [그림 2]와 같습니다.


[그림 2] index.phps


 위 소스코드를 잘 보면 공백 문자, '/', '*', '%'를 str_replace()함수로 필터링하고 있으며, 아래 eregi()함수를 이용하여 "union", "select", "from", "challenge", "0x", "limit", "cash" 문자열들을 필터링하고 있습니다. 그리고 그 아래에서는 가장 중요한 sql 쿼리문("select id, cash from members where lv=$_GET[lv]")이 보입니다. 우선 lv에 0도 넣어보고, 1도 넣어보고, 2도 넣어보고 해봤는데 1만 값이 출력되는 걸로 봐서, lv가 1인 경우밖에 없나보다라고 생각했습니다.


 자, 이제 sql injection을 할 차례입니다. 처음에는 lv변수가 숫자이므로 싱글 쿼터를 쓰지 않아도 된다는 점은 좋았습니다.(왜냐하면.. 싱글 쿼터를 써봤는데 아래 싱글쿼터가 php의 보안 설정인 magic_quotes_gpc가 on되어 있어서 싱글쿼터 앞에 '\'를 자동으로 붙이게 되어 sql 쿼리문에서 먹히지 않았습니다...) 그래도 문제를 쉽게 풀려면 "select id, cash from members where lv=0 or id='admin'"이렇게 해야하지만 싱글쿼터를 쓸 수 없으니.. 이 방법은 빠르게 접었습니다. 그리고 우선은 공백 문자 필터링을 우회해야하는데 처음엔 '%'를 필터링하니까 %0a를 사용할 수 없겠구나 라고 생각했지만 해보니 됐습니다.(왜 그런지는 아직 잘..) 이렇게 %0a로 공백문자를 우회하고 나니까 "select id, cash from members where lv=0%0aor%0alv=1"과 같은 식의 injection을 테스트 할 수 있었습니다. 잘 먹히는게 확인되었습니다.


 그래서 싱글쿼터를 안하고 이것 저것 시도해보다가 "select id, cash from members where lv=1%0aand%0alength(id)=8"과 같은 구문을 시도해봤는데 아래 [그림 3]과 같이 [그림 1]과는 길이가 8인 다른 아이디가 출력되는 것을 확인할 수 있었습니다.


[그림 3] 첫 번째 시도


 흠.. 생각해보니까 MySql에서 싱글쿼터를 쓰지 않고 문자를 표현할 때 'admin'=0x61646D696E 처럼 16진수로 나타내도 된다고 알고 있는데, "0x"가 필터링 되서 못쓴다고 생각했지만 0x가 되면 0b도 되지 않을까 해서 아래 [그림 4]와 같이 "select id, cash from members where lv=1%0aand%0aid=0b110000101100100011011010110100101101110"을 입력했더니 문제가 풀렸습니다.


[그림 4] Congratulation(1)


 흠 근데 생각해보니 mysql의 string관련 내장 함수를 쓰면 이렇게 말고도 풀 수 있을 것 같아 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html 여기를 뒤적거리다보니 쓸만한 함수가 나왔습니다. char()함수입니다. 위 url의 메뉴얼에 따르면 char(97,100,109,105,110)='admin'이라고 합니다. 그래서 아래 [그림 5]처럼 injection하면 짜잔! 풀립니다.


[그림 5] Congratulation(2)


'Wargame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob4(150pt)  (0) 2018.02.21
[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob25(150pt)  (0) 2018.01.26
[webhacking.kr] prob20(200pt)  (0) 2018.01.19
[webhacking.kr] prob8(350pt)  (0) 2018.01.18
Posted by holinder4S
2018. 1. 26. 07:01

## prob25(web, 150pt)


[Main]

 25번 문제는 널 바이트를 이용하는 문제였습니다. 생각보다 많이 어렵진 않았지만 하마터면 

엄청 삽질할 뻔했습니다...


 우선 문제를 보도록 하겠습니다.


[그림 1] 문제 페이지


 문제 페이지를 보면 뭔가 리눅스의 "ls" 명령의 결과 처럼 보이는 파일들 목록이 보이고, 아래에는 "hello world"라는 문자열이 보입니다. 그리고 URL을 봤더니 "~/?file=hello"라고 되어 있습니다.


 저는 여기서 뭔가 GET방식의 파라미터 file변수로 받은 값에 ".txt"를 붙여서 파일을 read하고 보여주는 구나~ 라고 생각했습니다. 그런데 read하는 방식은 exec()함수(?) php에서 명령어를 실행하는 함수를 사용하는 줄 알고 "/?file=index.php;"이런식으로 커맨드 인젝션이 될 줄 알고 해보았습니다. 그런데 password.php도 안되고 다 안되서 실패!


 두 번째로 생각해낸 방식은 예전에 어디서 LFI문제에서 php의 filter기능을 쓰는 것을 본적이 있는 것 같아서 검색해보았더니 대충 "?var=php://filter/convert.base64-encode/resource=index"이런식으로 사용하는 것이었습니다.(참고 : http://www.php.net/manual/en/filters.php) 이외에도 여러 php의 필터방식을 이용하여 파일을 읽는 방식을 이용해보았지만 실패했습니다.


 마지막 세번째로.. 생각해낸 방식은 파일이름 뒤에 ".txt"가 붙여져서 파일을 read하는데 앞에 NULL문자인 %00을 넣으면 어떨까? 라고 생각하고 "/?file=index.php%00"을 넣었더니.. 아무 반응이 없었습니다. 여기서 %00이 아닌지 알고 넘어갔으면 한참동안 삽질할뻔 했으나.. "/?file=password.php%00"을 넣으니 아래 [그림 2]와 같이 파일이 읽혔습니다!


[그림 2] Congratulation!



'Wargame > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob46(300pt)  (0) 2018.01.26
[webhacking.kr] prob20(200pt)  (0) 2018.01.19
[webhacking.kr] prob8(350pt)  (0) 2018.01.18
[webhacking.kr] prob21(250pt)  (0) 2018.01.13
Posted by holinder4S