보안 공부하는 꼬깔이

Webhacking.kr 26번 문제 풀이

 

 

26번 문제에 접속하면 index.phps 힌트 페이지가 존재한다.

확인해보자.

힌트페이지에는 php 소스코드가 존재한다. 해석해보자

 

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } #GET방식으로 id변수에 저장된 값이 "admin"이면 코드 실행 종료
$_GET[id]=urldecode($_GET[id]); #GET방식의 id변수에 저장된 값을 urldecode 수행 후 다시 id변수에 저장

if(
$_GET[id]=="admin") #id변수에 저장된 값이 "admin" 이면 문제 해결
{ 
@
solve(26,100); 
} 

?> 

소스코드를 참조하면 GET방식으로 id변수에 "admin"이라는 값을 입력 받아야 문제가 해결된다. 하지만 "admin" 문자열을 전달하게 되면 eregi 함수에 의해 필터링되고 소스코드가 강제로 종료되게 된다.

그렇다면 admin을 url encode해서 전달하게 되면 어떻게 될까?

"admin" url encoding 한값 :  %61%64%6d%69%6e

필터링 당했다. 이유는 url encoding 된 %61%64%6d%69%6e 값을 전달해도 서버에 전달됨과 동시에 서버의 php가 해석을 해서  "admin" 이라는 문자로 받아들이기 때문이다.

 $_GET[id]=urldecode($_GET[id]);

그렇다면 소스코드중 urldecode를 한번더 수행해 id변수에 저장하는 소스코드를 이용해 문제를 풀어보자.

%61%64%6d%69%6e 값을 한번더 encoding 한 뒤 서버측으로 전달하게되면 서버측 php가 해석을 해도 "admin"이라는 문자가아닌 "%61%64%6d%69%6e" 문자로 판단할 것이고 eregi 함수의 if문을 우회할 수 있다. 그리고 바로  $_GET[id]=urldecode($_GET[id]); 해당 구문이 실행 되어  "%61%64%6d%69%6e" 를 url decoding 한 값인 "admin"을 id변수에 저장할 것이고 문제가 풀릴것이다.

admin을 2번 url encoding 한 값인 "%2561%2564%256d%2569%256e" 을 get방식으로 전달해보자.

예상대로 eregi 함수로 필터링 하는 if문을 우회한뒤 한번 더 urldecoding을 통해 "admin"이 id변수에 저장되었고 문제가 풀렸다.

100 Point 획득 :D

 

 

 

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07

Webhacking.kr 25번 문제 풀이

 

25번 문제 메인화면이다.

리눅스에서 ls -l 명령어를 수행 했을때 나오는 결과값과 비슷한 내용이 존재한다.

그리고 url을 확인하면 GET 방식으로 file 변수에 밑에 존재하는 파일들의 이름을 입력하면 출력되는 형식인 것 같다.

디폴트 값으로는 hello 값이 get 방식으로 전달된다. 그리고 참고할 사항으로는 file 변수에 hello 만 전달했는데 hello.txt가 출력되었다. 그렇다는 것은 $file."txt" 이런식으로 php 파일을 실행할 수 없게끔 확장자를 고정시켜 놓은 모양이다.

그리고 password, index 외에 임의의 아무 값이나 입력해도 hello.txt 의 내용이 출력된다.

$file=$GET_['file']."txt"

if(file==hello.txt)

{

해당파일 open 후 출력

}

else if(file==index.php

{

해당파일 open 후 출력

}

esle if(file==password.php)

{

해당파일 open 후 출력

}

esle

{

hello.txt 내용 출력

}

아마 이런식으로 소스코드가 작성되어 있어서 password.php, index.php 를 입력해도 뒤에 ".txt" 확장자가 강제로 붙어 조건에 부합하지 않기 때문에 else 문으로 따져 hello.txt 파일의 내용이 출력되는 것이 아닌가 추측된다.

그렇다면 마지막에 붙은 확장자를 우회하기 위해 문자열을 강제로 끝마치는 %00(null 바이트) 를 파일 이름 뒤에 붙여 넘겨주게 되면 ".txt" 구문은 무시하게 되고 우리가 원하는 파일을 출력시킬수 있을 것이다.

실제로 ".txt" 확장자가 %00(null바이트) 로 인해 무시하고 password.php 파일이 출력되었다.

출력된 password를 auth 에 입력하면 문제 공략 성공!

150 Point Get :D

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 26번 문제 풀이  (0) 2017.07.12
Webhacking.kr 24번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07

Webhacking.kr 24번 문제 풀이

 

 

 

24번 문제의 메인 화면이다.

 

client 에는 나의 공인 ip가 출력되어 있었다.

 

페이지 소스를 확인해보니 index.phps 힌트파일이 존재한다고 주석처리 되어있다. index.phps로 들어가보자

 

 

코드에는 현재 문제의 php 소스코드가 존재했다. 해석해보자

 

 

 

<?

extract
($_SERVER); #extract는 배열속의 키값을 변수화 시켜준다 즉, $_SERVER의 값을 변수화 시킴 
extract($_COOKIE); #$_COOKIE의 값을 변수화 시킴

if(!
$REMOTE_ADDR$REMOTE_ADDR=$_SERVER[REMOTE_ADDR]; #문제에 접속한 클라이언트 IP가 없으면 REMOTE_ADDR 변수에 문제에 접속한 클라이언트 IP 저장

$ip=$REMOTE_ADDR; #ip 변수에 클라이언트 ip저장
$agent=$HTTP_USER_AGENT; #agent 변수에 $HTTP_USR_AGENT 를 저장


if(
$_COOKIE[REMOTE_ADDR])
{
$ip=str_replace("12","",$ip); #클라이언트 ip에 12 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("7.","",$ip); #클라이언트 ip에 7. 라는 문자가 들어오면 공백으로 치환
$ip=str_replace("0.","",$ip); #클라이언드 ip에 0. 라는 문자가 들어오면 공백으로 치환
}

echo(
"<table border=1><tr><td>client ip</td><td>$ip</td></tr><tr><td>agent</td><td>$agent</td></tr></table>");

if(
$ip=="127.0.0.1") #ip에 저장된 값이 127.0.0.1 이면 if문 수행
{
@
solve(); #문제 공략
}

else
{
echo(
"<p><hr><center>Wrong IP!</center><hr>");
}
?>

소스코드 해석을 참조해보면 REMOTE_ADDR 쿠키에 저장된 값을 $ip 변수에 저장하고 그 값이 127.0.0.1 이면 문제가 풀리게된다.

 

 

 

하지만 위의 소스코드중 str_replace 함수를 이용해 "12" , "7." , "0." 을 사용하면 공백으로 치환시킨다.

 

 

 

실제로 공백으로 치환되는지 확인해보기 위해 REMOTE_ADDR 쿠키를 추가하고 127.0.0.1 주소를 넣어주고 전달했다.

 

 

실제로 "12", "7.", "0." 이 필터링당해 1 하나만 남아있는것을 확인 할 수 있었다.

 

str_replace는 처음 한번 변수에 저장된 값을 검사해 치환을 하고 그 후에 다시 저장된 값에 대해서는 검사를 하지 않는다.

 

그렇다면 112277..00..00..1 이런식으로  적게 된다면 어떻게될까?

"1122"에서 가운데 "12"가 공백으로 치환되어 최종적으로 "12"라는 문자가 완성될 것이다. 그렇게 "7." , "0." 부분도 똑같이 완성될 것이며 127.0.01 이 완성된다. str_replace는 다시 저장된 값에 대해서는 검사하지 않기 때문에 문제를 공략할 수 있을것이다.

str_replace 구문의 필터링을 우회하여 127.0.0.1 의 주소가 들어갔고 문제를 공략했다.

 

100 Point Get :D


 

 

 

 

 

 

'Web Hacking > Web Hacking.kr' 카테고리의 다른 글

Webhacking.kr 26번 문제 풀이  (0) 2017.07.12
Webhacking.kr 25번 문제 풀이  (0) 2017.07.10
Webhacking.kr 23번 문제 풀이  (0) 2017.07.10
Webhacking.kr 21번 문제 풀이  (2) 2017.07.10
Webhacking.kr 20번 문제 풀이  (0) 2017.07.07