[LOS] step.1 GREMLIN 풀이
본문 바로가기

WEB/Lord of SQLinjection

[LOS] step.1 GREMLIN 풀이

가장 쉬운 문제이다.


  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

코드를 하나씩 해석하면 여긴 정규식으로 필터링을 하는 부분이다.

잘은 이해가 되질 않으나 _ .\ 같은 거를 우회하는 듯. 테스트해보자.

id 파라미터 입력값에 _를 넣으면 필터링 걸린다.

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));

이 부분이 이제 실제 풀어야 하는 쿼리문인데 일단 단순하게 id와 pw를 받아오고 처리한다. 

그 다음 result는 아마 위에 있는 쿼리문을 실제 실행하는 코드

if($result['id']) solve("gremlin");

이부분이 핵심이다. id값이 뭐라도 들어오면 solve됨.

즉, id만 들어오면 된다, pw값 필요없다. pw를 무력화해라 라는 뜻.

 

 

정석대로 가보자. 

id = ' or 1=1# 

쿼리문 : select id from prob_gremlin where id=' ' or 1=1#' and pw=''

이렇게 넣었더니 위와 같은 결과가 나왔다. 원래는 #이 잘 입력되어야 하는데 #이 인식되지 않고 있다. 

#은 url에서 예약문자로 사용하기 때문에 내가 입력한 그냥 # 그 자체 문자로 들어가는 게 아니라 예약문자로서 다른 의미로 작용함!! 

그래서 우리는 그냥 just '#' 이라는 텍스트로 넣어줘야 하기 때문에, url 작성할 때 #을 인코딩한 값으로 넣어줘야 한다.

# : %23

payload는 다음과 같다.

?id=' or 1=1%23 

 

solve!!!!

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step.6 darkelf 풀이  (0) 2023.06.12
[LOS] step.5 wolfman풀이  (0) 2023.06.12
[LOS] step.3 goblin 풀이  (0) 2023.06.12
[LOS] step.4 orc 풀이  (0) 2023.06.12
[LOS] step.2 cobolt 풀이  (0) 2023.05.24