위와 같이 업로드 된 파일의 위치를 알려줍니다.

만약 파일을 선택해서 제출하게 되면 파일이 업로드된 위치를 알려주며, 파일을 읽을 수 있게 됩니다.


그러나 업로드될 때 왼쪽 꺽쇠(<) 값이 필터링되어 업로드됩니다.

또한 파일을 읽을 때 특수분자의 경우 필터링되어 출력되기 때문에 html 태그가 정상작동하지 않습니다.


때문에 웹쉘을 업로드하기가 어렵습니다. ㅠㅠ


고로 여기서는 다른 방법을 사용해보아야 합니다.



특수문자가 필터링 되어 client에 보여주는 경우에는 다음과 같은 파일에서 설정 값이 들어가게 됩니다.

.htaccess


위의 파일에서 php 파일의 경우 실행을 할지 안 할지 결정해주게 됩니다.

설정은 다음과 같습니다.


<Directory "/home/users/*/files">
    php_admin_flag Engine On
</Directory>


위의 php_admin_flag 이외에도, php_value, php_flag, php_admin_value 등이 있습니다.


무튼 위와 같이 php 파일을 실행할지 말지를 결정해줄 수 있기 때문에, 실행이 되지 않게 하면, String으로 그냥 보이지 않을까 하여 다음과 같은 옵션을 넣어 .htaccess라는 파일의 이름으로 업로드하였습니다.

php_flag engine off


이제 이 파일을 업로드 하였으니, 업로드한 디렉토리와 그 하위 디렉토리의 php 파일은 실행되지 않습니다.

그렇다면 flag.php도 실행되지 않을 것입니다.


이제 php 파일 내부의 소스를 읽어보고 풀이를 진행합시다.



'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No31(150) - old  (0) 2019.12.31
Webhacking.kr_No30(550) - old  (0) 2019.12.31
Webhacking.kr_No.29(400) - old  (0) 2019.12.31
Webhacking.kr_No13(1000) - old  (0) 2019.12.15
Webhacking.kr_No.27(150) - old  (0) 2019.10.25
Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28

시작하고 GET Method로 no 변수에 숫자 1을 넣어주면 guest라는 문자열과 view-source가 나타나게 됩니다.

일단 view source 먼저 확인해보면 다음과 같습니다.


<?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>


위의 소스를 보면 no값에 숫자가 감싸져 있는 것을 볼 수 있습니다.

그리고 뒤에는 따로 주석처리할 게 없습니다. 


이를 우회하기 위해 다음과 같이 수행해 보았습니다.


select id from chall27 where id='guest' and no=(0)||id='guest' -- )

위와 같이 되면 guest가 나와야 정상이다.


그러나 위의 필터링에서 =, limit, 0x20(스페이스), 0x 등이 필터링 되어 있는 것을 볼 수 있습니다.


따라서 = 대신에 like를 0x20(스페이스) 대신에 GET Method로 %09 혹은 %0a를 넣어주도록 합시다.


문제의 답은 GET Method로 삽입하기 때문에 다음과 같이 쿼리를 넣어줄 수 있습니다.


테스트를 위해 guest를 출력해봄 no=0)%09or%09id%09like%09%27gu%25%27%09--%09

풀이를 위해 admin이 출력되게 함 no=0)%09or%09id%09like%09%27ad%25%27%09--%09




'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No30(550) - old  (0) 2019.12.31
Webhacking.kr_No.29(400) - old  (0) 2019.12.31
Webhacking.kr_No13(1000) - old  (0) 2019.12.15
Webhacking.kr_No.28(500) - old  (0) 2019.10.25
Webhacking.kr_No.26(100) - old  (0) 2019.10.24
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28

소스코드를 보는 것이 문제의 시작이었습니다.

문제의 소스는 다음과 같습니다.

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }    
a { color:lightgreen; }
</style>
</head>
<body>
<?php
  if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
  $_GET['id'] = urldecode($_GET['id']);
  if($_GET['id'] == "admin"){
    solve(26);
  }
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>


위의 소스를 보게 되면 15번 라인의 php 부분에서 urldecode가 있는 것을 확인할 수 있습니다.

urldecode가 있는 경우 일단 urlencode를 수행한 것을 decode 하게 만들면 admin이 되지 않을까 하여 다음과 같은 방법으로 문제를 풀어보았습니다.

from urllib.parse import urlencode, quote_plus, quote

# data = bytes.hex("admin".encode())
# 'admin' --> '61646d696e'
# custom  --> %61%64%6d%69%6e

print(quote('%61%64%6d%69%6e'))


위의 소스로 나온 값은 다음과 같습니다.

%2561%2564%256d%2569%256e


이를 GET Method로 보내게 되면 풀리게 됩니다.


https://webhacking.kr/challenge/web-11/?id=%2561%2564%256d%2569%256e




'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No.29(400) - old  (0) 2019.12.31
Webhacking.kr_No13(1000) - old  (0) 2019.12.15
Webhacking.kr_No.28(500) - old  (0) 2019.10.25
Webhacking.kr_No.27(150) - old  (0) 2019.10.25
Webhacking.kr_No.25(150) - old  (0) 2016.12.08
Webhacking.kr_No.24(100) - old  (0) 2016.06.28
Webhacking.kr_No.23(200) - old  (0) 2016.06.28
Webhacking.kr_No.20(200) - old  (0) 2016.06.28

+ Recent posts