http://chinalover.sinaapp.com/web15/index.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;
-->
Invalid password!

注意上面clean function中的htmlentities()函数,它会把输入字符中的 ’ 或者 ” 转变为html实体,这样一来就无法闭合源代码中的 ’ 了,还有就是,如果php的magic_quotes_gpc是开启状态的话,我们输入的转义符也会被去掉的,不过既然这道题目能做,说明我们是可以使用转义符 \ ,我们解这道题的关键就是使用转义符 \ 来让源代码中 

'SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';' 

$username后面的 ’ 失效,只要 这个 ’ 失效,就能闭合name=后面的 ’ ,要达到这一目的,我们只需要让username=admin \即可,让后使password的值为一个永真式(or 1=1)就可以得到这道题的flag 
这样提交的数据,会导致源代码中的SQL语句变为:

SELECT * FROM users WHERE name='admin \' AND pass=' or 1=1

注入语句?username=admin \&password=or 1=1%23 

%23是#的URL编码