BugKuCTF:web 本地包含;变量1

本地包含

文件包含漏洞:

为提高重用率,常把多次用到的代码写到一个 文件中,使用头文件方式进行代码的调用。

为了灵活,被调用的文件被命名为变量,但缺少对这个变量的限制 ,对文件名缺少合理的校验,或者校验被绕过,进而操作了意料之外的文件,导致文件泄露及恶意代码注入,从而导致用户可获取一定的服务器权限,文件包含在服务器本地则是本地包含,包含在第三方服务网站就是远程包含。

几乎所有脚本语言都会提供文件包含的功能,但文件包含漏洞在PHP中居多,而在JSP、ASP、ASP.NET程序中却非常少。

我看到的这个题是这样的,只有123,查看源码也还是123,应该是题目改动了:

                                                         

但是其他人看到的是这样的:

                                                    BugKuCTF:web 本地包含;变量1_第1张图片

@$_REQUEST 的意思是获得参数,能得到@$_GET与@$_POST的参数。所以构造hello的get参数。 

eval() 函数会把字符串参数当做代码来执行。
file() 函数把整个文件读入一个数组中,并将文件作为一个数组返回。
print_r() 函数只用于输出数组。
var_dump() 函数可以输出任何内容:输出变量的容,类型或字符串的内容,类型,长度。
hello=file(“flag.php”),最终会得到var_dump(file(“flag.php”)),以数组形式输出文件内容。
include()函数和php://input,php://filter结合很好用,php://filter可以用与读取文件源代码,结果是源代码base64编码后的结果。 

原来的题思路有三个:1)eval存在命令执行漏洞,使用hello构造payload(每一帧数据中除了头尾的原始信息

                                        2)http://120.24.86.145:8003/index.php?hello=1);include $_POST['f'];

                                              // 在POST区域:f=php://filter/convert.base64-encode/resource=flag.php

                                        3)直接将flag.php文件读入变量hello中

                                                            这种   ?hello=get_file_contents('flag.php')

                                                            或        ?hello=file('flag.php')

 

变量1

题目内容:

                                                       BugKuCTF:web 本地包含;变量1_第2张图片

涉及到的函数:

getcwd() :显示是 在哪个文件里调用此文件 的目录 绝对路径
__DIR__ :当前内容写在哪个文件就显示这个文件目录 绝对路径 
__FILE__ : 当前内容写在哪个文件就显示这个文件目录+文件名 绝对路径

error_reporting()    设置 PHP 的报错级别并返回当前级别
error_reporting(0);    //禁用错误报告
error_reporting(E_ERROR | E_WARNING | E_PARSE);    //报告运行时错误
error_reporting(E_ALL);    //报告所有错误

highlight_file() 函数对文件进行 PHP 语法高亮显示
highlight_file(filename,return)    //规定要显示的文件,
         //return,为TRUE,该函数将以字符串形式返回高亮显示的代码;默认FALSE

正则表达式匹配:	
int preg_match( string pattern, string subject [, array matches ] )
//正则表达式,需要匹配检索的对象,$matches[0] 将包含与整个模式匹配的文本,$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,即搜索到subject结尾处,则需使用 preg_match_all() 函数。

die() 函数输出一条消息,并退出当前脚本

eval() 函数把字符串按照 PHP 代码来计算
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

主要是这个匹配: preg_match("/^\w+$/",$args)

"/"表示正则表达式的定界符(边界),但是也可以是其他符号:如”#“,”!“, “|”

^xxx以什么开头     \w表示字母      xxx$表示以什么结尾

?零次或一次     *零次或多次     +一次或多次       {n}n次       {n,}至少n次        {n,m}n到m

\d	任意一个十进制数字[0-9]
\D	任意一个非十进制数字
\s	任意一个空白字符(空格、换行符、换页符、回车符、字表符)
\S	任意一个非空白字符
\w	任意一个单词字符 [a-z 0-9 A-Z]
\W	任意个非单词字符

\a	报警
\b	退格
\f	换页
\n	换行
\r	回车
\t	字表符

D+表示一个或多个D

表示agrs是:以一个或多个字母开头和结尾

eval("var_dump($$args);");      //可以看到eval的参数字符串最后已经加上了分号

$a = 'abc';
$$a = 789;     过程是$a为abc,$abc=789
echo $abc;     打印出来是789 

$$容易引起变量覆盖,$GLOBALS  引用全局作用域中可用的全部变量

这个题解析过程是$args 之后解析 $GLOBALS直接到了flag1.php中的全局变量

直接改url

http://123.206.87.240:8004/index1.php?args=GLOBALS

         BugKuCTF:web 本地包含;变量1_第3张图片

 

 

你可能感兴趣的:(web安全)