아무 반응이 없어서 코드를 확인하였다.

 

$db = dbconnect();
include "./tablename.php";
if($_GET['answer'] == $hidden_table) solve(53);
if(preg_match("/select|by/i",$_GET['val'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select a from $hidden_table where a={$_GET['val']}"));
echo($result[0]);

이번 문제는 테이블명을 answer에 넣어서 서버로 보내면, flag를 획득할 수 있는 문제이다.

테이블명을 얻기 위해서는 select a from $hidden_table where a={$_GET['val']}에 SQLI를 통하여 테이블명을 얻어야 한다.

 

if(preg_match("/select|by/i",$_GET['val'])) exit("no hack");

select, by를 검증하고 있는데, 문제는 select를 사용할 수 없어서 Union을 이용하여 SQLI를 진행할 수 가 없다.

6.SQL Injection>테이블 명, 컬럼 명 알아내기
Union을 이용한 테이블 명을 알아내는 방법

웹해킹 SQLI 우회기법 정리 - Webhacking SQL Injection Bypass Honey Tips :: Is Secure?
인터넷에 검색을 해봤지만, 도통 union을 사용한 방법 밖에 없어서 다른 사람의 문제풀이를 참고하였다.

나는 위 블로그에서 procedure analyse 함수를 이용한 SQLi를 배울 수 있었다.

 

하지만 도커에 있는 Mysql에 시도를 하니, 작동이 되지 않았다. 인터넷에 procedure analyse를 검색하니, 사용할 수 있는 버전의 제한이 있었다.

 

MySQL :: MySQL 5.7 Reference Manual :: 8.4.2.4 Using PROCEDURE ANALYSE
PROCEDURE ANALYSE ()는 MySQL 5.7.18에서 더 이상 사용되지 않으며 MySQL 8.0에서 제거되었습니다.

내가 사용하고 있는 Mysql의 버전은 8.0.23이라서 에러가 발생한 것이였다.

igloosec 보안이슈 :: MySQL DoS 취약점(CVE-2015-4870)분석
나는 여기서 사용 가능한 버전의 범위가 궁금하여 검색을 해보니, 이글루 시큐리티에서 조사한 내용 중 MySQL 3.23.X 이상 버전에서 사용 가능한 기능이라고 명시되어있어서 3.23.X ~ 5.7.18까지의 버전에서 사용 가능하다는 것을 알 수 있었다.

 

 

위와 같이 val 파라미터에 procedure analyse 함수를 삽입하여 보내니, 테이블 명이 출력되었다.

 

해당 테이블 명을 answer 파라미터에 담아서 보내니, Flag를 획득할 수 있었다.

'워게임 > webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] Old - 34 Write Up  (0) 2021.05.31
[Webhacking.kr] Old - 29 Write Up  (0) 2021.05.31
[Webhakcing.kr] Old - 48 Write Up  (0) 2021.05.29
[Webhacking.kr] Old - 35 Write Up  (0) 2021.05.29
[Webhacking.kr] Old - 8 Write Up  (0) 2021.05.28
복사했습니다!