다섯번째 문제인 울프맨이다.
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~");
$query = "select id from prob_wolfman where id='guest' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("wolfman");
highlight_file(__FILE__);
?>
이번에는 특이하게 화이트스페이스, 즉 공백을 필터링하고 있다. 딱히 따옴표를 필터링하는 부분이 없기 때문에 쿼리를 보면 작은 따옴표를 닫아주고 이전과 같은 union select 기법을 활용하여 'admin'이란 값을 추가해주면 풀 수 있을 것이다. 하지만 union과 select를 구분하는 공백이 필터링되기 때문에 그냥은 사용할 수가 없는데 어떻게 할 수 있을까?
모를때는 역시 끙끙대지말고 검색을 하는게 좋다는 것을 최근들어 느끼고 있다. 구글에 간단히 "mysql whitespace bypass"만 검색해도 여러 방법이 나오는데 그중 제일 신뢰도가 높은 Portswigger의 문서를 참고하면 다음과 같이 우회할 수 있는 것을 알 수 있다.
SQL Injection: Bypassing Common Filters
SQL Injection: Bypassing Common Filters In some situations, an application that is vulnerable to SQL injection (SQLi) may implement various input filters ...
portswigger.net
즉 공백 대신에 /**/처럼 주석으로 감싸줘도 이는 공백으로 처리되어 쿼리에 적용된다는 것이다. 그래서 union과 select 전후에 공백 대신에 /**/를 넣어주면 간단히 풀리는 것을 볼 수 있다.
관련해서 sqli 관련 우회 기법들이 많이 적혀있는 블로그 포스트를 발견했다. 앞으로 이 곳을 참고할 일이 많을 것 같다.
웹해킹 SQLI 우회기법 정리 - Webhacking SQL Injection Bypass Honey Tips
지금까지 웹해킹 워게임을 풀면서 깨달은(?) 우회기법을 정리하려 합니다. 모두 수기로 기억나는대로 작성하다보니 빠진 부분도 있을 것 같습니다. 기억나는대로 추가해서 수정하겠습니다. - o
ar9ang3.tistory.com
'챌린지 > los.rubiya.kr' 카테고리의 다른 글
Lord of SQLInjection - orge (0) | 2020.12.27 |
---|---|
Lord of SQLInjection - darkelf (0) | 2020.12.27 |
Lord of SQLInjection - orc (0) | 2020.12.19 |
Lord of SQLInjection - goblin (0) | 2020.12.17 |
Lord of SQLInjection - cobolt (0) | 2020.12.16 |