728x90
Lord of sql injection - goblin 풀이 |
los의 세번째 문제 풀이입니다. 세번째 문제부터는 조금 주목해야할 점이 있습니다.
preg_match에서 추가적으로 필터링 되는 문자가 ' 와 " 가 추가되었기때문에 이전 1,2번에서 사용하던 풀이가 막히게 된 것입니다.
문제 접근
먼저 문제상황을 살펴보면
1. id= 'guest'로 지정되어있기때문에, no 조건에 대해 쿼리문을 적절히 삽입해서 admin을 얻어와야한다.
2. no에 대한 조건을 false로 주고, id= admin 에 대한 조건을 참으로 만들어서 admin을 select한다.
3. 'admin' id를 얻어와서 solve() 를 동작시킨다
+ 필터링 문자가 추가되었기때문에 이것을 우회할 수 있는 방안이 필요하다.
<?php include "./config.php"; login_chk(); $db = dbconnect(); if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 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("goblin"); highlight_file(__FILE__); ?> |
풀이
필터링으로 인해 싱글쿼터 ' 를 사용하지 못하게 되었습니다. 이것을 우회할 수 있는 방법은 char()를 이용하는것 입니다.
admin을 아스키코드로 인코딩하면 97 100 109 105 110으로 나타낼 수 있습니다.
따라서 'admin' ==> char(97,100,109,105,110)으로 표현될 수 있습니다. 우회하는 방법을 찾았으므로 매우 문제가 간단해집니다.
문제상황에서 파악했듯이, 앞의 조건부를 무력화 시키고 id=admin 을 true로 주면 admin 계정이 select됩니다.
이때 주의해야할점은 guest 계정의 no가 1이기때문에 no 값으로 1이 아닌 다른 숫자를 줘야합니다.
결과
728x90
'개인 공부 > WEB' 카테고리의 다른 글
[웹해킹] LOS 6 - (Darkelf) (0) | 2021.05.30 |
---|---|
[웹해킹] LOS 4 - (Orc) (0) | 2021.05.30 |
[웹해킹] LOS 2 - (Cobolt) (0) | 2021.05.29 |
[웹해킹] LOS 1 - (Gremlin) (0) | 2021.05.29 |
[웹해킹] 1주차 리뷰 (0) | 2021.05.10 |
댓글