[WARGAME][webhacking.kr] old-26

jckim22·2022년 11월 19일
0

[WEBHACKING] STUDY (WARGAME)

목록 보기
84/114

아래는 서버 코드이다.

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

코드를 해석하면 get파라미터로 id에 받는 value에 admin이 있는지 확인한다.
있으면 exit한다.
그 후 urldecode로 id를 디코딩 해서 다시 get[id]에 넣어주고 그게 admin이라면 solve해준다.
그냥 admin에 걸리지 않게 admin을 인코딩해서 파라미터로 넣어주면 문제가 풀릴 것 같다.

아래를 보자.
먼저 ad%09min사이에 공백을 넣어보자 %09로 넣어보겠다.


안된다.

이번에는 NULL바이트르 넣어줬다.


안된다.

코드상에서 한번 더 urldecode를 하는 것 같아서 혹시 두번 디코드가 되나 했다.
그래서 두번 인코딩을 해봐도 성공하지 못했다.

세번째로는 +가 인코딩이 되면 공백이 되었던 것 같아서 해보았지만 역시 안되었다.

그러던 중 내가 또 바보같은 짓을 했다는 것을 알았다.
php상에서 공백도 문자인데 자꾸 공백을 만들려고 했다.
그냥 문자를 인코딩하면 되는 것인데 말이다.

url 인코딩은 특수문자나 한글같은 ascii를 벗어나는 언어만 된다는 생각에 시도 조차하지 않았다.

url인코딩은 ascii상에서 16진수를 기준으로 되기 때문에 문자도 그에 맞는 16진수로 변환해주면 되는 것이었다.
아래처럼 말이다.

대신 아까 했던 것처럼 코드 상에서 또 url을 인코딩을 해주는 것을 알기에 admin을 뜻하는 %61%64%6d%69%6e를 한번 더 인코딩 해주겠다.

그럼 이제 파라미터로 %2561%2564%256d%2569%256e를 넣어주겠다.

get되면서 한번 url인코딩 코드 상에서 또 url 인코딩이 되었기 때문에 정규표현식도 우회하면서 성공적으로 admin이 if문에 들어갈 수 있었다.

profile
개발/보안

0개의 댓글