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()
'✍2021,2022 > web보안' 카테고리의 다른 글
경로추적 결과 스크린샷 - [selenium 스크린샷] (0) | 2021.08.12 |
---|---|
약한문자열 강도 중간점검(2) - 문제점 해결 (0) | 2021.08.06 |
python 새롭게 알게된것(1) (0) | 2021.08.04 |
중간 점검 (0) | 2021.07.22 |
약한문자열, 정보누출 (0) | 2021.07.07 |