CSRF 대응 방안

2020. 8. 8. 17:35

https://itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95

 

CSRF 공격이란? 그리고 CSRF 방어 방법

CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게

itstory.tk

https://12teamtoday.tistory.com/10

 

CSRF란?

CSRF의 기본 개념입니다. CSRF(Cross Site Request Forgery) 개념 : 권한을 도용당한 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록)를 특정 웹사이트에 요청하게 만드�

12teamtoday.tistory.com

 

CSRF(Cross Site Request Forgery)

  1. 개념 : 권한을 도용당한 인터넷 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록)를 특정 웹사이트에 요청하게 만드는 공격
  2. 방어 기법
    • Referer 검증
      • Back-end에서 request의 referer를 확인하여 Domain(saleson.com)이 일치하는지 검증.
      • 대부분의 CSRF공격 방어가 가능함. 하지만 XSS 취약점이 있는 경우 방어가 불가능해질 수 있음.
    • Security Token 사용(CSRF Token)
      • 사용자의 세션에 임의의 난수값을 저장하고 사용자의 요청마다 해당 난수값을 포함시켜 전송.
      • 이후 Back-end에서 요청을 받을 때마다 세션에 저장된 토큰값과 요청 파라미터에서 전달되는 토큰값이 같은지 검증하는 방법. 이 또한 XSS 취약점이 있는 경우 방어가 불가능해질 수 있음.
    • Double Submit Cookie 검증
      • 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키값을 확인, 수정하지 못한다는 것을 이용한 방어 기법.
      • script 단에서 요청시 난수를 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터에 저장하여 서버에 전송. 서버단에서 쿠키의 토큰 값과 파라미터의 토큰값이 일치하는지만 검사하면 됨. 서버에 토큰값을 저장할 필요가 없어 세션 검증보다 가벼움.
    • Spring Security를 이용하는 방법
      • 사실 Spring Security를 공부하다가 CSRF 개념을 접하게 되었습니다. Spring Security를 이용한 CSRF 방어 방법은 세부 예제와 함께 이어집니다.

https://codediver.tistory.com/148

 

[Spring Framework] Spring Security CSRF 적용

폼 전송시 아래를 반드시 추가할 것. 상단에 스프링 시큐리티 taglib를 추가하고 <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %> 를 이용하여도 된다. security-context.xml 에..

codediver.tistory.com

Security Token 사용 (A.K.A CSRF Token)

Referrer 검증이 불가한 환경이라면, Security Token를 활용할 수 있습니다. 우선 사용자의 세션에 임의의 난수 값을 저장하고 사용자의 요청 마다 해당 난수 값을 포함 시켜 전송시킵니다. 이후 Back-end 단에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는 지 검증하는 방법입니다. 이 방법도 결국 같은 도메인 내에 XSS 취약점이 있다면 CSRF 공격에 취약해집니다. 아래는 간략한 샘플 코드입니다.

 


Double Submit Cookie 검증은 Security Token 검증의 한 종류로 세션을 사용할 수 없는 환경에서 사용할 수 있는 방법입니다. 웹브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방어 기법입니다. 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터(혹은 헤더)에도 저장하여 서버로 전송합니다. 서버단에서는 쿠키의 토큰 값와 파라미터의 토큰 값이 일치하는 지만 검사하면 됩니다. 서버에 따로 토큰 값을 저장할 필요가 없어 위에서 살펴본 세션을 이용한 검증보다 개발 공수가 적은 편입니다. 피싱 사이트에서는 도메인이 달라 facebook.com 쿠키에 값을 저장하지 못하므로 (조금 전에 언급한 Same Origin 정책) 가능한 방어 기법입니다. 아래는 샘플 코드입니다.



 

 

 

 

 

 

블로그 이미지

wtdsoul

,

https://offbyone.tistory.com/1

 

MySQL데이터베이스에 PDO(PHP Data Object) 사용법

PDO(PHP Data Object) 는 이기종 데이터베이스에 접근하는 공통 API를 제공하는 것을 목적으로 만들어 졌습니다. mysqli 는 객체 스타일과, 절차적 스타일의 API를 제공하는데 비해 PDO 는 객체 스타일의 AP

offbyone.tistory.com

더 자세한 건 위 경로를 참고

 

 

PDO(PHP Data Object) 는 이기종 데이터베이스에 접근하는 공통 API를 제공하는 것을 목적으로 만들어 졌습니다. mysqli 는 객체 스타일과, 절차적 스타일의 API를 제공하는데 비해  PDO 는 객체 스타일의  API 만을 제공합니다. PDO 는 예전에 사용하던 mysql API  와는 달리 Prepared Statement 를 제공하므로 SQL Injection 방어에 사용될  수 있습니다.

 

Preapred Statement 는 원래 SQL 을 미리 데이터베이스에서 컴파일해 두고, 파라미터 값만 바꿔서 처리해서 쿼리의 성능을 올리는데 사용되었지만, 요즘은 SQL Injection 방어용으로 더욱 많이 예기 되어지는것 같습니다. 그만큼 요즘은 보안이 큰 이슈로 등장 하였습니다.

 

PDO를 사용하기 위해서는 PHP 5.1.0 이상의 버전을 사용해야 합니다.



데이터베이스에 연결하기 위해서 PDO 객체의 생성자에 DSN(Data Source Name), 아이디, 비밀번호를 인자로 입력합니다. DSN의 port 는 기본값 3306 이 경우 생략해도 됩니다. 데이터베이스 연결 객체를 생성한 후에 setAttribute 메소드를 사용해서 두 가지 속성을 지정하고 있습니다.

 

- PDO::ATTR_EMULATE_PREPARES: 이 속성은 Preppared Statement 를 데이터베이스가 지원 하지 않을 경우 에뮬레이션 하는 기능으로 false 를  지정해서 데이터베이스의 기능을 사용하도록 합니다.

 

- PDO::ATTR_ERRMODE : 이 속성은 PDO 객체가 에러를 처리하는 방식을 결정합니다.

 

PDO::ERRMODE_EXCEPTION 은 에러가 발행했을때 PDOException 을 throw 하도록합니다. 이 경우 try {} catch{} 를 사용하여 에러를 처리하면 됩니다. 다른 방법으로는 PDO::ERRMODE_SILENT(에러 코드만 설정), PDO::ERRMOdE_WARNING(E_WARNING 발생)이 있습니다.

 

 

- 쿼리에 값을 바꿔 넣을 곳에 ? (placeholder)를 사용합니다.
- $stmt = $db->prepare($query); : 스테이트먼트를 생성합니다.
- $stmt->execute(array($keyword, $no)); : 배열로 값을 입력합니다.
- $result = $stmt->fetchAll(PDO::FETCH_NUM); : 결과를 가져옵니다.


  PDO::FETCH_NUM : 숫자 인덱스 배열 반환
  PDO::FETCH_ASSOC : 컬럼명이 키인 연관배열 반환
  PDO::FETCH_BOTH : 위 두가지 모두
  PDO::FETCH_OBJ : 컬럼명이 프로퍼티인 인명 객체 반환
 



 

 

블로그 이미지

wtdsoul

,

https://ddungkill.tistory.com/111

 

[IOS] 모바일 진단 - 탈옥 및 무결성 검증

Step 1. 탈옥된 디바이스 준비 - 현재, Apple 사에서 Cydia Impactor 사용을 서버단에서 막아서 (Impactor를 이용한) 탈옥툴 설치가 불가능함. - Apple Developer Account로만 Impactor 사용 가능(연회비 \130000..

ddungkill.tistory.com

위 경로 참조

환경 : Clutch 2.0.4 사용

 

Step 2.  Clutch로 진단할 Application 복호화

./clutch -i // 복호화할 앱 리스트 출력

./clutch -b [num] // 복호화할 앱 선택

 

Step 3. 앱 분석 & 코드 변경 (탈옥 우회 / 무결성 검증)

- clutch로 복호화한 앱은 /var/tmp/clutch/--- 밑에 있음.

- 실행 파일을 PC로 가져와서 분석 및 코드 변경

- 탈옥 우회 시 보통 IDA로 분석 후 HxD로 조작

- 무결성 검증 시엔 실행파일 Hash 값 비교(HashCalc 등 사용)

 

Step 4. 실행파일 업로드

- 변조/조작한 실행 파일을 설치 경로에 붙여넣기

- 보통 /var/containers/Bundle/Applications/--- 하위임.

- 기존 실행파일 삭제 후 업로드

- chmod 명령어를 이용해 권한 부여 ( chmod 777 [파일 이름] )

 

Step 5. 변조된 앱 실행

- 변조된 앱을 재실행하여 탈옥 / 무결성 우회 가능 판단

 

'모바일' 카테고리의 다른 글

iOS (SSL Pinning)  (0) 2020.08.09
안드로이드 앱 리패키징을 통한 SSL-Pinning 우회법  (0) 2020.08.08
ro.debuggable 동적디버깅  (0) 2020.08.06
ADB shell /data/data 추출  (0) 2020.08.06
iOS 10.x.x 탈옥  (0) 2020.08.04
블로그 이미지

wtdsoul

,

 

https://taesun1114.tistory.com/entry/rodebuggable-%EB%B3%80%EA%B2%BD%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%8F%99%EC%A0%81-%EB%94%94%EB%B2%84%EA%B9%85

 

ro.debuggable 변경을 통한 동적 디버깅

https://securitynote.tistory.com/13 [Android] DirtyCow(더티카우) 취약점 (CVE-2016-5195) DirtyC0w(더티카우) 취약점 (CVE-2016-5195) 개요 1) DirtyC0w (더티카우) 취약점이란? : 2016년 10월 CVE-2016-5195..

taesun1114.tistory.com

예전에 mprop 을 들어본 기억이 나서 해당 경로를 참고

 

 

https://www.bodkin.ren/index.php/archives/533/

 

Android 「动态分析」打开调试开关的三种方法 - SewellDinG @ 老 锥

应用的动态调试是Android逆向的大类,而打开可调试开关则是动态调试的第一步,总结一下打开开关的三种方法; AndroidManifest.xml 最常规的方法,拿到一个应用后,直接反编译,在AndroidManifest.xml的application中添加android:debuggable="true"字段,在回编译、签名、安装、然后进行动态调试; mprop 修改系统调试的总开关字段,由于系统文件只可读,强制修改重新编译镜像再刷入设备又很复杂还不安全,这里可以注入init进程,修改内存中的ro.d

www.bodkin.ren

위 포스팅을 통해 해답을 찾았는데

 

default.prop의 값을 변경해도 메모리에 올라와있는 속성 값은 그대로 0 이기 때문에 동적 디버깅이 되지 않는다.

 

위 블로그에서 mprop라는 파일을 다운받아, 실행하면 ro.debuggable값이 1로 패치 된다.

 

Usage

./mprop ro.debuggable 1

 

어떤 원리인지 궁금해서 살펴본 결과, /proc/1/maps의 /dev/__properties__안의 값을 변경하고 있다.

 

실제 단말기에서 확인한 결과, /init 프로세스의 /dev/__properties__의 메모리 주소를 확인한 후 인자로 받은 변경하고자 하는 속성값을 검색 후 값을 변경하는 것으로 보인다.

 

해당 메모리 주소의 값을 살펴보니 인자로 넣어 준 debuggable의 값이 들어있고 정상적으로 0x31(1)로 값이 변경된 것을 확인할 수 있었다.

 

이 후, manifest.xml 파일에 android:debuggable="true"값이 없어도 정상적으로 동적 디버깅이 가능함.

 

----------------------------------

 

아래 글은 린포럼에서 긁어옴

 

위의 내용에서 mprop 깃헙에 보게되면

https://github.com/wpvsyou/mprop?files=1

두개의 폴더가 있어요.

v7a
v8a

v7a는 32bit을
v8a는 64bit을 이야기해요.

그래서 IDA로 동적 디버깅 하실분들은 위의 내용 참고하시면 좋을 것 같아요.
좀더 v7a와 v8a의 내용은 아래에 링크 남겨드릴테니 봐주세요 :)

https://developer.android.com/ndk/guides/abis?hl=ko

블로그 이미지

wtdsoul

,

https://digitalis.postype.com/post/2290617

 

ADB Shell로 어플리케이션 패키지 파일 추출하기

Mobile Forensic 스마트 폰 포렌식을 진행함에 있어서 가장 큰 문제는 데이터 추출이라 생각 된다. 스마트 폰의 경우에는 제조사, 운영체제, 정책 등이 다양하여 디지털 포렌식의 관점에서 접근할 때

digitalis.postype.com

블로그 내용 중 아래 내용을 참고

 

Extract

폴더 내부의 모든 파일들에 대해서 추출하기 위해서는 "cp" 명령어에 "r" 옵션을 주어 재귀적으로 탐색 뒤, 모든 파일과 디렉터리에 대해 복사를 시도한다.

아래의 예제에서는 "com.naver.nozzle"이라는 네이버 관련 Application의 복사를 시도 하였고, 추후 PC로 옮겨오기 용이하게 External Storage인 "/sdcard"로 복사를 하였다.

 

1. zeroltektt:/ # cp -r /data/data/com.naver.nozzle /sdcard/test_folder

 

 

복사를 하다보면 lib 폴더에 대해서 복사가 정상적으로 진행되지 않을 수 있는데, lib 폴더는 보통 Application을 실행하기 위해 필요한 공용 라이브러리를 Symbolic Link로 이어 놓은 형태이다.

Link와 연결 되어있는 라이브러리 파일들에 대해서는 권한이 미치지 않으므로 복사가 정상적으로 진행되지 않는 것은 당연하다. 또한 lib 폴더의 내용들은 조사에 영향을 주는 사용자 데이터가 포함되지 않으므로 무시하고 진행하여도 무방할 것이다.

 

 

1. C:\Users\Donghyun Kim

2. adb pull /sdcard/test_folder

 

복사를 완료했다면 adb shell을 종료하고 adb pull이라는 명령어를 이용해서 PC로 폴더들을 복사한다.

 

 

'모바일' 카테고리의 다른 글

iOS 무결성 검증 건  (0) 2020.08.07
ro.debuggable 동적디버깅  (0) 2020.08.06
iOS 10.x.x 탈옥  (0) 2020.08.04
Cydia Impactor 없이 IPA 파일 설치(Xcode 7.3 에러 우회)  (0) 2020.08.02
Android debugging Anti-cheating  (0) 2020.07.29
블로그 이미지

wtdsoul

,

iOS 10.x.x 탈옥

모바일 2020. 8. 4. 01:57

 

Altserver 에서 현재 12.2 버전 이상

윈도우 10 환경을 요구하는 상황에서 다시 3utools로 탈옥이 현재 가능하다.

 

vm ware에 mac을 설치해야 하나 고민했는데 다행이구만

 

환경 : win7

iOS version : 10.1.1 ~ 10.3.x

 

'모바일' 카테고리의 다른 글

ro.debuggable 동적디버깅  (0) 2020.08.06
ADB shell /data/data 추출  (0) 2020.08.06
Cydia Impactor 없이 IPA 파일 설치(Xcode 7.3 에러 우회)  (0) 2020.08.02
Android debugging Anti-cheating  (0) 2020.07.29
ios 환경에서 gdb 이용  (0) 2020.07.15
블로그 이미지

wtdsoul

,

아래 경로를 알게되었는데 일단 해봐야 겠다.

 

https://hackcatml.tistory.com/14

 

Cydia Impactor 없이 IPA 파일 설치(Xcode 7.3 에러 우회)

언제부터인가 다음과 같은 에러가 뜨면서 탈옥 아이폰에 시디아 임팩터를 이용한 ipa파일 설치가 불가능해졌습니다. ipa 파일 리패키징 후 설치가 안되어서 난감하였습니다. Cydia Impactor 없이도 ip

hackcatml.tistory.com

 

 

 

'모바일' 카테고리의 다른 글

ADB shell /data/data 추출  (0) 2020.08.06
iOS 10.x.x 탈옥  (0) 2020.08.04
Android debugging Anti-cheating  (0) 2020.07.29
ios 환경에서 gdb 이용  (0) 2020.07.15
IDA Remote debugging 안드로이드  (0) 2020.07.15
블로그 이미지

wtdsoul

,

아래 경로 참고

 

https://www.lazenca.net/display/TEC/Anti-cheating+Engine+for+Android

 

Anti-cheating Engine for Android - TechNote - Lazenca.0x0

Excuse the ads! We need some help to keep our site up. List Anti-cheating Engine for Android 해당 내용은 2016년에 분석하고 개발한 Anti-cheating Engine for Android에 대한 설명입니다.여기에서 설명하는 내용들은 아주 기초�

www.lazenca.net

 

 

Check debug

  • 아래와 같이 두가지 방식으로 디버깅 여부를 확인할 수 있습니다.
    • 첫번째는 해당 프로세스의 "/proc/pid/cmdline" 파일의 내용을 확인하는 것 입니다.
    • 프로그램이 GDB에 의해 실행 될 경우 PPID의 프로세스는 gdb이기 때문에 "cmdline" 파일을 이용해 gdb를 탐지 할 수 있습니다.

bool isCheckCmdline()

bool isCheckCmdline() {

   char filePath[32], fileRead[128];

   FILE* file;

 

   snprintf(filePath, 24, "/proc/%d/cmdline", getppid());

   file = fopen(filePath, "r");

 

   fgets(fileRead, 128, file);

   fclose(file);

 

   if(!strcmp(fileRead, "gdb")) {

       DbgPrint("Debugger(gdb) detected\n");

       return true;

   }

   DbgPrint("Clear(Debug)\n");

   return false;

}

    • 두번째는 해당 프로세스의 "/proc/pid/status" 파일의 내용을 확인하는 것 입니다.
    • status 파일에는 해당 프로세스의 상태, 스레드 정보, 메모리 정보, 등 많은 정보들이 저장되어 있습니다.
    • 여기에서 Debug 여부를 확인하기 위해 "TracerPid"의 값을 이용 할 수 있습니다.

      • 해당 프로세스가 다른 프로세스에 의해 추적 되고 있다면 추적하고 있는 프로세스의 PID가 저장됩니다.
      • 추적이 되고 있지 않으면 '0' 이 저장됩니다.

bool isCheckTracerPid()

bool isCheckTracerPid() {

    int TPid;

    char buf[512];

 

    const char *str = "TracerPid:";

    size_t strSize = strlen(str);

 

    FILE* file = fopen("/proc/self/status", "r");

 

    while (fgets(buf, 512, file)) {

        if (!strncmp(buf, str, strSize)) {

            sscanf(buf, "TracerPid: %d", &TPid);

            if (TPid != 0) {

                DbgPrint("Debugger detected\n");

                return true;

            }

        }

    }

    fclose(file);

    DbgPrint("Clear(Debug)\n");

    return false;

}

 

블로그 이미지

wtdsoul

,

 

 

javascript(js) response를 잡아서 변경하는 일이 생겼다.

지인 찬스가 필요하다.

 

Burp Suite 옵션 설정 시

 

intercept Server Response(추가)

Operator    Match type       Relationship       Condition

OR            File extension    Does not match  js

 

Match and Replace(체크)

Request header  ^If-None-Match.*$

Request header  ^If-Modified-Since.*$

블로그 이미지

wtdsoul

,

 

환경 : 윈10

iOS : 10.3.3

 

아래 경로 참고

 

https://blog.do9.kr/269

 

iOS에서 사용 가능한 GDB

Xcode에 있는 GDB를 변환하여 iOS에서 사용이 가능한 바이너리 파일입니다. GDB 실행 시 "Illegal Instruction: 4" 에러가 발생할 경우 해결 방법: # sed -i 's/\x00\x30\x93\xe4/\x00\x30\x93\xe5/g;s/\x00\x30..

blog.do9.kr

 

gdb 이용 시 

"Illegal Instruction: 4" 에러를 뱉는다..

# sed -i 's/\x00\x30\x93\xe4/\x00\x30\x93\xe5/g;s/\x00\x30\xd3\xe4/\x00\x30\xd3\xe5/g;' /usr/bin/gdb

# ldid -s /usr/bin/gdb


수정 시 이용 가능

 

 

블로그 이미지

wtdsoul

,