워게임/webhacking.kr

webhacking.kr 7번문제

크.... 해킹캠프 다녀온후, 시스템만 공부하다가 웹하고 블로그 포스팅을 안하고 있었다는것을 알았다.

 

따라서, 오늘은 블로그 관리좀할겸 webhacking.kr 7번문제 포스팅을 시작하겠당

 

우선, 문제를 들어가보면,

 

이런식으로, Admin페이지에 접속하였으며, url 파라미터로 val이라는 변수가 존재함을 알았고, val은 1을 인자로 받고 있다는것도 알 수 있다.

 

....?

 

auth버튼을 누르면,

 

 

이런식으로 Access Denied가 뜨는것을 확인할 수 있다. 대충 admin인 val값을 입력해야 되는것 같다.

 

할게 없어서, html소스를 보던중,

 

 

이런식으로, 힌트는 index.phps를 들어가는것과, Admin Mode는 val값을 2로해야된다는 것이다.

 

그래서 val의 인자를 2로해주고 쿼리를 날려보았다.

 

 

 

이런식으로 아주 정성스럽게 (?) Access Denied를 출력해준다. 하하하하하하하하ㅏ하ㅏ하하ㅏ하하하하하핳

 

마음잡고 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
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
91
<html>
<head>
<title>Challenge 7</title>
</head>
<body>
<!--
db에는 val=2가 존재하지 않습니다.
union을 이용하세요
-->
<?
$answer = "????";
 
$go=$_GET[val];
 
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
 
$ck=$go;
 
$ck=str_replace("*","",$ck);
$ck=str_replace("/","",$ck);
 
 
echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
 
 
if(eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");
 
if(eregi(' ',$ck)) { echo('cannot use space'); exit(); }
 
$rand=rand(1,5);
 
if($rand==1)
{
$result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
}
 
if($rand==2)
{
$result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
}
 
if($rand==3)
{
$result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
}
 
if($rand==4)
{
$result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
}
 
if($rand==5)
{
$result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
}
 
$data=mysql_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]!=1 && $data[0]!=2) { exit(); }
 
 
if($data[0]==1)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Access_Denied!')><p>");
echo("<!-- admin mode : val=2 -->");
}
 
if($data[0]==2)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Congratulation')><p>");
@solve();
 
 
 
 
?>
 
<!--
index.phps
-->
 
 
 
</body>
</html>
cs

 

띠요오오오오오오오옹

 

허허허 db에는 val=2가 존재하지 않으니 UNION을 이용하라는것이 이번문제 힌트네요...

 

음... Union 이란것은 간단히 말해 둘 이상의 쿼리를 하나의 결과로 출력해 사용하는 명령어인데요,

 

이번포스팅에서는 이부분에 대해 다루지 않겠습니다.

 

대신, 유용한 블로그 링크 남겨두겠습니다. http://blog.bsmind.co.kr/377

 

이제, 다시 본론으로 돌아와서 코드해석을 한줄한줄 해보면, Val이라는 변수를 get으로 받고, 그 값을 go라는 변수에 집어넣고 있다.

 

 

 

이때, 변수 go는 꼭 값(데이터)가 존재해야 하며, 만약 go안에 값이 없다면, 다시 index.php로 넘어가게된다.

 

이때, go에 값이 있다면, ck라는 변수에다가 go 변수의 값을 집어넣는데,

 

다시 ck값의 * 와 / 기호를 str_replace 함수를 이용하여 없애고있다.

 

 

이때, eregi함수를 통해 (왜 preg_match가 아닌지 모르겟다.) 각종 키워드를 ck변수로부터 차단하며, (허허 2는 왜 막았니 ㅠㅠㅠㅠ)

 

혹시라도 공백(스페이스)이 있을 경우도 차단한다.

 

하지만, 다행히도, UNION은 차단하지 않고, (다행이다.... 힌트가 살아있다....) 스페이스바는 url 인코딩에 의하여 %0A로 우회 할 수 있다

 

문제는 여기서부터이다... (하하ㅏ하하하하하ㅏ하하하하하핳핳하하핳하하하하하하하하하핳)

 

우선, 변수 rand라는 값은 1, 2, 3, 4, 5 숫자들중 아무거나 랜덤값으로 들어가고 있다.

 

또한, 밑에 코드에서, 이 rand값이 괄호의 개수라고 할 수 있다.

 

따라서 우리는 rand값이 n (이때 n은 1이상, 5이하의 자연수) 일때의 상황과, 운에 맞겨서 똑같은 쿼리를,

 

문제가 풀릴때까지 여러번 날려줘야 한다.  (코딩해도 되겠네)

 

우선, rand값이 1일때까 괄호가 들필요하니 1일때를 기준으로 하자.

 

또한, union전의 쿼리는 거짓이 나와야 하므로,

 

?val=-1) union select (2 라고 쿼리를 날려보았다.

 

 

당연히 차단되는게 맞다. ?val=1) union select (2 라는 쿼리는, 공백이 있을 뿐더러, 2라는 문자까지 필터링하고 있어서, 차단되고있다.

 

이제 필터링을 우회해줘야 한다. 우선, 스페이스바가 %20으로 들어가지는데, 이를 라인피드 %0A로 대체해주고, 위에서 필터링에서

 

+와 *도 거르고 있으니, 뺄셈으로 2를 만들어주면 된다. 2를 3-1로 대체할 수 있다.

 

?val=-1)%0Aunion%0Aselect%0A(3-1

 

이는 rand 변수가 1일때를 기준으로 하는것이므로 이 쿼리가 먹힐 확률은 20%이다. 따라서 우리는 이것을 계속 날려야 한다.

 

 

Nice Try를 출력하는것으로 보아, 이런식으로 하는게 맞는것 같다. 이제 계속 날려보자~

 

 

띠요오오오오오오오옹~ 16년도 10월달에 이미 풀었네요 ㅎㅎ

 

쨌든, 이런식으로 문제를 해결하였습니다.

 

 

 

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 6번  (0) 2017.01.17
webhacking.kr 5번  (2) 2016.03.04
webhacking.kr 2번 (blind sql injection)  (0) 2016.02.28
webhacking.kr 4번  (0) 2016.02.04
webhacking.kr 3번  (0) 2016.02.01