我是靠谱客的博主 俊逸果汁,最近开发中收集的这篇文章主要介绍6位可控字符下的任意命令执行————解题思路,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前段时间的腾讯犀牛鸟,说好七字符,然后出题人忘记<号是啥意思了= =
本菜鸡通过队里的大佬和其他大佬的博客,大概摸透后将流程放在了笔记里。整理时感觉有点可惜,干脆水一篇博客,自以为已经说的很详细了
话不多说,直接上代码

<?php
show_source(__FILE__);#高亮

if(strlen($_GET[1])<7){#如果1的长度<7
	echo shell_exec($_GET[1]);#任意shell命令
}
?>

flag在上级目录的key文件夹中,此文件名叫index.php
需要知道的前置:

  1. 转义字符,在linux中具有拼接作用。
  2. sh:能以shell命令方式输出。
  3. 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位可控字符下的任意命令执行————解题思路所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部