LOS : https://los.rubiya.kr/
✔️ 문제
문제는 다음과 같다.
preg_match 부분은 다른 데이터베이스를 건드리지 못하게 작성한 부분이고,
$query 부분을 주요하게 보면 될 것 같다 ❗
✔️ 풀이
우선 풀이를 하는 부분의 코드를 확인해보자!
if($result['id']) solve("gremlin");
다음과 같이 result 배열에 id에 해당하는 값이 존재만 하면,
이미 지정되어있는 solve 함수에 gremlin을 입력하면서 풀리는 것으로 보인다.
바로 위에 result 변수가 선언되어 있는데,
mysqli_fetch_array 함수에서 불러와야하는 것이다.
https://www.php.net/manual/en/mysqli-result.fetch-array.php
PHP: mysqli_result::fetch_array - Manual
query($query);/* numeric array */$row = $result->fetch_array(MYSQLI_NUM);printf("%s (%s)\n", $row[0], $row[1]);/* associative array */$row = $result->fetch_array(MYSQLI_ASSOC);printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);/* assoc
www.php.net
위에 나오는 사이트를 참고하면 기능을 확인할 수 있는데,
작성한 쿼리문과 연결한 데이터베이스에서 결과를 배열로 불러오게 되고
이때, id에 해당하면 풀리게 될 것이다.
GET 방식으로 id와 pw를 입력받고 있기 때문에,
gremlin 문제 링크에서 맨 마지막 .php 뒷 부분에 파라미터를 작성해주면 된다.
다음은 ?id=123&pw=asdf 로 작성해준 결과이다.
and 연산자로 쿼리문을 실행시키고 있는데,
id가 어떠한 것이 오든 pw가 참이되면 문제가 풀릴 것으로 보인다.
가장 많이 사용되는 sql injection 구문인 ' or 1=1 --(공백) 으로 시도해보자.
바로 풀리는 것을 확인할 수 있다!
❗ 이때 주의할 것은 마지막 --(공백)에서 공백이 들어가지 않기 때문에
URL Encoding을 통해서 --%20을 파라미터에 전달해주도록 하였다.
pw가 참이기만 하면 되기 때문에
다음과 같은 구문으로도 공격이 가능하다.
여기서 나오는 #도 --(공백)과 같이 주석으로 동작하는 것을 참고하고,
#은 URL Encoding을 통해 %23의 값을 전달해주어야 한다.
화이팅 💪
'보안 > LOS' 카테고리의 다른 글
[LOS] darkelf (0) | 2022.12.20 |
---|---|
[LOS] wolfman (0) | 2022.12.20 |
[LOS] orc (0) | 2022.12.19 |
[LOS] goblin (0) | 2022.12.19 |
[LOS] cobolt (0) | 2022.12.19 |