![704fe83cc8047eb32196e16e5335d9a4.png](https://i-blog.csdnimg.cn/blog_migrate/bb117d2986a608973ef21767c37b70f2.jpeg)
![ca4f2cc288150415d565257b8605d648.png](https://i-blog.csdnimg.cn/blog_migrate/300d4c9b31a5dc13e41560f0bac90ebd.jpeg)
![f24676ad31711f1e274d3c67d0c0536a.png](https://i-blog.csdnimg.cn/blog_migrate/fb28866586503eb246f31c0bd710c97e.png)
1. 命令执行漏洞介绍
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
2. 命令执行漏洞:直接调用操作系统命令
举个例子贴出代码
![2fa36f14881caa6abcdd046fa20ee3ef.png](https://i-blog.csdnimg.cn/blog_migrate/8778e55c15f092afa494f2a8d13d82ad.png)
这里发现con_fuction里面有exec,那么exec()这个函数是干嘛的呢?
下面我给大家简单介绍一下php中的可以导致命令执行的函数
system函数----string system(string command, int [return_var]);
实例代码: $last_line = system('ls', $retval);
exec函数----string exec(string command, string [array], int [return_var]);
实例代码 :echo exec("whoami");
popen函数----int popen(string command, string mode);
实例代码
$fp = popen( "/bin/ls", "r" );
这里的函数还有很多因为我不写php,所以上面的可能不太专业
下面就是由于这个exec导致的问题了
他用了exec也就说明他能执行系统命令,那么我们尝试进行一次执行
![ed57ef2c1ea7180b5ba8ea784d6defd0.png](https://i-blog.csdnimg.cn/blog_migrate/37e489afcd35dff2016fac3903c285f0.png)
一般我们的poc都是calc,那么这就是最简单的一个命令执行漏洞了
那么我们下面为大家演示命令注入
首先在学习命令注入前我们要理解的是
1. linux管道符
2. 简单的几个linux命令
3. 绕过本地验证
那么下面我给大家介绍一下linux管道符号
网上的内容五花八门
个人觉得用处比较大的就是"&" "|"
用法大家看一下
如下时在windows执行
命令为whoami&ipconfig如果我们换一个命令呢
换成whoami|ipconfig
![2d94b9811741c18a8ed1bb6fe000361f.png](https://i-blog.csdnimg.cn/blog_migrate/b85c9f8737c12eb03f4631935de339a0.png)
这时候我们发现用"&"作为管道符的命令成功的执行了前后两个然而"|"此命令只执行了后面的ipconfig所以管道符的使用也就浮出水面
下面我们同样在linux下执行一下
![38e6eb3a0177570d6508417c20237fbe.png](https://i-blog.csdnimg.cn/blog_migrate/46e2c8aba1684ce663281bc2ef483cc4.jpeg)
我们的"&"符号是前后两个命令依次执行
而"|"符号是命令1 的正确输出作为命令2的输出对象.。
我们开始命令注入的讲解
![6e567514565342a383e1577f7456b21b.png](https://i-blog.csdnimg.cn/blog_migrate/f88d92765cc1e9c5ac8a7554d96f77cb.png)
这里是一个靶场,介绍说的是"内部人员方便运维工作留下的ping命令的页面"那么他是执行ping命令,我们就可以尝试让目标去通过管道符号去执行系统命令。
如果他的命令式ping ip 那么我可以带ping ip|任意命令,这样就可以执行系统命令
我们来尝试一下
![522b2a32a2f4b90070dbcf5178e9dd90.png](https://i-blog.csdnimg.cn/blog_migrate/5f2bde2b6ad70fe081256e8b8f75edcb.png)
这里js弹窗说ip格式不正确他有本地的js校验
我们看一下源代码
![f7c2331e51be8f0d6a4c655fb8583600.png](https://i-blog.csdnimg.cn/blog_migrate/c539bbd665932fff79a40a95936244d7.png)
其中
function f_check_IP()
{ var ip = document.getElementById('reg_ip').value;
var re=/^(d+).(d+).(d+).(d+)$/;
if(re.test(ip))
{
if( RegExp.$1<256>
return true;
}
alert("IPu683Cu5F0Fu4E0Du6B63u786E");
return false;
}
这一段js代码是为了检查怎么的ip
那么如何绕过js验证
我们可以用firefox一个插件noscript我这里不是用的noscript用的是js swith
装好插件之后我们直接点击红色js
然后刷新页面
输入127.0.0.1|whoami
![b4f05d781ba746a57f50253d26d32671.png](https://i-blog.csdnimg.cn/blog_migrate/62cc87f468accfb8b3a4a047c868d111.png)
成功执行了系统命令
我们获取flag的方式无非是那几样我们先"ls"一下
![efdfb7c7378a1b5917382739f5f9c871.png](https://i-blog.csdnimg.cn/blog_migrate/885db7e3f64a3a8043c121a63154ce2d.png)
成功回显了目标的目录内文件
我们正常的读取文件都是cat xxxx
那么我们现在尝试cat key_22112201407597.php
![34eb880f0d97da6b27ea68cafd7155b2.png](https://i-blog.csdnimg.cn/blog_migrate/8634dac7a80f242c10ca53d5f93b53ff.png)
但是这里无回显
我们发现cat key_22112201407597.php
中间存在空格,所以我断定是空格导致的问题
这里就要介绍一个Linux、里面 的空格{IFS}
在bash中IFS是内部的域分隔符
也就是空格的意思我们可以修改命令为cat{IFS}key_22112201407597.php
但是没有成功回显,一开始这个靶机执行cat{IFS}key_22112201407597.php是正常回显但是可能出了些问题,所以我们再来想办法
这里还有一个小技巧在Linux里我们执行cat
和cat xxx是一样的
举个例子
![598de68b57a66d052d6cab7fabed3b62.png](https://i-blog.csdnimg.cn/blog_migrate/d66d156f8daea21a185e4637026fd68c.jpeg)
这样也是可以的
那么我们尝试
cat
成功返回了flag
这就是一个命令注入的姿势。
3. 总结:我们在漏洞挖掘的实战过程中啊,很少会碰见这样额接口,相对于多的是某个框架和中间件的漏洞
比如strust2 weblogic jboss 我们需要在github或者exploit-db寻找exp去进行测试