目录
一、什么是命令执行漏洞
由于开发者使用一些执行命令函数其未对用户输入的数据进行安全检查时,可注入恶意命令,实现恶意命令执行。
命令执行一般发生在远程,故称远程命令执行RCE(Remote Command Exec或Remote Code Exec)。
以PHP的syste()函数为例:
<?php
$str = $_GET['name'];
system("echo hello ".$str); //调用系统程序执行命令
?>
正常输入?name=lusong,返回的正常字符。
单输入?name=lusong%26%26ls%20/ 爆出了系统根目录(URL编码 &:%26)
即系统执行:echo hello lusong &&ls /
&&、|| 对应:adn、or(具有惰性)下面会详细讲解。
所有命令执行就是注入特殊字符,改变原本执行意图,实现执行想要的命令。
二、基础知识
1、转义字符
字面意思:改变字符的意义,即改变具有特殊作用的字符含有,让其失去特性
windows下为:^
linux下为:\
2、多条命令执行
Windows下:&&、||、%0a
linux下:&&、||、;、$()、··(反引号TAB上面的那个键)、%0a、%0d
&&:命令1 && 命令2 如果命令1执行出错则不会执行命令2
||:命令1 || 命令2 如果命令1执行成功则不会执行命令2
$()、··:功能一样,用于命令嵌套
%oa、%od:回车和换行。
3、注释符号
windows为:::
linux为:#
三、常见绕过和技巧
1、缺少空格
在代码审计中经常会对输入进行空格过滤的情况,这使得我们的注入代码缺少空格作为分隔符而执行出错。
<?php
$str = str_replace(" ","",$_GET['name']); #将空格变为空
system("echo hello ".$str); //调用系统程序执行命令
?>
空格被过滤(URL 编码:%20)我们可用采用burp suite对%00~%FF区间进行字符串测试,看有没有其他能替代。
kali下启动burp suite 设置代理
本地打开浏览器(以火狐为列)点击设置>网络设置 出现配置框:
勾选手动配置代理,输入ip和端口都输入上一步在burp suite里设置的ip 端口。
返回burp suite 下在intercept下将intercept is on 打开,表示拦截。
返回火狐浏览器输入网址后会一直处于等待中
此时返回burp suite 会看到拦截的http数据。
点击Forward 将数据转发出去。点击HTTP history 查看数据
现在我们利用burp suite对网址进行空格符号的代替符号爆破
在burp suite 处于拦截http数据下在浏览器输入:
http://192.168.198.128/ctf/?name=lusong%26%26cat%20../a.txt
然会返回 burp suite 将数据发送给 intruder模块:
点击intruder>Target,设置攻击目标(因为我这个靶场运行在kali中所有就是kali的的ip)
在Prositions 先点一下clear 标选中要进行数据爆破的字符(%20),然后点击 add按钮。
在Payloads下加载爆破文件(事先准备好)
文件内容为 %00~%FF
%00
%01
......
%FF
点击start att ack 开始运行
等待运行完后 根据返回数据的Length判断成功 如下%09
我跑完后能用的有 %09 %3C
则可用其代替%20 空格来进行命令注入
上面具体介绍了利用burp suite工具进行Fuzz。还可以直接利用字符串截取来获取空格。
windows下:%ProgramFiles% 环境变量一般为 C:\Program Files,~相当于截取符,从第十个字符开始截取一个字符 及空格
linux下一些常用的绕过空格方式
$IFS$9 ------bash有效、zsh、dash无效
{cmd,args} ------bash有效、zsh、dash无效
cat<>falg ------读取文件时,发现不能目录穿刺穿刺可用用 cat<../../../flag(刚burp suite测出来的不知道有没有其他系统怎么样)
2、黑名单关键字
对一些关键字进行拦截如 flag、cat等
2.1、利用变量拼接
2.2、使用通配符
?:一个字符
* :一个字符串
2.3、借用已有字符串
利用substr() 、awk
3、执行无回显
命令执行后不在网页上显示的情况,怎么来获取执行结果的问题,解决数据外带
利用VTest平台
3.1、HTTP通道
将执行结果拼接在URL后,实现外带
3.2、DNS通道
将执行结果数据拼接在域名前缀中
3.3、时间盲注
利用&&、||的执行惰性和一些耗时命令(如sleep)
3.4、写入文件,二次返回
将执行结果写入web目录里的文件,然后二次访问读取(权限问题:www-data没有web目录写入权限)