Season 1/워게임 [Webhacking.kr] Old - 46 Write Up 작성자 - LRTK Sqli 문제가 나왔다. <?php if($_GET['lv']){ $db = dbconnect(); $_GET['lv'] = addslashes($_GET['lv']); $_GET['lv'] = str_replace(" ","",$_GET['lv']); $_GET['lv'] = str_replace("/","",$_GET['lv']); $_GET['lv'] = str_replace("*","",$_GET['lv']); $_GET['lv'] = str_replace("%","",$_GET['lv']); if(preg_match("/select|0x|limit|cash/i",$_GET['lv'])) exit(); $result = mysqli_fetch_array(mysqli_query($db,"select id,cash from chall46 where lv=$_GET[lv]")); if($result){ echo("{$result['id']} information<br><br>money : {$result['cash']}"); if($result['id'] == "admin") solve(46); } } ?> 코드를 확인해보니, 입력값에 대한 검증이 몇가지 있었다. 입력값에 대한 검증- addshlashes : ', ", \, NUL- replace : 공백, /, *, %- preg_match : select, 0x, limit, cash위 검증을 우회하여, 쿼리문의 id 결과값을 admin으로 출력해야한다. Sqli를 진행하기 전 어떤 데이터가 있는지 확인해봤다. 1~4번까지 데이터가 있었고, 그 이후에는 출력이 되지 않았다.혹시 다른 ID를 SQL 함수로 admin을 만들 수 있지 않을까 했지만, 없는 것 같다. 확인을 끝냈으니, Sqli에 사용될 쿼리를 테스트하였다. 몇가지 방법을 시도 끝에 admin을 출력할 수 있었다.하지만, 쿼리에 공백과 작음따음표가 있어서 이를 우회해야한다. 나는 공백 검증을 우회하기 위해 or 대신에 ||를 사용하기로 했다. 작은 따음표는 Webhacking.kr 문제 풀이 중에 알아낸 Hex값을 넣으면 문자열로 반환되는 것처럼 Char 함수를 이용하기로 하였다.Hex는 현재 preg_match에서 검증하고 있기 때문에 사용하지 않았다. 출력이 잘 되는 것을 볼 수 있다.이를 서버로 보냈다. Flag를 얻을 수 있었다. 공유하기 게시글 관리 MSS 'Season 1 > 워게임' 카테고리의 다른 글 [Webhacking.kr] Old - 60 Write Up (0) 2021.05.27 [Webhacking.kr] Old - 49 Write Up (0) 2021.05.27 [Webhacking.kr] Old - 11 Write Up (0) 2021.05.27 Wargame.kr - WTF_CODE (0) 2021.05.27 [Webhacking.kr] Old - 7 Write Up (0) 2021.05.26 Contents 당신이 좋아할만한 콘텐츠 [Webhacking.kr] Old - 60 Write Up 2021.05.27 [Webhacking.kr] Old - 49 Write Up 2021.05.27 [Webhacking.kr] Old - 11 Write Up 2021.05.27 Wargame.kr - WTF_CODE 2021.05.27 댓글 0 + 이전 댓글 더보기