信息安全学习2

本文详细解释了一段PHP代码,涉及如何通过isset()函数获取GET参数、构建模板文件路径,并使用assert()函数进行安全检查,防止路径遍历和非存在的文件访问。同时提到了payload概念,以及如何通过SQL注入尝试获取文件源代码的过程和防范措施。
摘要由CSDN通过智能技术生成

学习对象:“长城杯”信息安全铁人三项赛初赛样题 

php代码:

<?php

if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}

$file = "templates/" . $page . ".page";

assert("STRPOS('$file','..') === false") or die ("Detected hacking attempt!");

assert("file_exists('$file')") or die("That file doesn't exist");
?>

代码解释:


<?php
//<?php 是 PHP 编程语言中的一个标记,用于指示后面的内容是 PHP 代码。它是 PHP 脚本的开头标记,告诉解释器开始解析和执行 PHP 代码。

if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}
/* 
代码通过 isset($_GET['page']) 判断是否存在名为 page 的 GET 参数。如果存在,则将其赋值给变量 $page,否则将 $page 设置为字符串 "home"(即默认页面为 "home")。
*/


$file = "templates/" . $page . ".page";
/* 
将根据 $page 构建一个模板文件路径,使用字符串拼接操作符 . 将目录路径和文件名连接起来,形成完整的模板文件路径,即 "templates/" . $page . ".page",将其赋值给变量 $file。该路径指定了要加载的模板文件所在的目录和文件名。
*/

#代码通过 assert() 函数对 $file 进行两个安全检查:
assert("STRPOS('$file','..') === false") or die ("Detected hacking attempt!");
/* 
第一个 assert() 条件 "STRPOS('$file','..') === false" 用于检查 $file 中是否包含 "..",即是否尝试使用相对路径访问上层目录。如果检测到有 ".." 存在,则触发 die("Detected hacking attempt!") 终止脚本执行,并将字符串“检测到黑客攻击尝试!”作为错误信息输出给用户,即阻止了潜在的路径遍历攻击。

assert() 函数是 PHP 中的一个断言函数,用于检查给定的条件是否为真。如果条件为假,则会抛出一个 AssertionError 异常。

die() 函数是 PHP 中用于终止程序执行的函数。它有两种等效的形式:die($message) 和 exit($message),其中 $message 是可选的参数,表示要输出的错误信息。

*/

assert("file_exists('$file')") or die("That file doesn't exist");
/* 
第二个 assert() 条件 "file_exists('$file')" 用于检查 $file 指定的文件是否存在。如果文件不存在,则触发 die("That file doesn't exist") 终止脚本执行,即阻止了对不存在文件的访问。
*/

/* 
总体来说,这段代码用于根据传入的 page 参数确定要加载的模板文件,并通过一些基本的安全检查确保传入的参数不会导致路径遍历攻击,并且加载的文件存在。如果检测到异常情况,则会终止脚本执行并显示相应的错误信息。
*/

?>
//?> 是 PHP 编程语言中的一个标记,用于指示 PHP 代码块的结束。它是可选的,如果代码块后面没有其他内容,可以省略该标记。






需要注意的是,默认情况下,PHP 的断言功能是关闭的,即 assert() 函数不会生效。要使用 assert() 函数,需要在 php.ini 文件中设置 zend.assertions 的值。具体设置方式如下:

; 在 php.ini 文件中取消注释下面的配置行(删除行首的分号 ;)
zend.assertions = 1

; 根据需求设置断言的级别
assert.exception = 1   ; 抛出异常(默认)
assert.warning = 0     ; 显示警告信息
assert.quiet_eval = 1  ; 静默处理,不抛出异常或显示警告


 assert() 函数可以在开发过程中用于调试和验证条件,但在生产环境中建议关闭断言功能,以提高性能和安全性。

"payload"

在计算机安全和网络领域中,"payload"(有效载荷)指的是一段被发送到目标系统的数据或代码,旨在利用系统漏洞、执行特定操作或实现某些目的。通常情况下,payload 是攻击者利用漏洞进行攻击或者进行系统测试时使用的。

payload 的构造部分是 page='and die(show_source(templates/flag.php'))or'。它尝试通过在 SQL 查询语句中注入 and die(show_source(templates/flag.php'))or 来达到目的。

这个 payload 中的 show_source() 函数是 PHP 中的一个函数,用于显示指定文件的源代码。

攻击者使用 show_source(templates/flag.php) 来尝试显示 templates/flag.php 文件的源代码。

Detected hacking attempt  检测到黑客攻击尝试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值