개인 공부/WEB
[웹해킹] LOS 3 - (Goblin)
아메리카노와떡볶이
2021. 5. 29. 21:45
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