学习记录

linux查找命令

ls / 根目录下所有文件

ls -l 显示文件和目录的详细资料

ls -R 连同子目录的内容一起列出(递归列出),等于该目录下的所有文件都会显示出来

ls -a 列出全部文件,包含隐藏文件

ls -lSr 查看文件和目录列表(以文件大小升序查看)

ls -lh 查看文件和目录的详情列表

pwd 现实工作路径

php变量覆盖

主要是三个函数,parse_str() 、extract()、import_request_variables()

当看到这三个函数时,应当向php变量覆盖的方向思考。

1.parse_str() 函数把询字符串解析到变量中

语法
parse_str(string,array)

2.extract()函数从数组中将变量导入到当前的符号表

关于对extract()函数从数组中将变量导入到当前的符号表的解释,如下:

在PHP中,extract()函数的作用是从数组中将变量导入到当前的符号表,具体解释如下:

符号表

符号表是PHP在执行脚本时用于存储变量名和对应值的一种数据结构。它就像是一个记录所有变量信息的表格,PHP通过这个表格来查找和操作变量。

变量导入

当使用extract()函数时,它会遍历给定的数组。对于数组中的每个键值对,键会被当作变量名,值会被当作变量的值,然后将这些变量导入到当前的符号表中。这样,在当前的代码作用域内,就可以直接使用这些从数组中导入的变量名来访问相应的值,就好像这些变量是在当前作用域中通过常规的变量赋值语句定义的一样。

示例

1
2
3
4
$data = array('name' => 'John', 'age' => 30);
extract($data);
echo $name; // 输出 John
echo $age; // 输出 30

在上述示例中,extract()函数将$data数组中的变量导入到当前符号表,之后便可以直接使用$name和$age变量。

语法
extract(array,extract_rules,prefix)
第一个参数为指定的数组,第二个为创建变量的规则,第三个为需要增加的前缀。

[!CAUTION]

1.array 必需。规定要使用的数组。
2.extract_rules 可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突。对不合法和冲突的键名的处理将根据此参数决定。
可能的值:

EXTR_OVERWRITE - 默认。如果有冲突,则覆盖已有的变量。
​ EXTR_SKIP - 如果有冲突,不覆盖已有的变量。
​ EXTR_PREFIX_SAME - 如果有冲突,在变量名前加上前缀 prefix。
​ EXTR_PREFIX_ALL - 给所有变量名加上前缀 prefix。
​ EXTR_PREFIX_INVALID - 仅在不合法或数字变量名前加上前缀 prefix。
​ EXTR_IF_EXISTS - 仅在当前符号表中已有同名变量时,覆盖它们的值。其它的都不处理。
​ EXTR_PREFIX_IF_EXISTS - 仅在当前符号表中已有同名变量时,建立附加了前缀的变量名,其它的都不处理。 EXTR_REFS - 将变量作为引用提取。导入的变量仍然引用了数组参数的值。
3.prefix 可选。如果 extract_rules 参数的值是 EXTR_PREFIX_SAME、EXTR_PREFIX_ALL、 EXTR_PREFIX_INVALID 或 EXTR_PREFIX_IF_EXISTS,则 prefix 是必需的。该参数规定了前缀。前缀和数组键名之间会自动加上一个下划线。

3.import_request_variables()函数将 GET/POST/Cookie 变量导入到全局作用域中。该函数在最新版本的 PHP 中已经不支持。

[!CAUTION]

版本要求:PHP 4 >= 4.1.0, PHP 5 < 5.4.0

语法
bool import_request_variables ( string $types [, string $prefix ] )返回bool型结果。

[!CAUTION]

$types:

​ 指定需要导入的变量,可以用字母 G、P 和 C 分别表示 GET、POST 和 Cookie,这些字母不区分大小写,所以你可以使用 g 、 p 和 c 的任何组合。POST 包含了通过 POST 方法上传的文件信息。注意这些字母的顺序,当使用 gp 时,POST 变量将使用相同的名字覆盖 GET 变量。任何 GPC 以外的字母都将被忽略。
$prefix:

​ 变量名的前缀,置于所有被导入到全局作用域的变量之前。所以如果有个名为 userid 的 GET 变量,同时提供了 pref_ 作为前缀,那么将获得一个名为 $pref_userid 的全局变量。

​ 虽然 prefix 参数是可选的,但如果不指定前缀,或者指定一个空字符串作为前缀,将获得一个 E_NOTICE 级别的错误。

一些php绕过

1.无字母数字REC

p

在输入payload时,需要知道这个:

1
2
<?
("phpinfo")();#动态函数调用,在第一个括号里输入函数名,第二个里输入参数

因为不能输入字母或数字,而在PHP中可以使用异或取反来达到目的,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
<?php
$a="ls";

for($i=0;$i<strlen($a);$i++){
echo"%".dechex(ord($a[$i])^0xff);
}
echo"^";
for($i=0;$i<strlen($a);$i++){
echo"%ff";
}
?> #xor生成命令
1
2
3
4
5
6
7
8
<?php
$a=""; #此处输入命令
echo"~(";
for($i=0;$i<strlen($a);$i++){
echo"%".bin2hex(~$a[$i];)
}
echo")";
?> #~生成命令

2.巨多条件过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
error_reporting(0);
//flag.php
if(isset($_GET['code']))
{
$code = $_GET['code'];
if(strlen($code) > 18)
{
die("You really long, but i dont like more than 18");
}
if(preg_match("/\w/", $code))
{
die("i dislike it");
}

if(preg_match("/&|\||\^|\~|\!/", $code))
{
die("stop calculating");
}

if(preg_match("/\(|\)", $code))
{
die("call function is not safe");
}

if(preg_match("/\{|\}|\[|\]/", $code))
{
die("fxcking brackets");
}

if(preg_match("/\\$|@|\./", $code))
{
die("$1 dou bu gei wo");
}

eval($code);//I believe that those noob hackers cannot hack me.
}else {
show_source(__FILE__);
}

答案如下:

p

解释

p

所有能够把所有的文件都检索出来……..


学习记录
http://example.com/2024/11/15/学习记录/
作者
John Doe
发布于
2024年11月15日
许可协议