본문 바로가기
[웹해킹]/[Webhacking.kr]

[Webhacking.kr] 39번

by Hevton 2020. 11. 3.
반응형

별로 좋아보이진 않는 문제

 

<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
  $db = dbconnect();
  if($_POST['id']){
    $_POST['id'] = str_replace("\\","",$_POST['id']);
    $_POST['id'] = str_replace("'","''",$_POST['id']);
    $_POST['id'] = substr($_POST['id'],0,15);
    $result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
    if($result[0] == 1){
      solve(39);
    }
  }
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>

 

이렇길래 우회방식으로

1\\\’ or 1=1

방법을 떠올려냈다. 근데 안먹힌다. 구문상 전혀 오류는 없는데 왜 안먹히는진 모르겠음;; 걍 다른방법으로 풀라는 것 같은데

 

Mysql에서 VCHAR이 아닌 CHAR방식으로 데이터를 저장할 때 생기는 공백에 관한 취약점이 있었다.

 

CHAR형 데이터 안에 id 키값으로 admin이 있을때, admin    이라는, 공백을 추가한 문자열을 넣었을 때 where id = 'admin     ' 이 true가 된다. 이런 취약점을 이용하는 문제고, 싱글쿼터를 하나 입력하면 싱글쿼터 두개로 바뀌는 코드와 substr을 통해 15번째자리까지만 문자열을 자르는 코드를 생각하여 아래와 같은 답을 생각해낼 수 있다.

 

admin+공백9개+'

따라서 admin         '인것이다. 싱글쿼터하나가 더블쿼터로 바뀌는데에 상관없이 15자리로 잘리기 때문에 싱글쿼터 하나로만 전달되게 된다.

 

member값으로는 admin 말고도 1 2 3 4 숫자들을 넣어도 되더라. 그냥 값 여러개들이 들어가 있는 것 같다. 이 member 에 없는 값을 토대로 풀면 문제는 안풀리는게 당연. 이부분은 걍 때려맞춰야한다.

 

 

뭐 그냥 훼이크인진 모르겠는데 애초에 역슬래시를 필터 주어지는 문제였으면 나처럼 풀게끔 해야하지 않았을까.. 저 방법이 문제에서 주어진 내용들을 충분히 이용한 결과이기도 하고, 문제가 없다고 생각되는데..

1\\\’ or 1=1

-> \\ replace

1\' or 1=1

-> ' replace

1\'' or 1=1 // 여기서 \'는 기능의 목적이 아닌 '문자 자체를 의미하게됨.


실제로 내가 관리하는 mysql에

select * from sample where id='1\'' or 1=1;

하면 잘 처리된다. (sample 테이블의 모든 데이터가 출력됌)
일례로 또한, select 'single \' quote'; 하면 single ' quote 출력 잘 됨.

 

반응형

'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글

[Webhacking.kr] 41번  (0) 2020.11.10
[Webhacking.kr] 40번  (0) 2020.11.05
[Webhacking.kr] 38번  (0) 2020.11.03
[Webhacking.kr] 37번  (0) 2020.10.28
[Webhacking.kr] 36번  (0) 2020.10.28