촬리의늘솔길

약한문자열강도 중간점검 본문

✍~2022/web보안

약한문자열강도 중간점검

리촬리 2021. 8. 4. 15:32

import requests
import unittest
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome('C:/Users/dlgot/Downloads/chromedriver_win32/chromedriver.exe')
driver.implicitly_wait(3)

    
#1.메인함수
def main():
    url = input("로그인 페이지 url 입력하세요:")
    save_txt(url)
    gethtml(url)

#1.1 url저장함수
def save_txt(url):
    f=open("url.txt","w")
    f.write(url)
    f.close()
    return 0

#2 크롤링함수
def gethtml(url):
    
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print(soup)
    tag = soup.find_all('input',limit =2)
    
    id = tag[0]['name']  
    pw = tag[1]['name'] 
    print("id의 input태그 : ",id)
    print("pw의 input태그 : ",pw)
    
    list_id = set_id()
    list_pw = set_pw()
    getLogin(id,pw,list_id,list_pw,url)
    
    
#2.1.1아이디 리스트함수    
def set_id():
    f = open("id.txt","r")
    user_id = f. readline()
    list_id = []
    id_count = 0
    
    while user_id : 
        
        user_id=f.readline()
        list_id.append(user_id)
        print('%s' %(user_id))
        id_count+= 1
    
    f.close()
    print("id갯수:", id_count)
    return list_id

#2.1.2 비밀번호 리스트함수
def set_pw():
    f = open("pw.txt","r")
    user_pw = f. readline()
    list_pw = []
    pw_count = 0
    
    while user_pw : 
        user_pw=f.readline()
        list_pw.append(user_pw)
        print('%s' %(user_pw))
        pw_count+= 1
    f.close()
    print("pw갯수: ",pw_count)
   
    return list_pw
    
    
#3.로그인과 로그인 확인함수 
def getLogin(id, pw,list_id,list_pw,url):
    count = 0
    response = []
    for i in list_id:
        driver.find_element_by_name(id).send_keys(i)
#         if count >=5:
#             break
            #id는 input 의 type -> text필드
            #pw는 input type -> password필드
            #다른 페이지에 시도했을때 될만하게 태그찾기를 수정하기
        for j in list_pw:
            driver.find_element_by_name(pw).send_keys(j)
            driver.find_element_by_name('Login').click()
            html = driver.page_source
            res_num = len(html)
            response.append(res_num)
            wait = WebDriverWait(driver,2)
            try:
                page_loaded = wait.until_not(
                    lambda driver: driver.current_url == url)
                print("로그인성공")
                loginsuccess = "true"
            except TimeoutException:
                loginsuccess = "false"
                print("로그인 실패")
            
            count +=1
    
        
    final1 = check_secure1(response)
    final2 = check_secure2(loginsuccess)
    print_secure(final1,final2)


#문제점: 아이디 하나당 비밀번호 하나가 맞게 입력되고 그게 반복이 되어야하는데, 

아이디 하나당 비밀번호 n개가 입력되는바람에

1번째아이디 -1번째비번 입력은 괜찮은데,

1번째아이디 -2번째비번은 아이디가 공란으로 입력되어 당연히 로그인이 실패한다.

파이썬 반복문을 어떻게 바꿔야할것같은데 ..

# 같은 id로 5번 넘게 request를 날렸을때(틀린 pw로) 잠김이 되지 않으면 취약            
# 첫 번째 요청 보냈을 때의 response와 6번째 보냈을 때의 response의 
# 길이를 비교해서 같으면 취약한걸로 다르면 확인필요로 하고 화면 띄워줘서 확인하도록      

#4.1.1 조건1 점검함수
def check_secure1(response):
    final1 = 0
    
    if (response[0]==response[5]):
        print("1번째 점검결과: 취약")
        final1 += 1
            
    else :
        print("1번째 점검결과: 확인 필요")
        #driver로 화면띄워주기
            
    return final1
    

#로그인이 성공되는지 여부 확인 ( 위 조합들로 로그인 성공시 취약 )
#4.1.2 조건 2 점검함수
def check_secure2(loginsuccess):
           
    final2 =0 
    if loginsuccess == "true":
        print("2번째 점검결과: 취약")
        final2 +=1
    else:
        print("2번째 점검결과: 양호 '['로그인실패']''")
        final2 = 0
        
    return final2


#위 두가지 하나라도 취약하면 취약   
#4.최종점검함수
def print_secure(final1,final2):
    
    if final1 == final2 ==1 :
        print("최종 점검결과:취약")
    elif final1 == 1 :
        print("최종 점검결과:취약")
    elif final2 ==1 :
        print("최종 점검결과:취약")
    elif final1==final2==0:
        print("최종 점검결과:양호")
        
    
if __name__ == "__main__":
    main()

 

 

728x90