概述
前段时间的腾讯犀牛鸟,说好七字符,然后出题人忘记<号是啥意思了= =
本菜鸡通过队里的大佬和其他大佬的博客,大概摸透后将流程放在了笔记里。整理时感觉有点可惜,干脆水一篇博客,自以为已经说的很详细了
话不多说,直接上代码
<?php
show_source(__FILE__);#高亮
if(strlen($_GET[1])<7){#如果1的长度<7
echo shell_exec($_GET[1]);#任意shell命令
}
?>
flag在上级目录的key文件夹中,此文件名叫index.php
需要知道的前置:
- 转义字符,在linux中具有拼接作用。
- sh:能以shell命令方式输出。
- shell命令中,>直接接字符,就是创建一个文件 >a 创建一个名字为a的空文件夹
光知道这些没法做文章。回头想想,既然 >a是创建一个空文件夹,那么我ls>a 会怎样?
答案是将ls的结果赋给a
所以,如果a中具有一句查看key的命令,就能sh a 直接获得flag。
因此构造句子:
合起来就是cat …/key。有些特殊字符需要转义
理论上是可行的,但是 . .,./,/,. .这四个在linux中,有着特殊的含义,是无法被我们直接>出来的
另:如果在web上需要记得打>,而脚本则需要在最后多加个来转义转义符
而且,按顺序写的句子全被打乱了。因为linux在ls的时候将文件排序。
而且index.php也被排序,成为了我们组成句子的阻碍。
这时就要百度一下ls的命令,看看有没有关于排序的命令。
最后找到了ls -t,这个命令可以将创建的文件从新到旧进行排序
但是ls -t这个命令就占用了5字节,即便再怎么省,也得用7字节 ls -t>a才能写入。
顺一遍流程,既然是因为字节太少而选择拼接指令句子。那我们可不可以拼接一个ls -t>b,放入a中执行?
尝试拼接句子:
查看一下,是>b index.php ls -t 的排版。
只要想办法把>b挪到最后,就可以了。
要是能直接挪,就没有这个博客了= =
换个思维,如果把这句话重复写入两次,不也能达到一样的效果么?
因此直接 ls>a , ls>>a写上两次,变成>b index.php ls -t >b index.php ls -t
其他字符因为错误而被丢弃,中间的ls -t >b却会被正确执行。
既然有了ls -t>b , 剩下的问题就是怎么写进句子了。
立刻想到绕过,最先想到的就是转码绕过,之后的问题就是shell解密了
百度一下,base64 -d能解密,在自己主机中实验,大致了解构造后,即可构造这样的句子:echo PD9waHAgc3lzdGVtKGNhdCAuLi9rZXkpOz8+ | base64 -d
注意反着写。写完就能sh a ,sh b查看到flag了。(不想再做一遍了)
考点:>运用方法, sh命令,转义字符的拼接作用,对ls -t>b的处理,生成排序问题。
最后
以上就是俊逸果汁为你收集整理的6位可控字符下的任意命令执行————解题思路的全部内容,希望文章能够帮你解决6位可控字符下的任意命令执行————解题思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复