Wargame

[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

[Webhacking.kr] 25번

2017. 9. 6. 23:03

들어가면 밑과 같은 내용과 hello world가 입력되있는 입력창이 있다.


합계 12 -rw-r--r-- 1 oldzombie users 12 5월 14 00:57 hello.txt -rw-r--r-- 1 oldzombie users 1158 9월 5 01:24 index.php -rw-r--r-- 1 oldzombie users 57 5월 14 00:57 password.php


주소를 보면 ?file=hello가 뒤에 붙어있는것을 알 수 있다.


아마 입력창에 보이는 저것이 hello.txt의 파일 내용일것이다.


그러므로 file=password로 해보면 뭔가 나오지 않을까 생각해서 바꿔보았으나 아무것도 일어나지않았다.


webhacking.kr/challenge/bonus/bonus-5/hello.txt 이렇게 들어가보니 hello.txt의 내용이 나왓다.

webhacking.kr/challenge/bonus/bonus-5/password.php로 들어가보니 아무것도 없었다.


음... 다시 원점으로 돌아와서 이 페이지는 file=파일명을 입력하면 파일의 내용을 보여주는 것같다.


재미있는 점은 입력창에 적힌걸 지우거나 수정하고 file=asdf 등을 url에 입력해도 hello.txt의 내용을 보여준다는 것이다.


그 말은 아마 default로 file에 없는 이름이 들어간 경우 hello.txt를 보여주는 것이 되는 것같다.

그런데 index나 password, password.php,index.php 를 입력해도 hello.txt를 보여준다.


거기다 맨 처음 설정되어잇는 file=hello에서 .txt를 안붙이고 파일 이름만 적혀있는 걸 보니


내부 동작에서 $file = $_GET[file].".txt" 같은 것으로 되어있는 것같다. 이게 아니라면 $file = $file+".txt"던지 어쨋든 뒤에 txt가 붙기 때문에 index.php나 password.php를 입력해도 뒤에 txt가 붙어서 디폴트로 계속 hello.txt가 출력되는것 같다.


문자는 NULL을 만나면 끝나므로 file=password.php%00 등을 입력하면 아마 뒤에 있는 ".txt"는 무시되어 password.php가 열리지 않을까 싶다. (%00은 인코딩된 NULL값이다)


webhacking.kr/challenge/bonus/bonus-5/?file=password.php%00


로 ?file=password.php%00를 입력해보았다.


Challenge 25 password is ~~nullbye2~~


라는 값이 입력창에 나왔다. 바로 auth로 인증하러가였다.


클리어

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

[Webhacking.kr] 27번  (0) 2017.09.06
[Webhacking.kr] 26번  (0) 2017.09.06
[Webhacking.kr] 24번  (0) 2017.09.06
[Webhacking.kr] 19번  (0) 2017.09.06
[Webhacking.kr] 18번 SQL INJECTION  (0) 2017.09.04

[Webhacking.kr] 24번

2017. 9. 6. 22:41

 

client ip

1**.***.***.***

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


Wrong IP!


문제 내용은 저렇다.  (ip는 혹시 몰라서 모자이크 처리함)


소스보기를 해서 보니 주석으로 <!-- source : 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
34
35
36
37
38
39
40
41
42
43
44
45
46
<html>
<head>
<title>Challenge 24</title>
</head>
<body>
<?
 
extract($_SERVER);
extract($_COOKIE);
 
if(!$REMOTE_ADDR$REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
 
$ip=$REMOTE_ADDR;
$agent=$HTTP_USER_AGENT;
 
 
if($_COOKIE[REMOTE_ADDR])
{
$ip=str_replace("12","",$ip);
$ip=str_replace("7.","",$ip);
$ip=str_replace("0.","",$ip);
}
 
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")
{
@solve();
}
 
else
{
echo("<p><hr><center>Wrong IP!</center><hr>");
}
?>
 
 
 
<!--
source : index.phps
-->
 
</body>
</html>
cs


일단 코드를 분석하자.


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

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


$_SERVER[REMOTE_ADDR] : 현재 페이지를 보고있는 시스템의 ip 주소

$_SERVER[HTTP_USER_AGENT] : 클라이언트의 접속 환경 정보(브라우저 정보 등)


그러므로 extract으로 변수들을 생성하고 $ip=$REMOTE_ADDR; 의 ip를 str_replace 함수를 거쳐서 ip값을 필터링시킨다.


필터링되는 값은 "12", "7." , "0." 으로 모두 "127.0.0.1"이라는 ip를 만드는데 방해하기 위해 사용된다.


일단 쿠키값 변조를 통해 REMOTE_ADDR 값으로 ip주소를 넣고 또 이값이 필터를 거쳐서 "127.0.0.1"이 되게 만들면 될것같다.


112277..00..00..1 이렇게 넣으면 필터를 거쳐서 127.0.0.1이 될 것같다.


EditThisCookie 툴을 이용해서 REMOTE_ADDR 이름의 쿠키를 만들고 값을 112277..00..00..1로 설정했다.




You have cleared the 24 problems.

Score + 100



문제가 풀렸다.


참고로 javascript를 이용해서도 쿠키변조가 가능하다.


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


아니면 크롬 개발자 도구에서 Console 창에서 javascript:document.cookie="REMOTE_ADDR=112277..00..00..1";를 입력하는 방법도 있다.


근데... 다른 쿠키값들이 다 변조되서 티스토리 로그아웃되는 등 곤란한점이 있다 ㅠ;

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

[Webhacking.kr] 26번  (0) 2017.09.06
[Webhacking.kr] 25번  (0) 2017.09.06
[Webhacking.kr] 19번  (0) 2017.09.06
[Webhacking.kr] 18번 SQL INJECTION  (0) 2017.09.04
[Webhacking.kr] 17번  (0) 2017.09.04

[Webhacking.kr] 19번

2017. 9. 6. 22:21

id :   


저렇게 있다. 제출을 누르면 you are not admin라고 나온다.


다른것을 입력하면 페이지가 이동됫다가 바로 다시 원래 문제 페이지로 돌아온다.


그래서 소스보기로 아이디를 제출하면 어떤 소스가 나오는지 알아보았다.


아이디를 제출햇을때 나오는 소스는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
 
<html>
<head>
<title>Challenge 19</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
input { background:silver; color:black; font-size:9pt; }
</style>
</head>
<body>
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/hosting_users/webhacking/www/challenge/javascript/js6.html:11) in <b>/home/hosting_users/webhacking/www/challenge/javascript/js6.html</b> on line <b>29</b><br />
<meta http-equiv=refresh content=0;url=js6.html>
cs


중요한건 12번째 줄이다.

<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /home/hosting_users/webhacking/www/challenge/javascript/js6.html:11) in <b>/home/hosting_users/webhacking/www/challenge/javascript/js6.html</b> on line <b>29</b><br />


뭐라고 오류가 뜬다.


즉... 문제가 고장난듯 ㅠ;


나중에 고쳐지면 다시 풀어야겠다.

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

[Webhacking.kr] 25번  (0) 2017.09.06
[Webhacking.kr] 24번  (0) 2017.09.06
[Webhacking.kr] 18번 SQL INJECTION  (0) 2017.09.04
[Webhacking.kr] 17번  (0) 2017.09.04
[Webhacking.kr] 16번  (0) 2017.09.04

 



SQL INJECTION

RESULT


index.phps



이렇다. SQL INJECTION 문제인듯


소스를 준다니까 소스를 보자.


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
<html
<head
<title>Challenge 18</title
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; } 
input { background:silver; } 
{ color:lightgreen; 
</style
</head
<body
<br><br
<center><h1>SQL INJECTION</h1
<form method=get action=index.php
<table border=0 align=center cellpadding=10 cellspacing=0
<tr><td><input type=text name=no></td><td><input type=submit></td></tr
</table
</form
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br
<? 
if($_GET[no]) 
{ 
if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 
$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 
if($q[0]=="guest") echo ("hi guest"); 
if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 
} 
?
</a
<br><br><a href=index.phps>index.phps</a
</cener
</body
</html
cs


1을 입력하면 hi guest가 나온다.


오...ㅇ..오...; 어렵다;; 나한테는 이런 문제가 처음이라


일단 분석


no을 get형식으로 입력받아서 실행된다.


eregi를 사용하여 no을 입력받았을때 이 안에서 필터링하여 만약 no안에


공백, / , \( , \), \t , | , &, union, select, from, 0x 등이 있으면 exit함수로 종료된다.



여기서 sql문에서 id가 guest이고 no=1인 id는 guest이다.

그러므로 대충 2가 admin이라 예상하고 진행하면


id=guest and no=3 or no=2 로 넣는다하면


id가 게스트고 no가 3 이거나 no=2 인 id를 불러온다.

=> (id=guest and no=3) or no=2 으로 앞에 보이는 괄호안의 연산이 먼저 시행된다.


or을 이용하자.


근데.. eregi때문에 공백이 필터되므로 공백을 우회해야한다.


공백 우회로는 \t 이나 \n이 있는데 \t는 필터링되므로 \n을 이용하자 (공백우회(%20)로는 Tab(%09)이용 / Line Feed(%0a) 이용 / Carrage Return(%0d) 이용 / 주석(/**/) 이용 / 괄호() 이용 / AND(&&)나 OR(||) 이용 등등)


\n을 url인코딩한것은 %0a이다.


3 or no=2

=> 3%0aor%0ano=2


url : http://webhacking.kr/challenge/web/web-32/index.php?no=3%0aor%0ano=2



Congratulation!

You have cleared the 18 problems.

Score + 100


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

[Webhacking.kr] 24번  (0) 2017.09.06
[Webhacking.kr] 19번  (0) 2017.09.06
[Webhacking.kr] 17번  (0) 2017.09.04
[Webhacking.kr] 16번  (0) 2017.09.04
[Webhacking.kr] 15번  (0) 2017.09.04

[Webhacking.kr] 17번

2017. 9. 4. 23:20

또 체크 하나만 있다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<html>
<head>
<title>Challenge 17</title>
</head>
<body bgcolor=black>
<font color=red size=10></font>
<p>
<form name=login>
<input type=passwd name=pw><input type=button onclick=sub() value="check">
 
 
</form>
 
 
 
<script>
 
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+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*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+9999999999;
 
function sub(){ if(login.pw.value==unlock){ alert("Password is "+unlock/10); }else { alert("Wrong");  }}
</script>
 
cs


소스를 보자.


계산만 하면 될듯...


그냥 js로 저거 복사해서 코드 돌리면 될듯


9997809307가 답이다.


Password is 999780930.7


굿굿 인증하러가자



클리어


+ 2018-03-22 추가


chrome의 개발자도구를 이용해 간단히 계산 가능하다.


unlock 부분을 복사해 Console에서 그대로 붙여넣기를 해주면 결과값을 아래에 보여준다.


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

[Webhacking.kr] 19번  (0) 2017.09.06
[Webhacking.kr] 18번 SQL INJECTION  (0) 2017.09.04
[Webhacking.kr] 16번  (0) 2017.09.04
[Webhacking.kr] 15번  (0) 2017.09.04
[Webhacking.kr] 14번  (0) 2017.09.04

[Webhacking.kr] 16번

2017. 9. 4. 23:01

* * *



이게 문제인가?


키를 누르면 별이 막 늘어난다.


마우스를 가져다 내면 별이 막 지워진다.


소스를 보자



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 16</title>
<body bgcolor=black onload=kk(1,1) onkeypress=mv(event.keyCode)>
<font color=silver id=c></font>
<font color=yellow size=100 style=position:relative id=star>*</font>
<script
document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";
 
function mv(cd)
{
kk(star.style.posLeft-50,star.style.posTop-50);
if(cd==100) star.style.posLeft=star.style.posLeft+50;
if(cd==97) star.style.posLeft=star.style.posLeft-50;
if(cd==119) star.style.posTop=star.style.posTop-50;
if(cd==115) star.style.posTop=star.style.posTop+50;
if(cd==124location.href=String.fromCharCode(cd);
}
 
 
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>";
}
 
</script>
</body>
</html>
 
 
 
cs


mv함수가 키를 누르면 발생하고 이 키 코드값이 중요한것 같다.


Key Code Reference Table

5026070f80p90z
51361=+71g81q91Windows
5246272h82r92
5356373i83s93Right Click
5466474j84t94
55765a75k85u95
56866b76l86v960 (Num Lock)
57967c77m87w971 (Num Lock)
5868d78n88x982 (Num Lock)
59;:69e79o89y993 (Num Lock)
1004 (Num Lock)110. (Num Lock)120F9130140
1015 (Num Lock)111/ (Num Lock)121F10131141
1026 (Num Lock)112F1122F11132142
1037 (Num Lock)113F2123F12133143
1048 (Num Lock)114F3124134144Num Lock
1059 (Num Lock)115F4125135145Scroll Lock
106* (Num Lock)116F5126136146
107+ (Num Lock)117F6127137147
108118F7128138148
109- (Num Lock)119F8129139

149

키값은 대충 이렇다.


100 : 4 (Num Lock)

97 : 1 (Num Lock)

119 : F8

115 : F4

124 : |


음... |를 누르니까 답이 나왔다. 124

Password is webhacking.kr


클리어

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

[Webhacking.kr] 18번 SQL INJECTION  (0) 2017.09.04
[Webhacking.kr] 17번  (0) 2017.09.04
[Webhacking.kr] 15번  (0) 2017.09.04
[Webhacking.kr] 14번  (0) 2017.09.04
[Webhacking.kr] 6번  (0) 2017.09.03

+ Recent posts