指令是与电脑互动的一种方式,一般来说作业系统会包含至少一个 Shell 程序,例如 Linux 常见的 bash
、 Windows 内建的 cmd
。使用者可以在 Shell 中执行命令,藉此指挥作业系统处理任务。
这些命令可能是 Shell 自带的功能,例如 pwd
、 test
、cd
等,又或者是执行档,例如 nslookup
、 ip
、 grep
等。
有些时候,网页程序欲达成的功能早已有相当成熟的指令可以使用,如果要重新实作,除了需要开发时间之外,还可能开发出来的执行效率、稳定性皆不如现有的指令。为了避免重复造轮子,网页工程师便可能选择直接呼叫现有的指令。此时,若前端使用者的输入能够影响到指令参数,便有可能改变指令行为,甚至呼叫其他额外的指令。
工程师为了方便处理,可能会直接撰写执行外部程序的函数,若未对输入做过滤,骇客就能注入恶意指令,造成危害
在 PHP 中,下列是常被用於呼叫外部指令的方法:
system
函数exec
函数shell_exec
函数passthru
函数例如网页的 PHP 如下:
<?php
$dir = $_GET['cmd'];
system("echo ".$dir);
?>
<网址>?cmd=hello
,页面会显示 hello。此时骇客注入 <网址>?cmd=hi && ls
页面除了显示 hi
,也会显示当前目录底下的档案以 bash
为例,连接多条指令的方法:
aaa && bbb
为例,只有在 aaa
成功执行时, bbb
才会跟着被执行。 (echo 基本上都为 true) (&&
在 URL 编码中为 %26%26
)aaa || bbb
为例,只有在 aaa
执行失败时, bbb
才会跟着被执行。 (||
URL编码 %7C%7C
)aaa ; bbb
为例,无论 aaa
成功与否,都会执行 bbb
。aaa %0a bbb
为例,无论 aaa
成功与否,都会执行 bbb
。 (%0a
为 \n
)aaa %0d bbb
为例,无论 aaa
成功与否,都会执行 bbb
。 (%0d
为 \r
)此外, "$(指令)"
或 "
指令"
也会执行中间的指令 (注意,若将双引号改成单引号,例如'$(指令)'
或 '
指令'
则会将单引号中的内容视为字串)
若网页服务器是使用 Windows 作业系统,以 cmd
为例,可以使用 &&
、 ||
、 %0a
,用法与 bash
相同。
在 Windows 中的跳脱字元为 ^
,Linux 的跳脱字元为 \
,可以把特殊符号(例如 &&
或 ||
)变成一般字串处理
>>: Day17 - [丰收款] 永丰API虚拟帐户付款与PayToken查询与更新状态
VirtualBox是一套由甲骨文公司进行开发的免费中文版Virtual Machine,在虚拟机中...
原本程序的部分打算到上一篇就结束了, 不过有小夥伴问到如何在更改状态的同时<span>中...
最後一天来把天气 App 的剩余部分给完成,冲啊! 当一开始进入 App 会直接显示宜兰县在第一个时...
因为昨天安装了Firebase的资料库,那麽今天就来使用Firebase实作登入画面的操作 在Fir...
ARM技术听前辈说是包山包海,想了好久才尘埃落定,决定下笔来写写去年才发布、有Helium向量处理技...