绕过php is_numeric()函数是可以的吗?

时间:2013-06-29 14:35:57

标签: php sql code-injection numeric

我目前正在寻找一个通过(不是盲目)类别sql注入应用程序dvwa的高级别。

即使有一些让生活更轻松的想法和工具,也无法找到解决方案。

粉丝的源代码表格如下:


if (isset($_GET['Submit'])) {
    // Retrieve data

    $id = $_GET['id'];     
    $id = stripslashes($id);      
    $id = mysql_real_escape_string($id);   

    if (is_numeric($id)){

        $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
        $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

        $num = mysql_numrows($result);

        $i=0;

        while ($i < $num) {

            $first = mysql_result($result,$i,"first_name");
            $last = mysql_result($result,$i,"last_name");

            echo '<pre>';
            echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
            echo '</pre>';

            $i++;
        }
    }
}

和任务并检索具有此结构的用户表dvwa db中的值:

+------------+-------------+------+-----+---------+
| Field      | Type        | Null | Key | Default |
+------------+-------------+------+-----+---------+
| user_id    | int(6)      | NO   | PRI | 0       |
| first_name | varchar(15) | YES  |     | NULL    |
| last_name  | varchar(15) | YES  |     | NULL    |
| user       | varchar(15) | YES  |     | NULL    |
| password   | varchar(32) | YES  |     | NULL    |
| avatar     | varchar(70) | YES  |     | NULL    |
+------------+-------------+------+-----+---------+
6 rows in set (0.00 sec)

当然,你会说(正如我在网上到处看到的那样)是编码字符。据我所知,是的,我们有更多的字符集,可以用不同的方式写电子邮件(例如多字节)。 但我甚至找不到你。我理解上面的php表单代码:

首先必须绕过mysql_real_escape_string(),所以我的研究首次集中在那里。 使用一个游戏big5字符,例如意味着我们绕过它...再次是的,也许我看到Tenai的道路,但我没有实际测试。为什么呢?

假设我绕过mysql_real_escape_string(),如果我们继续阅读php代码执行的下一步,我们可以阅读该函数:

if(is_numeric($id))...

检查变量的类型。 (此外,我不知道我是否使用了确切的术语但是很好)。这意味着如果我想在这里插入一个引号,它必须是强制的numérique.Donc大小我倾向于着名的php函数,我意识到我们可以输入相同的二进制或十六进制值(但在所有情况下它都会在我之后转换输出的功能,现在我真的不知道....)。所以我的输入 第一个想法是让0x27插入一个引号,但当然这个值被解释为整数而不是字符串类型输出,所以如何解释我的引用...我认为这个问题就在这一边但是我想到了一点思考。 ..如果你只有一个曲目(除了告诉我在google中查看,我现在已经做了四天了^ ^),我很感兴趣。那些家伙(或女孩),威尔绰号大师Sqli? 谢谢你的时间......(对不起谷歌翻译)

1 个答案:

答案 0 :(得分:-3)

为什么在不推荐使用mysql库时呢?请改用mysqli

其次,如果你想摆脱任何sql注入的危险,那么 很多 更容易使用预备语句,所以类似下面的内容就是这样需要。

$stmt = $mysqli->prepare("SELECT first_name, last_name FROM users WHERE user_id = ?")
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($res);
$stmt->fetch();
if($res)
    ...

顺便说一句,mysqli可以用于与mysql非常相似的功能(非oop)风格。