web_security/Lord Of SQL

[LOS : Lord Of SQL Injection] 21번 Iron_golem 문제 풀이

HawordFREAKEK 2022. 6. 22. 01:47

네 안녕하세요. Godhaword 입니다.

이게 이 문제로 알 수 있는 것 이랑 Key Point는 고심해서 풀고, 풀고 난 뒤에 복습의 개념으로 보시라고 뒤에 넣어놨는데 더 생각하실 분은 일단 두 문항을 보고 힌트를 얻으셔서 푸는 것도 좋아보이더라구요.

문제로 넘어가겠습니다.

<?php
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");
  $query = "select id from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(mysqli_error($db)) exit(mysqli_error($db));
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  
  $_GET[pw] = addslashes($_GET[pw]);
  $query = "select pw from prob_iron_golem where id='admin' and pw='{$_GET[pw]}'";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("iron_golem");
  highlight_file(__FILE__);
?>

간단한 blind sql injection 문제 같아 보입니다. 참 값을 입력하던 거짓 값을 입력하던 이번엔 Hello guest, Hello admin 값을 출력해주지 않아 저희가 평소에 하던 참 거짓 분기점으로 문제를 푸는 것은 좀 힘들어 보입니다.

 

하지만 if 문을 써서 union select 값을 넘기면 참 거짓값의 차이를 볼 수 있는데요

조건 문이 참이면 그냥 1 값을 보내주고, 거짓이면 select 1 union select 2 값을 보여주는 쿼리로 짰습니다.
서브쿼리가 보여주는 값이 2개 이상이 될 경우 위와 같은 에러문을 뿜어냅니다.

 

저는 추가적으로 거짓일 때 나오는 문구를 not in 비교 연산자를 이용하여

위와 같이 pw의 길이를 구하였습니다.

길이를 구하였다면?

substr 함수로 해당 pw의 값도 구해주시고(저때 졸려가지고 pw 길이 하나 더 쳤었네요)

나온 값을 소문자로 바꾸어줍니다.

그리고 바꿔준 값을 pw에 입력하면 문제가 solve 되는 것을 보실 수 있습니다.

추가적으로 전 sql 에선 if 문보다 case when 함수를 좋아하는데요
위 함수를 사용해서는

이렇게 코드를 짜서 길이가 32자인 것을 확인 할 수 있습니다.

https://godhaword.tistory.com/472
https://godhaword.tistory.com/473

 

[WebHacking] SQLI(SQL Injection) 필터링 우회 및 기법 총 정리

네 안녕하세요. Godhaword 입니다. 저번에 SQLI 관련 글을 쓰면서 큰 기초 뼈대 위주로 설명을 드렸습니다. https://godhaword.tistory.com/472 [WebHacking] SQLI(SQL Injection) 이란?(New) 네 안녕하세요. Godh..

godhaword.tistory.com

 

[WebHacking] SQLI(SQL Injection) 이란?(New)

네 안녕하세요. Godhaword 입니다. 원래 1주일에 하나 정도 쓸까 생각했는데 XSS 이야기 하면서 SQL Injection 이야기를 너무 비중있게 다뤘더라구요. 예전에 글을 썼던 2019년의 제가 생각하던 웹 해킹(We

godhaword.tistory.com

 

  • 이 문제로 알 수 있는 것
    - 서브쿼리 : 하나의 쿼리문 안에 또 쿼리 문이 있는 것
    - 서브쿼리를 사용할 땐 해당 서브쿼리를 괄호처리 해주어야 합니다.
    - 서브쿼리에선 order by를 쓰지 못합니다.
  • Key Point
if(조건문, 참 일때 행동, 거짓 일때 행동)

case when 조건문 then 참 일때 행동 else 거짓 일 때 행동 end

 

이 문제는 문제로 봐서 이렇게 풀었던거지, 실제로는 그냥 지나칠 수도 있었을 만한 깊이의 문제라고 생각되네요