어디서 많이 본 페이지가 나왔다.
디폴트 값을 Get 메소드로 서버에 보내니, id가 출력되었다.
코드가 주어져서 확인을 해봤다.
if($_GET['id'] && $_GET['pw']){
$db = dbconnect();
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['id'])) exit();
if(preg_match("/admin|select|limit|pw|=|<|>/i",$_GET['pw'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall45 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
echo "hi {$result['id']}";
if($result['id'] == "admin") solve(45);
}
else echo("Wrong");
}
코드를 확인해보니, 50번 문제와 유사한 코드가 있었다.
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
50번 문제에선 문자의 인코딩 방식이 utf-8로 변경된 것을 이용하여 addslashes 함수에 걸리는 문자 앞에 %a1
를 넣어줌으로써 \
에 해당하는 %5c
는 %a1
과 합쳐서 하나의 문자가 나오게 되어 우회를 할 수 있었다.
나는 해당 코드를 보고 방법이 풀이 방법이 생각이 났다.
admin을 출력해야하는데, preg_match 함수로 막혀있으니 Hex로 admin을 출력해야한다.
50번 문제처럼 서버에 해당 문제의 코드를 돌려서 테스트를 해보니, 아주 잘 먹혔다.
위 SQLi 쿼리를 삽입을 하니, 아무 반응이 없었다.
그래서 자세히 보기 위해 DataGrip에서 쿼리를 입력하여 해당 결과를 살펴봤다.
그 결과 나는 한가지 실수를 하였다는 것을 알 수 있었다. 내가 생각한 SQLi 쿼리는 SELECT id FROM chall45 WHERE id=‘?’ or True;
이라서 전체 데이터가 출력이 된다. 그래서 문제 페이지에선 제일 먼저 들어간 guest가 맨 위에 있어서 guest가 출력된 것이고, 내 서버는 admin이 먼저 생성이 되어서 admin이 출력된 것이였다.
이를 해결하기 위해선 SELECT id FROM chall45 WHERE id=‘?’ or id=0x61646D696E;
와 같이 id를 지정하면 되는데, 해당 문제에선 =
을 검증하고 있기 때문에 LIKE
로 우회하여 사용하겠다.
그 결과 Flag를 획득할 수 있었다.
'워게임 > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] Old - 9 Write Up (0) | 2021.06.14 |
---|---|
[Webhacking.kr] Old - 57 Write Up (0) | 2021.06.12 |
[Webhacking.kr] Old - 44 Write Up (0) | 2021.06.09 |
[Webhacking.kr] Old - 40 Write Up (0) | 2021.06.08 |
[Webhacking.kr] Old - 28 Write Up (0) | 2021.06.07 |