보안 스터디/웹 해킹

[webhacking.kr] old-26 문제 풀이

성밍쟁 2024. 10. 1. 17:01
728x90
반응형

프롤로그

하루 한 문제씩 드림핵을 풀기에는 지금, 한 문제 푸는 데에 너무 오래걸린다.

할 일은 많은데, 그래서 다른 워게임들도 풀어보려고 찾았고, webhacking.kr를 찾아서 풀어보려고 한다.

1번 문제는 풀었으나, 너무 쉬웠어서 2번문제 부터 풀려고 한다.

 

 

문제 및 소스코드

처음 들어갔을 때는 그냥 검정화면에, view-source 가 보인다

view-source를 누르면

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

 

 

풀이전략

<?php   ?>사이 부분을 보면

파라미터로 admin을 입력이 되면 문제가 풀릴 것이다. 다만 그 위에, 파라미터로 admin이 입력되면 no!가 입력이 될 터이니 그것을 우회해야한다.

 

풀이과정

https://webhacking.kr/challenge/web-11/?id=admin

를 맨 처음에 입력해보자.

no!가 출력이 되었다.

admin을 우회해야하는 방법들을 찾아보았다.

 

다음 생각해본 것으로는

  if($_GET['id'] == "admin"){
    solve(26);
  }

여기 부분에서 ==를 쓴다는 것. 즉 느슨한 비교를 쓴다는 것을 확인하였다.

숫자, 배열등을 입력하여서 강제 형변환이 되어 true가 되는 방식을 한 번 시도해보았다.

https://webhacking.kr/challenge/web-11/?id=0
https://webhacking.kr/challenge/web-11/?id=[]
https://webhacking.kr/challenge/web-11/?id=null
https://webhacking.kr/challenge/web-11/?id=true

모두 

결과값이 나오지 않았다.

 

http://www.lug.or.kr/files/docs/PHP/types.comparisons.html

 

PHP 자료형 비교표

PHP 자료형 비교표 다음 테이블은 PHP 자료형 과 느슨한 비교와 엄격한 비교를 위한 비교 연산자의 동작을 설명한다. 이 부록은 자료형 조절에 관한 매뉴얼 섹션과도 관련이 있다. 다양한 유저 주

www.lug.or.kr

여길 참고하여 0, true를 해보았으나...되지 않았다.

 

그러면 이제 다른 방식을 찾아야한다.

 

다음은 url 인코딩 방식이다.

공백의 경우 %20으로 변환이 된다.

이것을 활용하여 admin을 url 인코딩 해본결과

%61%64%6D%69%6E

이렇게 나왔고, 이것을 넣어보면

https://webhacking.kr/challenge/web-11/?id=admin

이렇게 다시 admin으로 바뀌면서 no!가 나온다.

 

여기까지는 내가 생각한 방식이고 이제 다른 블로그들을 참고한 결과

%61%64%6D%69%6E

이것을 한 번 더 인코딩을 해주었어야한다.

%2561%2564%256D%2569%256E

이 값을 넣어주면

해결되었다는 알림이 뜨면서 문제가 해결되었다.

 

 

왜?

%2561%2564%256D%2569%256E 가 들어가게 되면, 

  $_GET['id'] 에는 %2561%2564%256D%2569%256E 이게 들어가게 된다.

preg_match("/admin/", $_GET['id']) 여기서 그래서 admin이 아니기에 우회

urldecode($_GET['id'])가 실행되면 한 번만 디코드 되기에 여기서 

%61%64%6D%69%6E 이렇게 변형된다.

이건 admin이 되므로, 조건에 통과하게 된다.

 

 

에필로그

php는 url 인코딩, 느슨한 비교, 타입변환 관련되 내용들 밖에 없나?

728x90
반응형