本文只关注命令执行,与代码执行不同
1. 命令执行漏洞介绍
当应用程序需要调用一些外部程序来处理内容时,会用到一些执行系统命令的函数,比如PHP中的system、exec、shell_exec等。当用户可以控制命令执行函数中的参数时,就可以将恶意的系统命令注入到正常命令中,造成命令执行攻击。
2.命令执行漏洞:直接调用操作系统命令
给出例子并贴出代码
这里我们发现con_fuction中有exec,那么exec()函数是起什么作用的呢?
接下来我来简单介绍一下PHP中可以导致命令执行的函数。
系统函数----字符串系统(字符串命令,int [return_var]);
示例代码:$last_line = system('ls', $retval);
exec 函数----string exec(string 命令,string [数组],int [返回变量]);
示例代码:echo exec("whoami");
popen函数----int popen(字符串命令,字符串模式);
示例代码
$fp = popen( “/bin/ls”, “r” ) ;
这里的函数比较多,由于我不写PHP,所以上面的可能不是很专业。
以下是这个exec引起的问题
他使用了exec,也就是说他可以执行系统命令,所以我们就尝试去执行一下吧。
一般我们的POC是calc,所以这是最简单的命令执行漏洞。
那么下面我们就来为大家演示一下命令注入
首先,在学习命令注入之前,我们需要了解
1.Linux 管道符号
2. 一些简单的 Linux 命令
3. 绕过本地身份验证
接下来我来向你介绍一下Linux管道符号
互联网上有各种各样的内容
我个人认为“&”和“|”更有用。
让我们看看如何使用它
在Windows中执行如下
命令是whoami&ipconfig。如果我们换个命令会怎么样?
更改为 whoami|ipconfig
这时候我们发现使用“&”作为管道符的命令成功执行了前后两个命令,而“|”命令却只执行了后面的ipconfig,因此管道符的用途也浮出水面。
接下来我们在Linux下也执行一下
我们的“&”符号表示前后两个命令按顺序执行
“|”符号是将命令1的正确输出作为命令2的输出对象。
让我们从命令注入开始
这是一个靶场,介绍上说是“内部人员为了方便运维工作而留下的ping命令页面”,所以它执行ping命令,我们可以尝试通过管道符让目标执行系统命令。
如果他的命令是ping ip,那么我可以使用ping ip|any命令来执行系统命令。
让我们尝试一下
这里js弹窗说ip格式不正确,他有本地js检查
让我们看看源代码
在
函数 f_check_IP()
{ var ip = document.getElementById('reg_ip').value;
var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
如果(重新测试(ip))
如果(正则表达式.$1
返回 true;
警报(“IP\\u683C\\u5F0F\\u4E0D\\u6B63\\u786E”);
返回 false;
这段js代码是检查ip是什么
那么如何绕过 js 验证
我们可以使用 Firefox 插件 noscript。我这里没有使用 noscript,而是使用 js switch
安装插件之后我们直接点击红色的js
然后刷新页面
输入 127.0.0.1|whoami
系统命令已成功执行
我们获取 flag 的方式无非就是这么几个,先 ls
成功回显目标目录中的文件
我们正常阅读的文件是 cat xxxx
所以现在我们尝试 cat key_227.php
但没有回音
我们找到了 cat key_227.php
中间有一个空格,所以我得出结论,问题是由空格引起的
这里要介绍的是Linux下,空间{IFS}
在 bash 中,IFS 是内部字段分隔符。
也就是说空格的意思就是我们可以将命令修改为cat{IFS}key_227.php
但是并没有回显成功,一开始目标机器执行了cat{IFS}key_227.php,回显正常,但是可能出了什么问题,我们来想个办法。
这里还有另一个技巧:在 Linux 中我们执行 cat
和 cat xxx 一样
例如
这也是可能的
让我们尝试一下
猫
成功返回 flag
这是一个命令注入的姿势。
3、总结:在实际的漏洞挖掘过程中,我们很少碰到这样的接口,大部分都是某些框架、中间件的漏洞。
例如strust2 weblogic jboss,我们需要在github或者exploit-db中找exp来测试
最后感谢大家的阅读,谢谢!!