이번 문제는 admim계정으로 로그인하는 문제이다.
1번째 방법
1. 알고 있는 계정으로 로그인
GET으로 전달하고
해당 값으로 응답한다는 것을 알 수 있다.
2. Intercept나 Repeater을 활용하여 userId를 admin으로 변경 시
응답 값이 fail로 되는 걸 알 수 있다.
이를 'ok' 로 바꿔 보려고 한다.
3. Intercept에서 Intercept is on을 선택 -> 알고 있는 계정으로 로그인 -> UserId를 admin으로 수정
4. 오른쪽 마우스 클릭 -> Do intercept -> Response to this request 선택 후 -> Forward 선택
5. Response result 값을 'ok'로 변경 -> Forward -> Intercept is off
6. HTTP history에서 Response 확인
2번째 방법
위의 1 ~ 4번 까지 똑같이 따라한 후
5. 위의 5번에서 Intercept is on 인 상태로 실행
6. 오른쪽 마우스 클릭 -> Do intercept -> Response to this request 선택 후 -> Forward 선택
7. Response에 해당 script 삭제 -> Intercept is off
8. HTTP history에 index.php 선택 -> 하단 Original respinse를 Edited response로 변경 후 확인
- 7번에서 Forward -> Forward ->Intercept is off 해도 가능
3번째 방법
1. 구글 개발자 도구 -> sources -> login.js에서 if 구문 주석처리 후 주석 상단에 location.href = "index.php"; 입력 후 ID: admin PW: 1234로 Sing in
2. Burp suite HTTP history에서 index.php 확인
4번째 방법
1. 구글 개발자 도구 -> sources -> login.js에서 resultData == "ok"를 fail로 변경후 ID: admin PW: 1234로 Sing in
2. Burp suite HTTP history 에서 index.php 확인
5번째 방법
1. 구글 개발자 도구 -> sources -> login.js에서 else 구문에 location.href = "index.php"; 작성 후 ID: admin PW: 1234로 Sing in
2. Burp suite HTTP history 에서 index.php 확인
후기
- 이번 문제는 SQL 인젝션을 시도해본 결과 통하지 않았다. 그래서 찾아보던 중 javascript가 보이는 걸 확인하고 javascript 를 활용하는 방법 위주로 찾아보았다.
- javascript코드를 활용해본 결과 url 변수에 비밀번호를 지웠을 때 result 값이 fail이 나는 것으로 미뤄보아 사용자가 입력한 ID, PW 값을 받아 백단에서 처리해 주는 것 같았다. 해당 javascript코드로 봤을 때
<?php
header('Content-Type: application/json');
// 데이터베이스 연결 설정
$host = 'localhost';
$db = 'database_name';
$username = 'username';
$password = 'password';
// 연결 생성
$conn = new mysqli($host, $username, $password, $db);
// 연결 확인
if ($conn->connect_error) {
die(json_encode(['result' => 'error', 'message' => 'Database connection failed']));
}
// 사용자 입력받기
$userId = isset($_GET['userId']) ? $_GET['userId'] : '';
$userPw = isset($_GET['userPw']) ? $_GET['userPw'] : '';
// SQL 쿼리 준비
$stmt = $conn->prepare("SELECT password FROM users WHERE userid = ?");
$stmt->bind_param("s", $userId);
$stmt->execute();
$stmt->store_result();
// 사용자 존재 여부 확인
if ($stmt->num_rows > 0) {
$stmt->bind_result($hashedPassword);
$stmt->fetch();
// 비밀번호 확인
if (password_verify($userPw, $hashedPassword)) {
// 로그인 성공
echo json_encode(['result' => 'ok']);
} else {
// 비밀번호 불일치
echo json_encode(['result' => 'fail']);
}
} else {
// 사용자 없음
echo json_encode(['result' => 'fail']);
}
$stmt->close();
$conn->close();
?>
이런 로직으로 PHP코드가 구현되지 않았을까 예상해 보았다.
확인해보니 여기에 추가로 세션을 먼저 생성하고 코드를 작성해논 상태였다.
- 해당 방법 뿐만 아니라 더 다양한 방법이 있는지 생각해 봐야겠다.
'모의해킹 > 모의해킹 스터디' 카테고리의 다른 글
모의해킹 스터디 6주차 정리 (0) | 2024.11.21 |
---|---|
모의해킹 스터디 CTF 문제 - Pin Code Crack (1) | 2024.11.20 |
모의해킹 스터디 CTF 문제 - PIN CODE Bypass (0) | 2024.11.18 |
모의해킹 스터디 CTF 문제 - Get Admin (0) | 2024.11.18 |
모의해킹 스터디 5주차 정리 (0) | 2024.11.15 |