extract变量覆盖
<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>
extract() 函数从数组中将变量导入到当前的符号表。
该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
这里是默认覆盖
$_GET的变量是 $
f
l
a
g
flag
flag 和 $
s
h
i
y
a
n
shiyan
shiyan,所以flag会覆盖原本flag内容
则设flag为空或其他
strcmp比较字符串
<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}
?>
strcmp函数需要传入字符串,数组不是字符串,所以用数组绕过
urldecode二次编码绕过
int eregi(string pattern, string string, [array regs]);
定义和用法
eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。Eregi()可以特别有用的检查有效性字符串
如果匹配成功返回true,否则,则返回false
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("
not allowed!
");
exit();
}
$_GET[id] = urldecode($_GET[id]);//输入是先把id编码了,现在再解码一次
if($_GET[id] == "hackerDJ")//解码后相等
{
echo "
Access granted!
";
echo "
flag
";
}
?>
所以输入编码后的id这样在第一个if不相等,解码后又相等了
不知道为什么在线编码hackerDJ不行,所以对着编码表,手动编码
http://123.206.87.240:9009/10.php?id=%68%61%63%6b%65%72%44%4a
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 if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>
username不能等于password,都是两个md5加密后相等,若正常md5加密,不能做到,md5需要传入字符串,所以传入数组,两个结果都返回false,则相等
数组返回NULL绕过
<?php
$flag = "flag";
if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>
ereg(mode, string subject, array regs);
mode:正则表达式(preg_match中的mode必须以’/'开始和“/”结束)
subject: 需要验证的字符串
matchs/regs: 匹配后得到的结果。以数组的形式存储
strpos的语法
strpos(string,find,start)
string: 必需。规定被搜索的字符串。
find :必需。规定要查找的字符。
start: 可选。规定开始搜索的位置。
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。
^ [a-zA-Z0-9]+$
^限定开头
[a-zA-Z0-9]
匹配大写小写字母和数字其中一个字符
+
表示前面的匹配重复一到多次
$
结束符
题目要让password仅由大小写字母和数字又要包含符号’–‘时才有flag,是矛盾的,继续用数组处理,ereg和strpos都不能处理数组,所以
得到flag
弱类型整数大小比较绕过
$temp = $_GET['password'];
is_numeric($temp)?die("no numeric"):NULL;//判断变量temp是不是数字,die() 函数输出一条消息,并退出当前脚本
if($temp>1336){
echo $flag;
is_numeric判断是不是数字,是的话输出语句退出脚本,不是的话变量temp大于1336则输出flag
这也是一个矛盾
但是is_numeric()函数是弱类型,会把char型转换为int型比较
得到flag
sha()函数比较绕过
<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
var_dump($_GET['name']);
echo "
";
var_dump($_GET['password']);
var_dump(sha1($_GET['name']));
var_dump(sha1($_GET['password']));
if ($_GET['name'] == $_GET['password'])
echo '
Your password can not be your name!
';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '
Invalid password.
';
}
else
echo '
Login first!
';
?>
var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
这题就是name不等于password,但是这两个经过sha1()运算后相等,矛盾,又sha1函数不能处理数组
所以