Webhacking.kr- 50,100점 문제 writeup
Wargame/webhacking.kr

Webhacking.kr- 50,100점 문제 writeup

#6.

소스를 보아하니 idpasswordbase6420번 인코딩한 값을 넣어주어야 하는 것 같았다. 그리고 끝에 decode된 결과값은 admin, nimda 여야 한다고 하니,

php compiler를 이용해서 admin, nimda를 각각 20번 인코딩 해주도록 하자.

 

<?php //php 7.0.8

$val_id="admin";

$val_pw="nimda";

 

for($i=0;$i<20;$i++){

$val_id=base64_encode($val_id);

$val_pw=base64_encode($val_pw);

}

$val_id=str_replace("1","!",$val_id);

$val_id=str_replace("2","@",$val_id);

$val_id=str_replace("3","$",$val_id);

$val_id=str_replace("4","^",$val_id);

$val_id=str_replace("5","&",$val_id);

$val_id=str_replace("6","*",$val_id);

$val_id=str_replace("7","(",$val_id);

$val_id=str_replace("8",")",$val_id);

 

$val_pw=str_replace("1","!",$val_pw);

$val_pw=str_replace("2","@",$val_pw);

$val_pw=str_replace("3","$",$val_pw);

$val_pw=str_replace("4","^",$val_pw);

$val_pw=str_replace("5","&",$val_pw);

$val_pw=str_replace("6","*",$val_pw);

$val_pw=str_replace("7","(",$val_pw);

$val_pw=str_replace("8",")",$val_pw);

echo "$val_id";

echo "\n";

echo "$val_pw";

 

 

?>

를 하면 엄청나게 긴 내용이 나온다.

이미 #24를 푼 다음에 마지막에 푼 거라 editthiscookie가 깔려 있었기 때문에

인코딩 하고 디코딩 한 값을 cookie에 있는 user,password에 각각 입력해주었다.

#old 6 pwned.

 

 

#14.

일단 무언가를 입력하는 창밖에 보이지 않아서 개발자 도구를 열어보았다.

script가 존재했다. 해석을 해보기로 하자.

function ck(){

var ul=document.URL;

ul=ul.indexOf(".kr");

ul=ul*30;

if(ul==pw.input_pwd.value) { location.href="?"+ul*pw.input_pwd.value; }

else { alert("Wrong"); }

}

.kr까지의 인덱스 수를 세서 30을 곱한 수를 넣어주는게 비밀번호 인 듯 하다.

.kr까지의 인덱스 수는 18이었고, 540을 넣어주었더니 pwned되었다.

 

 

#15.

일단 문제에 접속하면 “Access denied"라고 뜨면서 접근이 거부된다.

burpsuite를 이용해 프록시를 intercept 해보도록 한다.

Response 모드로 바꾸면 script를 캐치할수 있다.

 

<script>

alert("Access_Denied");

location.href='/';

document.write("<a href=?getFlag>[Get Flag]</a>");

</script>

 

location.href='/' 때문에 url/가 들어가는 것 같았다.

burpsuite에서 location.href='/'내용을 지우고 forward해주었다.

get flag라는 화면이 떴고, 클릭했더니 15번이 pwned되었다.

 

 

#16.

문제로 접속했더니 별 모양이 덩그러니 있었다.

아무것도 찾을수 없어서 우선 페이지 소스를 찾아보았다.

 

document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";

function mv(cd){

kk(star.style.left-50,star.style.top-50);

if(cd==100) star.style.left=parseInt(star.style.left+0,10)+50+"px";

if(cd==97) star.style.left=parseInt(star.style.left+0,10)-50+"px";

if(cd==119) star.style.top=parseInt(star.style.top+0,10)-50+"px";

if(cd==115) star.style.top=parseInt(star.style.top+0,10)+50+"px";

if(cd==124) location.href=String.fromCharCode(cd)+".php"; // do it!

}

function kk(x,y){

rndc=Math.floor(Math.random()*9000000);

document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";

}

 

cd==97 등의 아스키 코드값을 입력하면 *이 움직인다는 내용인 것 같았다.

아스키 코드를 해석하니 A,S,D,W,| 였고, 스크립트의 내용에 따라 |를 입력했더니 pwned 되었다.

 

 

 

#old 17

 

unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+1/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10-100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+9999999;

function sub(){ if(login.pw.value==unlock){ location.href="?"+unlock/10; } else{ alert("Wrong"); } }

 

unlock=(수식값)을 콘솔창에 입력하면 unlock의 값 확인이 된다. 7809297.1이라는 값을 입력하면 pwned된다.

 

#old 18

먼저 source를 확인해 보았다. 소스를 확인해 보았더니 adminno2로 만들어줘야 한다.

그렇지만 공백을 필터링 하니 공백 대신에 필터링 문자를 %0a를 사용하기로 했다.

앞쪽에 거짓인 내용을 넣어주고, 필터링 문자를 사용해주었다.

?no=3%0aor%0ano=2 값을 URL에 넣어주었더니 old 18 pwned를 얻을 수 있었다.

 

 

#old 24.

1. client ip가 적혀져 있는 table을 발견할 수 있고, wrong ip라는 것을 발견할 수 있다.

따라서 맞는 ip로 바꿔줘야 한다고 생각했다.

2. index.php 들어가서 소스를 확인해 본다.

ip 이름이 REMOTE_ADDR이고, REMOTE_ADDR127.0.0.1이면 problem solve라고 한다.

약간 이름이 생소해서 정의를 몇 개 확인해보았다.

1) $REMOTE_ADDR :클라이언트의 ip주소를 가져온다.

2) $HTTP_USER_AGENT: 클라이언트의 접속환경 정보를 가져오는 php의 환경 변수라고 한다.

 

3. 소스를 읽어보면 str_replace()를 통해 ip주소들을 바꿔버리는 것을 확인할 수 있다.

replace 조건을 역순으로 적어보니 112277...00...00...1이라는 주소값을 얻을 수 있었다.

4, 이름이 REMOTE_ADDR인 쿠키를 하나 추가해줘야겠다고 생각했다.

5. 쿠키를 변조해줘야 하는데, 크롬으로 확장 프로그램이 있다고 해서 당장 설치했다! (이름은 editthiscookie 이다.)

6. 쿠키를 추가해주고, f5를 눌렀더니 pwned되었다! 상당히 재밌는 문제였다.

 

 

 

#old 26.

별로 어려운 문제는 아니었다.

소스를 살펴보니 adminurl 인코딩해야 입력을 받는 것 같았다.

그렇지만 인코딩해서 url에 입력했더니 막혔다.

decoding하는 함수보다 decoding해서 막는 함수가 더 앞에 있다.

source에 막히지 않도록 한 번 더 인코딩해야될 것 같다.

admin=%2561%2564%256D%2569%256E

=> old 26 pwned.

 

 

#old 38.

문제에 접속하자마자 log injection이라고 적혀있었다.

log injection은 생소해서 정의부터 찾아보기로 했다.

Applications typically use log files to store a history of events or transactions for later review, statistics gathering, or debugging. Depending on the nature of the application, the task of reviewing log files may be performed manually on an as-needed basis or automated with a tool that automatically culls logs for important events or trending information.

Writing unvalidated user input to log files can allow an attacker to forge log entries or inject malicious content into the logs. This is called log injection.

=> 로그 파일 속에 잘못된 내용이나 콘텐츠를 넣어서 attack할수 있는 내용이라고 한다.

log injection의 정의를 찾아본 뒤에 우선 페이지 소스를 살펴보았다.

입력 후에 <admin.php>로 이동하는 듯 하다.

우선 아이디는 대부분 admin이기 때문에 admin을 입력했지만, 역시 경고창이 떴다.

이후에 admin.php로 이동해보았다.

  파일의 로그 들이 전부 기록되어 있는 것을 확인할수 있었다.그렇지만 어떻게 해야할진 딱히 생각이 나지 않았다..

 

admin을 로그에 찍어야 문제를 풀수 있는 것 같은데..

이때, burpsuite를 활용해보라는 갓갓님의 말을 따라 프록시를 잡아보았다.

id를 입력할수 있었다.

이때 burpsuite는 여러줄로 줄바꿈하여 입력할 수 있으므로

id=(임의의 글자)

117.111.13.22:admin으로 찍어서 forwarding 해준다.

문제가 풀렸다. (사실 congratulation이 안뜬줄 알고 몇 번이나 다시해봤다...)

 

 

 

 

 

#old 39

source를 확인해보았다. injection인 것 같다.

$db = dbconnect();

if($_POST['id']){

$_POST['id'] = str_replace("\\","",$_POST['id']);

$_POST['id'] = str_replace("'","''",$_POST['id']);

$_POST['id'] = substr($_POST['id'],0,15);

$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));

if($result[0] == 1){

solve(39);

}

\\도 필터링 되고, 따옴표 역시 ‘ ’ 싱글 쿼터 두 개 로 필터링되게 된다.

substr에 의해 15글자가 잘린다는 사실까지 확인 했지만, 그닥 생각은 잘 나지 않았다.

계속 이것저것 입력해보았다.

idadmin일 것이고, 15글자까지만 입력이 된다는 사실을 이용해서 admin ‘를 입력했다. 이때 싱글쿼터가 ’‘로 바뀐다 할지라도 16번째 는 잘리게 되므로 admin을 닫아주는 역할만 하게 된다. #39 pwned.

 

 

#old 54

패스워드 가 한글자씩 일정한 텀을 두고 반복되면서 나타났다가 사라졌다.

소스를 이용해서 한줄로 쭉 붙여서 이어지도록 하자.

콘솔창에 아래와 같이 소스를 수정해서 실행시켜준다.

x=run();

function answer(i){

x.open('GET','?m='+i,false);

x.send(null);

aview.innerHTML+=x.responseText;//붙여져서 문자열이 나타나도록 고쳐준다.

i++;

if(x.responseText) setTimeout("answer("+i+")",20);

//이 밑에 있었던 공백이 나타나면 ?로 다시 돌아가게 하는 명령문도 지워준다.

}setTimeout("answer(0)",1000);

 

Password is ?FLAG{a7981201c48d0ece288afd01ca43c55b}를 얻을 수 있다.

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

Webhacking.kr- challenge 10,36,42, 43  (0) 2020.02.23
Webhacking.kr) OLD-23 writeup  (0) 2019.12.30
Webhacking.kr) old-33 WRITE-UP  (0) 2019.12.30
Webhacking.kr 150점 write-up  (0) 2019.12.04