代码如下:
<?php
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';
function clean($str){
if(get_magic_quotes_gpc()){
$str=stripslashes($str);
}
return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
die('Invalid password!');
}
echo $flag;
?>
get到username和password后进行过滤,然后再进行查询,先看看过滤函数吧。
stripslashes()
定义和用法
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
语法
stripslashes(string)例:echo stripslashes("Who\'s Bill Gates?");
运行结果:Who's Bill Gates?echo stripslashes("Who\\'s Bill Gates?");
运行结果:Who's Bill Gates?echo stripslashes("Who\\\'s Bill Gates?");
运行结果:Who\'s Bill Gates?
htmlentities()
定义和用法
htmlentities() 函数把字符转换为 HTML 实体。
例子 1
把字符转换为 HTML 实体:
<?php $str = "Bill & 'Steve'"; echo htmlentities($str, ENT_COMPAT); // 只转换双引号 echo "<br>"; echo htmlentities($str, ENT_QUOTES); // 转换双引号和单引号 echo "<br>"; echo htmlentities($str, ENT_NOQUOTES); // 不转换任何引号 ?>以上代码的 HTML 输出如下(查看源代码):
<!DOCTYPE html> <html> <body> Bill & 'Steve'<br> Bill & 'Tarzan'<br> Bill & 'Steve' </body> </html>以上代码的浏览器输出:
Bill & 'Steve' Bill & 'Steve' Bill & 'Steve'
stripslashes()禁止我们输入转义形式的字符串,htmlentities()在这里会把$str中的单引号和双引号过滤掉,有代码得到查询语句为SELECT * FROM users WHERE name='' AND pass=''。
不能闭合引号,不能输入进行转义,那我们可以转义查询语句中的单引号,构造payload:?username=\&password= or 1%23
这样查询语句变为SELECT * FROM users WHERE name='\' AND pass=' or 1%23',这样,我们注释掉了pass最后面的单引号,而name='\' AND pass=' ,这样相当于where 1,得到flag。