import sys
input = sys.stdin.readline
n=int(input())
dic=dict()
for i in range(n):
    name, el=map(str, input().split())
    if el=="enter":
        dic[name]=1
    else:
        del dic[name]
    
dic=sorted(dic.keys(), reverse=True)
for i in dic:
    print(i)

<코드 설명>

입력받을 출입 기록 수를 n에 입력받았고, dic에 dict()를 지정해주었다.

n만큼 입력받기 위해 for문을 이용해주었고, 이름(name)과 출입기록(el)을 입력받았다.

el이 enter이면 dic의 name을 1로 저장해주고, el이 leave이면 dic의 name을 삭제해주었다.

회사에 있는 사람의 이름을 사전 순의 역순으로 출력해야 하므로 sorted(dic.keys(), reverse=True)를 작성해주었다.

dic에 남은 값들을 하나씩 출력해주도록 하였다.

 

<실행결과>

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 20291 파일 정리  (0) 2022.09.17
[BOJ] 1302 베스트셀러  (0) 2022.09.11
[BOJ] 10815 숫자 카드  (0) 2022.09.10
[BOJ] 1235 학생 번호  (0) 2022.07.03
[BOJ] 1316 그룹 단어 체커  (0) 2022.06.26

다음은 natas17의 페이지 초기화면이다.

 

View sourcecode를 통해 코드를 확인해주었다.

<html>
<head>
<!-- This stuff in the header has nothing to do with the level -->
<link rel="stylesheet" type="text/css" href="http://natas.labs.overthewire.org/css/level.css">
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/jquery-ui.css" />
<link rel="stylesheet" href="http://natas.labs.overthewire.org/css/wechall.css" />
<script src="http://natas.labs.overthewire.org/js/jquery-1.9.1.js"></script>
<script src="http://natas.labs.overthewire.org/js/jquery-ui.js"></script>
<script src=http://natas.labs.overthewire.org/js/wechall-data.js></script><script src="http://natas.labs.overthewire.org/js/wechall.js"></script>
<script>var wechallinfo = { "level": "natas17", "pass": "<censored>" };</script></head>
<body>
<h1>natas17</h1>
<div id="content">
<?php

/*
CREATE TABLE `users` (
  `username` varchar(64) DEFAULT NULL,
  `password` varchar(64) DEFAULT NULL
);
*/

if(array_key_exists("username", $_REQUEST)) {
    $link = mysqli_connect('localhost', 'natas17', '<censored>');
    mysqli_select_db($link, 'natas17');

    $query = "SELECT * from users where username=\"".$_REQUEST["username"]."\"";
    if(array_key_exists("debug", $_GET)) {
        echo "Executing query: $query<br>";
    }

    $res = mysqli_query($link, $query);
    if($res) {
    if(mysqli_num_rows($res) > 0) {
        //echo "This user exists.<br>";
    } else {
        //echo "This user doesn't exist.<br>";
    }
    } else {
        //echo "Error in query.<br>";
    }

    mysqli_close($link);
} else {
?>

<form action="index.php" method="POST">
Username: <input name="username"><br>
<input type="submit" value="Check existence" />
</form>
<?php } ?>
<div id="viewsource"><a href="index-source.html">View sourcecode</a></div>
</div>
</body>
</html>

if문의 echo가 주석처리가 되어있다. 따라서 Blind SQL injection을 이용하기 어렵고, Time based SQL Injection을 사용해야 함을 알 수 있었다. 

 

위 정보를 이용하여 자동화 스클립트를 작성해주었다.

쿼리가 정상적으로 수행이 되었을 때 sleep 함수가 실행되도록 스크립트를 작성하였다.

|8NEDUX0g8kFgPV84uLwvZkGn6okJQ6aq

'Web Hacking > Natas' 카테고리의 다른 글

[Natas] Level 18 > Level 19  (0) 2022.09.24
[Natas] Level 17 > Level 18  (0) 2022.09.18
[Natas] Level 15 > Level 16  (0) 2022.06.25
[Natas] Level 14 > Level 15  (0) 2022.06.25
[Natas] Level 13 > Level 14  (0) 2022.06.19

<코드설명>

- 시간 초과 코드

import sys

n=int(input())
card=list(map(int, sys.stdin.readline().split()))
m=int(input())
chk=list(map(int, sys.stdin.readline().split()))

for i in chk:
    if i in card:
        print("1", end=' ')
    else:
        print("0", end=' ')

실행은 제대로 되었지만, 시간 초과라는 결과가 나왔다.

따라서 아래와 같은 코드로 바꿔주었다.

 

- 실행 코드

import sys
n=int(input())
card= set(map(int,sys.stdin.readline().split()))
m=int(input())
chk=list(map(int, sys.stdin.readline().split()))

for i in chk:
    if i in card:
        print("1", end=' ')
    else:
        print("0", end=' ')

상근이가 가지고 있는 숫자 카드 개수인 n을 입력받고, 그 카드에 적혀있는 숫자를 card에 받아주었다. 이때, set을 이용하여 시간복잡도를 줄일 수 있도록 하였다. 또, 확인할 숫자카드의 개수인 m을 입력받고 그 카드에 적혀있는 숫자를 chk에 받아주었다. 

chk에 저장된 수를 하나씩 살펴보기 위해 for문을 사용하였고, card에 그 숫자가 포함되어 있다면 1을 출력하도록 하였다. 그리고 그렇지 않은 경우, 0을 출력하도록 하였다.

 

 

<실행결과>

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1302 베스트셀러  (0) 2022.09.11
[BOJ] 7785 회사에 있는 사람  (0) 2022.09.11
[BOJ] 1235 학생 번호  (0) 2022.07.03
[BOJ] 1316 그룹 단어 체커  (0) 2022.06.26
[BOJ] 2108 통계학  (0) 2022.06.25

위 문제는 challenge 1의 페이지이다.

view-source를 눌러주어 아래와 같이 코드를 확인하였다.

<?php
  include "../../config.php";
  if($_GET['view-source'] == 1){ view_source(); }
  if(!$_COOKIE['user_lv']){
    SetCookie("user_lv","1",time()+86400*30,"/challenge/web-01/");
    echo("<meta http-equiv=refresh content=0>");
  }
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?php
  if(!is_numeric($_COOKIE['user_lv'])) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>=4) $_COOKIE['user_lv']=1;
  if($_COOKIE['user_lv']>3) solve(1);
  echo "<br>level : {$_COOKIE['user_lv']}";
?>
<br>
<a href=./?view-source=1>view-source</a>
</body>
</html>

반복적인 $_COOKIE['user_lv']이 등장하는데, 이는 cookie와 관련이 있을 것이라 생각하여 이를 확인해보기로 하였다.

이 값이 3보다 크면 문제를 풀 수 있다. 하지만 4이상이면 쿠키값이 1이 된다. 그 사이의 값을 이용해주어야 할 것 같다.

 

개발자 도구에서 쿠키값을 확인해주었다.

user_lv의 value가 1인 것을 확인하였다.

 

이 값을 3.5로 바꾸어주고 새로고침을 해주었다.

 

그리고 다음과 같이 해결했음을 알려주었다.

'Web Hacking > webhacking.kr' 카테고리의 다른 글

[webhacking.kr] Challenge 47  (0) 2022.11.06
[webhacking.kr] Challenge 27  (0) 2022.10.09
[webhacking.kr] Challenge 25  (0) 2022.10.02
[webhacking.kr] Challenge 19  (0) 2022.09.24
[webhacking.kr] Challenge 20  (0) 2022.09.18

+ Recent posts